从 PAT 部分 (MPEG-TS) 读取信息
Reading information from PAT section (MPEG-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
首先,我开始将分析器的结果与字节进行比较以查看连接。它按以下方式对字节进行配对:[00 10][01 24][02 25][03 30] 等。我注意到一个模式(对于 i = 14;i < end;i+=4),但很快就出错了,因为在“0x6F”字节之后它开始读取 16 位,而不是 8 位,所以 program_number 是 0x439D。
我很困惑,我希望有人能向我解释如何从上面解析示例 PAT。
每个 program_number
是 16 位,后面跟着 16 位,包括 3 x '1' 位和一个 13 位 program_map_pid
(或 network_pid if
program_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..
理论上它比这更复杂,因为 PAT 中可以有多个程序关联部分,而以上内容仅对第 1 部分有帮助。
有关详细信息,请参阅 ISO/IEC 13818-1 的第 2.4.4.3 节,特别是 table 2-25。
我正在编写一个 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
首先,我开始将分析器的结果与字节进行比较以查看连接。它按以下方式对字节进行配对:[00 10][01 24][02 25][03 30] 等。我注意到一个模式(对于 i = 14;i < end;i+=4),但很快就出错了,因为在“0x6F”字节之后它开始读取 16 位,而不是 8 位,所以 program_number 是 0x439D。
我很困惑,我希望有人能向我解释如何从上面解析示例 PAT。
每个 program_number
是 16 位,后面跟着 16 位,包括 3 x '1' 位和一个 13 位 program_map_pid
(或 network_pid if
program_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..
理论上它比这更复杂,因为 PAT 中可以有多个程序关联部分,而以上内容仅对第 1 部分有帮助。
有关详细信息,请参阅 ISO/IEC 13818-1 的第 2.4.4.3 节,特别是 table 2-25。