我试图用C语言编写一些代码,将MPEG2传输流分解为基本流。我使用ffmpeg来比较从代码生成的输出。除了一种情况外,我的程序的输出流基本上与ffmpeg是位精确的。ffmpeg在有效负载开始时(在PES头和PES填充字节结束后)从比特流中提取字节0xff,而我将其排除在PES填充字节之外。
我的问题是:PES数据包变量中填充字节(0xff)的长度还是在PES报头中编码的?
注意:我从PES数据包读取有效负载数据的方式是,我基本上跳过所有初始的0xff,直到找到一个不是0xff的字节,然后从那里读取到数据包的末尾

最佳答案

H.222.0 (03/17)(第37页,表2-21)定义了通过stuffing_byte计算的PES_header_data_length序列的长度,其定义为(emphasis mine)
一个8位字段,指定
可选字段和此PES数据包头中包含的任何填充字节。可选字段的存在在
位于PES_header_data_length字段前面的字节。
因此,在读取PES报头时,需要注意所有可选字段(例如PTS_DTS_flagsESCR_flagES_rate_flag和所有其他内容的各种组合),并从PES_header_data_length中声明的长度中减去这些可选字段的长度。一旦处理完所有可选字段,并且剩余的长度n仍然不为零,这意味着在有效负载到来之前仍有n个填充字节要读取。

关于c - MPEG2传输流PES填充字节长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55425190/

10-11 18:49