从PAT部分读取信息(MPEG-TS)

Sta*_*iev 3 c++ parsing mpeg packet mpeg2-ts

我正在写一个MPEG-TS文件解析器,我一直在从PAT部分获取program_numbers和PID.我正在使用数据包分析器来比较我的结果.

例如,这是一个PAT数据包

47 40 00 16 00 00 B0 31 00 14 D7 00 00 00 00 E0
10 00 01 E0 24 00 02 E0 25 00 03 E0 30 00 04 E0
31 00 1A E0 67 00 1C E0 6F 43 9D E3 F1 43 A3 E3
F7 43 AC E4 00 C3 69 A6 D8 FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF 
Run Code Online (Sandbox Code Playgroud)

首先,我开始将分析器的结果与字节进行比较以查看连接.它按以下方式配对字节:[0010] [01 24] [02 25] [03 30]等我注意到一个模式(对于i = 14; i <end; i + = 4)但很快就出错了,因为在"0x6F"字节之后,它开始读取16位而不是8位,因此program_number为0x439D.

我很困惑,我希望有人可以向我解释如何从上面解析示例PAT.

Ian*_*ook 6

每个program_number都是16位,后跟16位,由3 x'1'位和13位program_map_pid(或network_pid ifprogram_number` = 0)组成

从转储中的偏移量13开始,读取16位字对,屏蔽第二个字的前3位.

例如

offset   bytes          words        program_number pid
======   ===========    =========    ============== ======================
000D:    00 00 E0 10 => 0000 E010 => 0000           0010 (network_pid)
0011:    00 01 E0 24 => 0001 E024 => 0001           0024 (program_map_pid)
0015:    00 02 E0 25 => 0002 E025 => 0002           0025 (program_map_pid)
0019:    etc..
001D:    etc..
0021:    etc..
0025:    00 1C E0 6F => 001C E06F => 001C           006F (program_map_pid)
0029:    43 9D E3 F1 => 439D E3F1 => 439D           03F1 (program_map_pid)
002D:    etc..
etc..
Run Code Online (Sandbox Code Playgroud)

理论上它比这更复杂,因为PAT中可以有多个程序关联部分,上面只对第一部分有帮助.

有关详细信息,请参阅ISO/IEC 13818-1的2.4.4.3节,特别是表2-25.