1.FFmpeg基本組成
FFmpeg框架的基本組成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtils等模塊庫,如下圖所示。

- libavformat:用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;音視頻的格式解析協議,為 libavcodec 分析碼流提供獨立的音頻或視頻碼流源。
- libavcodec:用於各種類型聲音/圖像編解碼。該庫是音視頻編解碼核心,實現了市面上可見的絕大部分解碼器的功能, libavcodec 庫被其他各大解碼器 ffdshow, Mplayer 等所包含或應用。
- libavdevice : 硬 件 采 集 、 加 速 、 顯 示 。 操 作 計 算 機 中 常 用 的 音 視 頻 捕 獲 或 輸 出 設 備 :ALSA,AUDIO_BEOS,JACK,OSS,1394, VFW。
- libavfilter:filter(FileIO、 FPS、 DrawText) 音視頻濾波器的開發,如寬高比 裁剪 格式化 非格式化 伸縮。
- libavutil:包含一些公共的工具函數的使用庫,包括算數運算 字符操作。
- libavresample:音視頻封轉編解碼格式預設等。
- libswscale:(原始視頻格式轉換) 用於視頻場景比例縮放、色彩映射轉換;圖像顏色空間或格式轉換,如 rgb565、rgb888 等與 yuv420 等之間轉換。
- libswresample:原始音頻格式轉碼。
- libpostproc:(同步、時間計算的簡單算法) 用於后期效果處理;音視頻應用的后處理,如圖像的去塊效應。
- ffmpeg:該項目提供的一個工具,可用於格式轉換、解碼或電視卡即時編碼等。
- ffsever:一個 HTTP 多媒體即時廣播串流服務器。
- ffplay:是一個簡單的播放器,使用 ffmpeg 庫解析和解碼,通過 SDL 顯示。
2.FFmpeg中的數據結構

-
AVFormatContext 封裝格式上下文結構體,也是統領全局的結構體,保存了視頻文件封裝 格式相關信息。
- iformat:輸入視頻的AVInputFormat
- nb_streams :輸入視頻的AVStream 個數
- streams :輸入視頻的AVStream []數組
- duration :輸入視頻的時長(以微秒為單位)
- bit_rate :輸入視頻的碼率
-
AVInputFormat 每種封裝格式(例如FLV, MKV, MP4, AVI)對應一個該結構體。
- name:封裝格式名稱
- long_name:封裝格式的長名稱
- extensions:封裝格式的擴展名
- id:封裝格式ID
- 一些封裝格式處理的接口函數
-
AVStream 視頻文件中每個視頻(音頻)流對應一個該結構體。
- id:序號
- codec:該流對應的AVCodecContext
- time_base:該流的時基
- r_frame_rate:該流的幀率
-
AVCodecContext編碼器上下文結構體,保存了視頻(音頻)編解碼相關信息。
- codec:編解碼器的AVCodec
- width, height:圖像的寬高(只針對視頻)
- pix_fmt:像素格式(只針對視頻)
- sample_rate:采樣率(只針對音頻)
- channels:聲道數(只針對音頻)
- sample_fmt:采樣格式(只針對音頻)
-
AVCodec 每種視頻(音頻)編解碼器(例如H.264解碼器)對應一個該結構體。
- name:編解碼器名稱
- long_name:編解碼器長名稱
- type:編解碼器類型
- id:編解碼器ID
- 一些編解碼的接口函數
-
AVPacket 存儲一幀壓縮編碼數據。
- pts:顯示時間戳
- dts :解碼時間戳
- data :壓縮編碼數據
- size :壓縮編碼數據大小
- stream_index :所屬的AVStream
-
AVFrame存儲一幀解碼后像素(采樣)數據。
- data:解碼后的圖像像素數據(音頻采樣數據)。
- linesize:對視頻來說是圖像中一行像素的大小;對音頻來說是音頻幀的大小。
- width, height:圖像的寬高(只針對視頻)。
- key_frame:是否為關鍵幀(只針對視頻) 。
- pict_type:幀類型(只針對視頻) 。例如I,P,B。
參考資料:https://blog.csdn.net/leixiaohua1020/article/details/11693997
