2011-05-17 140 views
2

我通過RTP/UDP接收h.264流(基線配置文件), 並將它們發送給解碼器時,如果發生(P)幀丟失,我想跳過直到下一幀收到幀。 如何檢測幀丟失? H.264規範太困惑了。 任何建議將受到歡迎。如何跳過h.264 P幀直到下一個I幀

回答

1

我的第一直覺是你的解碼器應該能夠從丟失的P幀中恢復,但如果你的解碼庫不能...

我的第一個猜測將是slice_header的領域的frame_num() 。

slice_header的語法記錄在ISO 14496-10的7.3.3節中。

frame_num的定義從我的副本的第88頁開始,繼續進行大約一頁(因此,如果要處理全部視頻,解釋它並不是微不足道的)。

在掃描文檔其餘部分對frame_num的引用時,我還注意到有一個gaps_in_frame_num_value_allowed_flag(在SPS中,第7.3.2.1節),使frame_num在一般情況下變得複雜。

2

從切片報頭中,使用的frame_num(解碼順序)參數以及所述TopFieldPictureCountBottomFieldPictureCount。後兩者統稱爲圖片訂購數量POC)。 POC確定顯示順序。

假設您的GOP的顯示順序如下:IBBPBBPBBP ...這將是您的POC參數的順序。相應的解碼順序將爲IPBBPBBPBB ...注意,您需要解碼第一個I和P以解碼前2個B幀。同樣,您需要解碼第二個P幀,以便(連同第一個P幀)解碼第二個2個B幀。因此,我將使用POC參數來確保我的幀已被正確解碼。如果事先知道你的GOP,你可以使用上面的GOP來確保你正在接收幀3,6,9等,其中I幀是0幀。如果GOP是未知的,你解碼一個幾幀,並從POC模式確定GOP。例如,上述GOP將具有0,3,1,2,6,4,5,9,7,8,...的實時POC。或者,片頭可精確地告訴你什麼幀你正在處理。

0

翻閱RTP標題。 Wireshark「解碼爲...」RTP功能對此非常有用。較長的幀是I幀,較短的幀是P幀或B幀。