我正在尝试用C编写一些代码,以将MPEG2传输流解复用为基本流。我正在使用ffmpeg比较我从代码生成的输出。我的程序的输出流基本上与ffmpeg完全一样,除了一种情况。 ffmpeg似乎是在有效负载的开头(在PES标头和PES填充字节的末尾之后)从比特流中提取字节0xff的,而我将其排除为PES填充字节。
我的问题是:PES数据包变量中的填充字节(0xff)的长度还是在PES标头中也进行了编码?
注意:我从PES数据包读取有效载荷数据的方式是,基本上跳过所有初始的0xff,直到遇到非0xff的字节,然后从那里读取数据包的末尾为止
答案 0 :(得分:2)
H.222.0 (03/17)(第2页,第37页,表2-21)定义了stuffing_byte
序列的长度,该序列是通过PES_header_data_length
来计算的,其定义为(强调矿井)
一个8位字段,用于指定该字段占用的字节总数。 此PES数据包标头中包含的可选字段和任何填充字节。可选字段的存在在 PES_header_data_length字段之前的字节。
因此,在阅读PES标头时,请注意所有可选字段(例如PTS_DTS_flags
,ESCR_flag
,ES_rate_flag
的各种组合,以及所有其他东西),然后从PES_header_data_length
中声明的长度中减去这些可选字段的长度。处理完所有可选字段后,剩余长度n
仍不为零,这意味着在有效负载出现之前,仍有n
个填充字节要读取。