一、FFmpeg 介紹
FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源計算機程序。采用LGPL或GPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫。
二、FFmpeg 組成
三、FFmpeg包含類庫說明
2.1 類庫說明
- libavformat - 用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息、讀取音視頻數據等功能。各種流媒體協議代碼(如rtmpproto.c等)以及音視頻格式的(解)復用代碼(如flvdec.c、flvenc.c等)都位於該目錄下。
- libavcodec - 音視頻各種格式的編解碼。各種格式的編解碼代碼(如aacenc.c、aacdec.c等)都位於該目錄下。
- libavutil - 包含一些公共的工具函數的使用庫,包括算數運算,字符操作等。
- libswscale - 提供原始視頻的比例縮放、色彩映射轉換、圖像顏色空間或格式轉換的功能。
- libswresample - 提供音頻重采樣,采樣格式轉換和混合等功能。
- libavfilter - 各種音視頻濾波器。
- libpostproc - 用於后期效果處理,如圖像的去塊效應等。
- libavdevice - 用於硬件的音視頻采集、加速和顯示。
如果您之前沒有閱讀FFmpeg代碼的經驗,建議優先閱讀libavformat、libavcodec以及libavutil下面的代碼,它們提供了音視頻開發的最基本功能,應用范圍也是最廣的。
2.2 常用結構
FFmpeg里面最常用的數據結構,按功能可大致分為以下幾類(以下代碼行數,以branch: origin/release/3.4為准):
1. 封裝格式
- AVFormatContext - 描述了媒體文件的構成及基本信息,是統領全局的基本結構體,貫穿程序始終,很多函數都要用它作為參數;
- AVInputFormat - 解復用器對象,每種作為輸入的封裝格式(例如FLV、MP4、TS等)對應一個該結構體,如libavformat/flvdec.c的ff_flv_demuxer;
- AVOutputFormat - 復用器對象,每種作為輸出的封裝格式(例如FLV, MP4、TS等)對應一個該結構體,如libavformat/flvenc.c的ff_flv_muxer;
- AVStream - 用於描述一個視頻/音頻流的相關數據信息。
2.編解碼
- AVCodecContext - 描述編解碼器上下文的數據結構,包含了眾多編解碼器需要的參數信息;
- AVCodec - 編解碼器對象,每種編解碼格式(例如H.264、AAC等)對應一個該結構體,如libavcodec/aacdec.c的ff_aac_decoder。每個AVCodecContext中含有一個AVCodec;
- AVCodecParameters - 編解碼參數,每個AVStream中都含有一個AVCodecParameters,用來存放當前流的編解碼參數。
3. 網絡協議
- AVIOContext - 管理輸入輸出數據的結構體;
- URLProtocol - 描述了音視頻數據傳輸所使用的協議,每種傳輸協議(例如HTTP、RTMP)等,都會對應一個URLProtocol結構,如libavformat/http.c中的ff_http_protocol;
- URLContext - 封裝了協議對象及協議操作對象。
4. 數據存放
- AVPacket - 存放編碼后、解碼前的壓縮數據,即ES數據;
- AVFrame - 存放編碼前、解碼后的原始數據,如YUV格式的視頻數據或PCM格式的音頻數據等;