我在PES解复用器中检测到新的PES包,搜索packet_start_code_prefix(0x000001)。当它发生时,我可以读取PES_packet_length,因此我可以从字节流中提取当前的PES包。但如果它是H.264视频流,那么PES_packet_length = 0。
在这种情况下如何提取PES包?在H.264 nal单位字节流中也可能出现0x000001,因此我无法使用此前缀来查找下一个PES包。
我注意到在每个H.264 PES数据包中,PES数据包中的最后一个单位是填充数据(nal_unit_type = 12)。我是否需要使用此事实来检测当前PES数据包的结束?
答案 0 :(得分:9)
通常不会,如果不知道PES数据包的长度,这是不可能的。但是,因为你限制自己使用H.264,我们可以利用幸运的意外。
h.264 stream_id是0xE0。 nalu的第一位始终为0.因此000001E0在附件B Stream中恰好是非法的。您仍然必须解析PES头以确定其长度,因为PES头之后的第一个字节可能是前一个NALU的尾部,因此可能不一定是附件b起始码。
为后代保留这个。 您不能简单地查找起始码,需要解析数据包。如果这是传输流您可以通过查找有效负载单元启动指示符来找到PES的起点。然后解析自适应字段(如果存在)。现在你将得到你的起始代码(在这种情况下为000001E0。然后看看标志。解析33位PTS / DTS(你需要播放)并跳过任何可选字段(由PES标题中的标志确定)你现在将启动你的h.264 ES。继续解析TS。对于每个具有相同PID和有效负载单位的TS开始指示符= false,你正在读取帧。一旦有效载荷单位开始指示符为真,你有一个新的PES包装机/框架。