2013-02-22 46 views
1

我從IP攝像頭處理H.264 RTP流。我使用的相機將每個I幀分成幾個NAL單元,每個單元都被分成RTP包(開始和結束標誌確定每個單元的尺寸,而不是幀的尺寸)。確定RTP流中H.264 I幀的末端

我怎麼能知道幀傳輸何時完成,並且我有足夠的數據來解壓縮它?由於幀由多個單元組成 - 標誌不能用於確定其結束。

我工作的大多數攝像機將每幀分割爲RTP包,其中標誌確定幀的開始和結束。所以我從這個等待結束標誌的數據包中解壓縮數據 - 這裏是一個完整的框架。

NAL單元,我從這個攝像頭獲取的順序是:

[NAL_UT_SPS]序列參數集+

[NAL_UT_PPS]圖片參數集

[NAL_UT_SEI補充增強信息

[NAL_UT_IDR_SLICE] I幀圖像數據的部件#1

[NAL_UT_IDR_SLICE]部分#2 e口幀圖象數據

[NAL_UT_IDR_SLICE]零件編號的I幀的3圖象數據

[NAL_UT_SLICE]第一P幀

[NAL_UT_SLICE]第二P幀

[ NAL_UT_SLICE]第三P幀

...

從該序列很明顯,我可以結合[NAL_UT_SPS] + [NAL_UT_PPS] + [NAL_UT_SEI] + 3 * [NAL_U T_IDR_SLICE]合併爲一個I幀,我將最近饋送給解碼器。但是,我怎樣才能確定有多少圖片數據部分?我如何知道何時收到#X部分它不是序列中的最後一個?

任何想法?

回答

0

大多數H.264解碼器接受輸入流作爲NAL。除非你有挑剔的解碼器 - 我只是將NAL送入解碼器。通常,NAL:幀或者甚至是片段之間不存在1:1關係的保證。

+0

謝謝您的回答。實際上,我強烈需要將NAL單元組合到相應的框架中。我需要的是關於如何確定幀中最後一個NAL單元的一些信息。我從這臺相機獲得的數據在上面編輯的問題中。 – paft 2013-02-25 06:18:49

2

我解決了這個問題。

的解決方案是:附加到幀的開始的所有非圖象單元(NAL_UT_SPS,NAL_UT_PPS,NAL_UT_SEI在上面的例子)和用於容納圖像信息包(NAL_UT_IDR_SLICE,NAL_UT_SLICE)檢查first_mb_in_slice字段(其對於第一片圖片數據等於0,對於第二,第三等不等)。

因此,如果first_mb_in_slice == 0並且緩衝區包含圖片數據,然後返回它並寫入新的幀數據到緩衝區,否則只附加數據而不返回幀。這樣,當我們開始接收幀#2並且可以確定是新幀時,我們返回幀#1,而不是前一幀的一部分:

[NAL_UT_SPS]幀#1(I)開始

[NAL_UT_PPS]的幀#1繼續

[NAL_UT_SEI]的幀#1繼續

[NAL_UT_IDR_SLICE]幀#1的圖像數據,部分#1:first_mb_in_slice == 0

[NAL_UT_IDR_SLICE]幀#1圖片數據,部件#2:first_mb_in_slice> 0

[NAL_UT_IDR_SLICE]幀#1的圖像數據,部分#3:first_mb_in_slice> 0

[NAL_UT_SLICE]的幀#2(P)開始:first_mb_in_slice == 0 < - 在這一點,我們將返回第一幀

[NAL_UT_SLICE]幀#3(P)開始:first_mb_in_slice == 0 < - 返回第二幀

[NAL_UT_SLICE]幀#4(P)開始:first_mb_in_slice == 0 < - 返回第三幀

[NAL_UT_SPS]幀#5(我)開始< - 返回4幀

...

+0

是的,這在手動創建AVPacket時與ffmpeg完全兼容。謝謝! – sarsonj 2013-08-08 10:46:22