我正在编写一个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
首先,我开始将分析器的结果与字节进行比较,以查看连接。它以下列方式配对字节:[0010] [01 24] [02 25] [03 30]等我注意到一个模式(对于i = 14; i< end; i + = 4)但很快就出错了因为" 0x6F"字节开始读取16位而不是8位,因此program_number为0x439D。
我非常困惑,我希望有人可以向我解释如何从上面解析示例PAT。
答案 0 :(得分:6)
每个program_number
为16位,后跟16位,由3 x'1'位和13位program_map_pid
组成(或network_pid if
program_number = 0)
从转储中的偏移量13开始,读取16位字对,屏蔽第二个字的前3位。
e.g。
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..
理论上它比这更复杂,因为PAT中可以有多个程序关联部分,上面只对第一部分有帮助。
有关详细信息,请参阅ISO / IEC 13818-1的2.4.4.3节,特别是表2-25。