如何跳过h.264 P帧直到下一帧

时间:2011-05-17 06:52:41

标签: video h.264

我通过RTP / UDP接收h.264流(基线配置文件), 并且当它们发送到解码器时,如果发生(P)帧丢失, 我想跳帧直到下一帧收到。 如何检测帧丢失? H.264规范对我来说太困惑了..

3 个答案:

答案 0 :(得分:2)

从切片标头中,使用 frame_num (解码顺序)参数以及 TopFieldPictureCount BottomFieldPictureCount 。后两者统称为图片订单计数 POC )。 POC 确定显示顺序。

假设您的GOP显示顺序如下:IBBPBBPBBP ...这将是 POC 参数的序列。相应的解码顺序为IPBBPBBPBB ...注意,您需要解码第一个I和P才能解码前2个B帧。类似地,您需要解码第二个P帧,以便(与第一个P帧一起)解码第二个B帧。

有了这个,我会使用 POC 参数来确保我的帧已被正确解码。如果你事先知道你的GOP,你可以确保你使用上面的GOP作为例子接收帧3,6,9等,其中I帧是帧0.如果GOP是未知的,你解码一个几帧,并从 POC 模式确定GOP。例如,上面的GOP将具有0,3,1,2,6,4,5,9,7,8的实时 POC ...或者,切片头可以告诉你你正在处理什么样的帧。

答案 1 :(得分:1)

我的第一直觉是你的解码器应该能够从丢失的P帧中恢复,但万一你的解码器库不能......

我的第一个猜测是slice_header()的frame_num字段。

slice_header的语法记录在ISO 14496-10的7.3.3节中。

frame_num的定义从我的副本的第88页开始,并继续大约一页(因此,如果你想要处理所有视频,解释起来并非易事。)

在扫描文档其余部分中对frame_num的引用时,我还注意到gap_in_frame_num_value_allowed_flag(在SPS中,第7.3.2.1节),它使得frame_num在一般情况下变得复杂。

答案 2 :(得分:0)

查看RTP标头。 Wireshark“Decode as ...”RTP功能非常适用于此目的。较长的帧是I帧,较短的帧是P帧或B帧。