1. 程式人生 > >ffmpeg實戰系列——001

ffmpeg實戰系列——001

text tsp fontsize proto protocol 方便 png output tco

Talk is cheap,Show me the code!

本文部分參考了雷神的博客,加入自己的理解,新增了對每種數據結構的詳細剖析!

開始玩ffmpeg之前,先把ffmpeg中常見的數據結構以及他們的之間的關系了解下,這是基礎,非常重要!

FFMPEG結構體分析:AVFrame
FFMPEG結構體分析:AVFormatContext
FFMPEG結構體分析:AVCodecContext
FFMPEG結構體分析:AVIOContext
FFMPEG結構體分析:AVCodec
FFMPEG結構體分析:AVStream
FFMPEG結構體分析:AVPacket

FFMPEG中結構體很多。最關鍵的結構體可以分成以下幾類:

a) 解協議(http,rtsp,rtmp,mms):所有格式的協議組織成一個全局鏈表,使用時動態綁定到具體的某種協議,如:ff_file_protocol、ff_rtmp_protocol等

AVIOContext,URLProtocol,URLContext主要存儲視音頻使用的協議的類型以及狀態。URLProtocol存儲輸入視音頻使用的封裝格式。每種協議都對應一個URLProtocol結構。(註意:FFMPEG中文件也被當做一種協議“file”)

b) 解封裝(flv,avi,rmvb,mp4):所有的demuxer,也叫AVInputFormat組織成一個全局鏈表,使用時動態綁定到具體的某種demuxer,如ff_flv_demuxer、ff_mpegts_demuxer、ff_avi_demuxer

AVFormatContext主要存儲視音頻封裝格式中包含的信息;AVInputFormat存儲輸入視音頻使用的封裝格式。每種視音頻封裝格式都對應一個AVInputFormat 結構。

AVInputFormat:demuxer

AVOutputFormat:muxer

c) 解碼(h264,mpeg2,aac,mp3):所有的decoder、encoder組織成一個全局鏈表,使用時動態綁定到具體的某種編解碼器,如:ff_h264_decoder、ff_hevc_decoder等

每個AVStream存儲一個視頻/音頻流的相關數據;每個AVStream對應一個AVCodecContext,存儲該視頻/音頻流使用解碼方式的相關數據;每個AVCodecContext中對應一個AVCodec,包含該視頻/音頻對應的解碼器。每種解碼器都對應一個AVCodec結構。

d) 存數據

視頻的話,每個結構一般是存一幀;音頻可能有好幾幀

解碼前數據:AVPacket

解碼後數據:AVFrame

他們之間的對應關系如下所示:

技術分享

分析了最新的3.3 ffmpeg後,得出如下數據關系:

先來看一下這幾個數據結構,為方便格式直接上傳圖片:

技術分享

技術分享

上層調用具體格式時,函數調用的時候,第一個參數一定是:priv_data

所有的信息幾乎都來自上下文結構體:priv_data

掌握了以上數據結構就可以開始我們的ffmpeg實戰代碼分析了。

ffmpeg實戰系列——001