2010-11-02 110 views
3

我想解析來自軸攝像頭的rtp流中不同的mpeg4幀,並使用avcodec_decode_video函數將數據包送入ffmpeg庫。這裏是我正在做的步驟 1. rtsp流初始化 2. rtp流開始流動在 3.我得到的第一個數據包以000001b0開始...並且配置數據如下,並且在該幀之後以000001b6開始.. 秒rtp有效載荷將不同,直到我得到一個rtp數據包標記位設置。後我再次得到數據包從000001b6開始,並繼續大約5-10 rtp數據包..這種模式repeast從rtp數據包解析MPEG4幀

我在做什麼是 如果我檢測到000001b0/b6 - 我會積累所有的數據包後比和在正確初始化解碼器上下文之後,將更大的緩衝區提供給libavcodec的avcodec_decode_video函數。

但我在這裏得到了一個蹩腳的圖片,最上面的部分是一個單槓 - 水晶般清晰的圖片,其餘的都很糟糕。我不確定它爲什麼會這樣。請幫助我

我在rtp數據包中獲取的數據是dynamic-96。

需要注意的是:當我通過其他製造商的propreitary協議中專注的iframe和p幀時,ffmpeg能夠解析並給出非常好的pcpers。

任何幫助表示讚賞

回答

9

嘗試在AXIS IP攝像機上擺弄您的MPEG4流設置。注意在視頻&圖像/高級部分,你應該設置這樣的:

  1. 視頻對象類型:SIMPLE
  2. [X] ISMA兼容
  3. GOV結構:IP

另外,嘗試改變「優先」或「優化視頻流」的設置(你應該有幀速率,圖像質量,帶寬,無)。

如果沒有這個工程,然後讀更多...

我希望你理解了MPEG4碼流是如何通過RTP傳輸。在短(如果你不知道如何):

  1. 「配置框架」(可視目標序列開始)一個整數000001B0(十六進制)開始。它包含了視頻解碼所需的數據。只有在您第一次嘗試解碼流時,您才需要將其發送給解碼器,並且將其用於解碼所有後續的VOP。請注意,AXIS以SDP(響應RTSP中的DESCRIBE)發送此數據包,例如: a=fmtp:96 profile-level-id=245; config=000001B0F5000001B5891300000100000001200086C40FA28A021E0A21。所以如果流不會改變,並且你在SDP中得到這個,你不需要將VOS傳遞給解碼器......但是如果你這樣做,沒有任何傷害。

  2. 視頻對象平面(I-VOP,P-VOP,B-VOP)以整數000001B6開頭。如果您將GOV長度設置爲10,並將流的結構設置爲「IP」,則您將獲得1個I幀(I-VOP)和9個P-VOP-s,但所有碼都將有000001B6起始碼。區分它們的技巧是檢查FIFTH字節中的下兩個BITS。檢查表來確定VOP的類型,你得到:

    VOP_CODING_TYPE (binary) Coding method 
             00 intra-coded (I) 
             01 predictive-coded (P) 
             10 bidirectionally-predictive-coded (B) 
             11 sprite (S) 
    

現在,視頻,你必須有VOS發送到解碼器進行解碼,緊跟着的一個I-VOP。但是,從RTP流中提取這些幀的方式很尷尬......如果I-VOP的大小是10000B,並且您的網絡MTU是1400B,則您無法按原樣發送它,也沒有網絡擁塞。因此,AXIS攝像機將I-VOP和所有其他BIG幀分割爲它通過RTP發送的FRAGMENTS,作爲大小不超過MTU的RTP數據包。主要思路是這樣的(例子):

  1. 拆分10000B分成MTU大小的片段(對於1400B MTU你會得到大約8倍[1400B]和1個[200B]片段)
  2. 發送每一個與RTP標記位設置爲與RTP標記位設置爲1 0
  3. 發送最後一個片段,以紀念過去的片段

現在,當你收到此,你還挺有想法,但你需要恢復秩序原10KB FRAME供解碼器解碼。你所做的只是解碼更大幀的第一個MTU字節,而你發送給解碼器的所有其他片段都將被丟棄。這就是爲什麼你可以得到低劣的圖片...

要恢復原來的框架:如果標記設置爲

  1. 接收與起始碼000001B6000001B0和RTP標記位設置爲0的數據包1,這是整個框架,你可以解碼它,因爲它!如果它是0,則更多部分遵循...
  2. 將所有後續片段的第一個片段放入緩衝區,直到您將MARKER BIT設置爲1爲止。當您獲取最後一個片段時,將其放入緩衝區。
  3. 您的緩衝區現在包含一個完整的幀,您可以發送給解碼器!

那裏,希望我幫忙... :)