TS的解析流程
解析流程
解析流程如下:
1、读取一个TS包,注意Packet重载了>>操作符
2、如果TS包的PID等于0,表示TS包中装的是PAT
(1)从TS包中把PAT读取出来,PAT也重载了>>操作符
(2)把PAT中的program读取出来
(3)遍历所有的program
(4)如果program的节目编码不等于0,那么表示该program中存放的是PMT或者NIT的信息,那么把PMT的PID记录下来
3、如果TS包的PID等于已经记录的一个PMT的PID,那么表示该TS包中装的是PMT
(1)从TS包中把PMT读取出来,PMT也重载了>>操作符
(2)把PMT中的stream读取出来,stream可以理解为数据的信息
(3)遍历所有的stream,得到数据的类型和它的PID
代码实现
int main()
{
bool foundPAT = false;
bool foundPMT = false;
int pmtPID = -1;
Packet packet;
while (true)
{
// 读取一个TS包
cin >> packet;
// 如果TS包完整
if (packet.good)
{
// 如果PID等于0,表示是PAT
if (packet.getPid() == 0 && packet.getPayloadStart())
{
PAT pat;
// 从TS包中读取PAT
pat << packet;
// 判断PAT是否完整
if (pat.good)
{
if (!foundPAT)
{
cout << "--- Found PAT (pid: " << packet.getPid() << ")\n";
foundPAT = true;
}
// 得到PAT中的节目信息
vector<PAT::Program> programs = pat.getPrograms();
// 遍历所有的节目
for (vector<PAT::Program>::iterator it = programs.begin(); it
< programs.end(); it++)
{
cout << " Program Number: "
<< (*it).getProgramNumber() << ", PID: "
<< (*it).getPid() << endl;
// 如果节目的编号不等于0,表示节目中存放了PMT或者NIT的信息
if ((*it).getProgramNumber() != 0)
{
// ignore NIT
// 表示是一个PMT或者NIT(没有实现)
pmtPID = (*it).getPid();
}
}
}
}
// 如果该TS包中装的是PMT
else if (packet.getPid() == pmtPID && packet.getPayloadStart())
{
PMT pmt;
// 从TS包中读取一个PMT
pmt << packet;
// 判断PMT是否完整
if (pmt.good)
{
if (!foundPMT)
{
cout << "--- Found PMT (pid: " << packet.getPid() << ")\n";
foundPMT = true;
// 获取PMT中的stream,stream可以理解为流数据的信息(例如:视频数据、音频数据的信息)
vector<PMT::Stream> streams = pmt.getStreams();
// 遍历所有的stream
for (vector<PMT::Stream>::iterator it = streams.begin(); it
< streams.end(); it++)
{
cout << " Stream type: "
<< (*it).getStreamType() << ", PID: "
<< (*it).getElementaryPid() << endl;
}
break;
}
}
}
}
else if (cin.fail())
{
break;
}
else
{
// cerr << "WARN: sync not implemented yet!" << endl;
}
}
cout.flush();
}