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