解析流程如下: 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();}
新闻热点
疑难解答