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

时间:2015-07-04 12:57:13

标签: c++ parsing packet mpeg 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 

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

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

1 个答案:

答案 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。