ffmpeg常用結構體《精》

FFMpeg是當今爲的面向音視頻開發的開源工程,廣泛應用於多種音視頻的客戶端、播放器和流媒體服務器中。使用FFMpeg提供的工具和SDK,可以完成音視頻的編碼、解碼、轉碼、封裝、解封裝、轉封裝、視頻水印和視頻縮放等多種需求的開發。

掌握FFMpeg進行音視頻開發,會使用FFpeg工具、SDK進行視頻的編碼、解碼、轉碼、封裝、解封等。

ffmpeg常用結構體《精》
1 解協議的作用,就是將流媒體協議的數據,解析爲標準的相應的封裝格式數據。視音頻在網絡上傳播的時候,常常採用各種流媒體協議,例如HTTP,RTMP,或是MMS等等。這些協議在傳輸視音頻數據的同時,也會傳輸一些信令數據。這些信令數據包括對播放的控制(播放,暫停,停止),或者對網絡狀態的描述等。解協議的過程中會去除掉信令數據而只保留視音頻數據。例如,採用RTMP協議傳輸的數據,經過解協議操作後,輸出FLV格式的數據。

2 解封裝的作用,就是將輸入的封裝格式的數據,分離成爲音頻流壓縮編碼數據和視頻流壓縮編碼數據。封裝格式種類很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是將已經壓縮編碼的視頻數據和音頻數據按照一定的格式放到一起。例如,FLV格式的數據,經過解封裝操作後,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流。

3 解碼的作用,就是將視頻/音頻壓縮編碼數據,解碼成爲非壓縮的視頻/音頻原始數據。音頻的壓縮編碼標準包含AAC,MP3,AC-3等等,視頻的壓縮編碼標準則包含H.264,MPEG2,VC-1等等。解碼是整個系統中最重要也是最複雜的一個環節。通過解碼,壓縮編碼的視頻數據輸出成爲非壓縮的顏色數據,例如YUV420P,RGB等等;壓縮編碼的音頻數據輸出成爲非壓縮的音頻抽樣數據,例如PCM數據

4 視音頻同步的作用,就是根據解封裝模塊處理過程中獲取到的參數信息,同步解碼出來的視頻和音頻數據,並將視頻音頻數據送至系統的顯卡和聲卡播放出來。

各大數據結構體之間的關係:

ffmpeg常用結構體《精》
結構體AVFormatContext

該結構體在avformat.h中,AVFormatContext主要存儲視音頻封裝格式中包含的信息,包含編解碼碼流豐富的信息,統領全局的基本結構體,主要用於處理封裝格式(FLV/MKV/RMVB等),由avformat_alloc_context()初始化,由avformat_free_context()銷燬。如下:比較重要的成員已做註釋

ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
uint8_t *dump_separator;

enum AVCodecID data_codec_id;

int (*open_cb)(struct AVFormatContext *s, AVIOContext **p, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options);

} AVFormatContext;

結構體AVFrame

該結構體在Frame.h中,AVFrame結構體一般用於存儲原始數據(即非壓縮數據,例如對視頻來說是YUV,RGB,對音頻來說是PCM),此外還包含了一些相關的信息。比如說,解碼的時候存儲了宏塊類型表,QP表,運動矢量表等數據。編碼的時候也存儲了相關的數據。因此在使用FFMPEG進行碼流分析的時候,AVFrame是一個很重要的結構體。由av_frame_alloc()或av_image_fill_arrays()初始化,由av_frame_free()銷燬。如下:比較重要的成員已做註釋

ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
data[]

對於packed格式的數據(例如RGB24),會存到data[0]裏面。

對於planar格式的數據(例如YUV420P),則會分開成data[0],data[1],data[2]…(YUV420P中data[0]存Y,data[1]存U,data[2]存V)

qscale_table

QP表指向一塊內存,裏面存儲的是每個宏塊的QP值。宏塊的標號是從左往右,一行一行的來的。每個宏塊對應1個QP。

qscale_table[0]就是第1行第1列宏塊的QP值;qscale_table[1]就是第1行第2列宏塊的QP值;qscale_table[2]就是第1行第3列宏塊的QP值。以此類推…

宏塊的個數用下式計算:

注:宏塊大小是16x16的。

每行宏塊數:

ffmpeg常用結構體《精》
結構體AVCodecContext
該結構體在avcodec.h中,其成員及其多,AVCodecContext中很多的參數是編碼的時候使用的,而不是解碼的時候使用的。由avcodec_alloc_context3()初始化,對其中比較重要的已做註釋:

ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
結構體AVIOContext
該結構體位於avio.h文件中,AVIOContext是FFMPEG管理輸入輸出數據的結構體,用於輸入輸出(讀寫文件,RTMP協議等)。該結構體由avio_alloc_context()初始化,一些成員已經做註釋

ffmpeg常用結構體《精》
每一個編解碼器對應一個AVCodec結構體,如H.264解碼器的結構體定義:AVCodec ff_h264_decoder。

結構體AVStream

該結構體在avformat.h文件中,AVStream是存儲每一個視頻/音頻流信息的結構體。由avformat_new_stream()初始化,

ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
ffmpeg常用結構體《精》
結構體AVPacket

該結構體在avcodec.h文件中,AVPacket存儲壓縮數據(視頻對應H.264等碼流數據,音頻對應AAC/MP3等碼流數據),由av_init_packet()或av_new_packet()初始化,av_free_packet()銷燬。

av_init_packet()和av_new_packet()都不負責申請AVPacket結構體空間,而是申請一塊給AVpacket的成員data指針指向的空間,該空間用於存儲數據。而av_free_packet()也只是釋放AVPacket的data成員指向的空間

在這裏插入圖片描述