首页 > 学院 > 开发设计 > 正文

MPEG-2 TS学习(六)tsfilter源码阅读(3)TS的解析流程

2019-11-06 09:30:13
字体:
来源:转载
供稿:网友

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();}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表