3

我在 PES 解复用器中检测到新的 PES 数据包,搜索 packet_start_code_prefix (0x000001)。当它发生时,我可以读取 PES_packet_length,因此我可以从字节流中提取当前的 PES 数据包。但如果是 H.264 视频流,则 PES_packet_length=0。

在这种情况下如何提取PES数据包?0x000001 也可能出现在 H.264 最终单元字节流中,因此我不能使用此前缀来查找下一个 PES 数据包。

我注意到,在每个 H.264 PES 数据包中,PES 数据包中的最后一个最终单元是一个填充数据(nal_unit_type=12)。我是否需要使用这个事实来检测当前 PES 数据包的结束?

4

1 回答 1

9

通常不会,如果不知道 PES 数据包的长度,这是不可能的。但是,由于您将自己限制为 H.264,我们可以利用一个幸运的意外。

h.264 stream_id 是 0xE0。nalu 的第一位始终为 0。因此 000001E0 在附件 B 流中恰好是非法的。您仍然必须解析 PES 标头以确定其长度,因为 PES 标头之后的第一个字节可能是前一个 NALU 的尾部,因此不一定是附件 b 起始码。

留此为后人。您不能简单地查找起始码,您需要解析数据包。如果这是一个传输流,您可以通过寻找有效载荷单元开始指示符来找到 PES 的开始。如果存在,则解析适应字段。现在您将拥有您的起始代码(在这种情况下为 000001E0。然后查看标志。解析出 33 位 PTS/DTS(播放时需要它)并跳过任何可选字段(由 PES 标头中的标志确定) ). 您现在将拥有 h.264 ES 的开头。继续解析 TS。对于具有相同 PID 和有效负载单元开始指示符 = false 的每个 TS,您正在读取帧。一旦有效负载单元开始指示符为真,你有一个新的 PES 打包机/框架。

于 2014-01-29T17:42:42.247 回答