2014-02-14 115 views
2

我想了解ffmpeg流視頻處理的知識。ffmpeg如何從['P'幀]計算完整幀['I'幀]。它在概念上是正確的?

我的理解:

我從IPED Camaera,像「IPPPPPPPPPPPPPPPPIPPPPPPP」的幀得到..

框架「我」是一個完整的框架,其中爲框架「P」依賴於前面無論是「P」還是「I」都是關閉的。

我用avcodec_decode_video2

while (av_read_frame (context, &packet) >=0) 
{ 
     //LOGD (" Received PACKET...DTS and PTS %ld and %ld ", packet.pts, packet.dts); 

     if(packet.stream_index == videoStreamIndex) { 
       avcodec_decode_video2 (pCodecCtx, pFrame, &finished, &packet); 
       if (finished) { 
       // Here is my frame, getting the type by av_get_picture_type_char(pFrame->pict_type). 
      } 
} 

現在,當我只顯示我已收到幀獲得框架,看起來像每當「我」收到的幀,它顯示正常,當收到「P」幀,圖像是一個折騰。

1)我們需要手動進行任何計算以將'P'幀轉換爲'I'幀,以便它可以被渲染? 2)如果不是(1),我必須注意什麼?.. DTS/PTS計算是否在這裏做魔術?

回答

2

P幀不依賴於前一個P幀,它依賴於前一張圖片。因此,例如,如果您有IPP,則需要I和第二個P使用第三個P,而不僅僅是第二個P,而不僅僅是第二個P。

decode_video2爲您做插值並返回圖像,所以它拋棄的原因必須是不同的東西。

PTS/DTS告訴你什麼時候顯示幀,但幀仍然必須有效。

+0

感謝喬治,如果我只對顯示視頻幀感興趣,我還需要做PTS/DTS計算嗎? – Whoami

+0

您需要從幀中獲取PTS信息,告訴您何時顯示特定幀(否則您的視頻將播放的速度與設備一樣快)。 DTS你不應該在意,因爲它們是由FFmpeg本身處理的。 –

+0

謝謝,你有沒有參考,如何處理點計算,因爲它真的很混亂,沒有人提供具體的解釋。 – Whoami