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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值