FFMpeg 實作視頻解碼、編碼、轉碼
一、FFmpeg模塊分類
打開FFmpeg原始碼,會發現有一系列libavxxx的模塊,這些模塊很好地劃分了代碼的結構和分工,
libavformat,format,格式封裝
libavcodec,codec,編碼、解碼
libavutil,util,通用音視頻工具,像素、IO、時間等工具
libavfilter,filter,過濾器,可以用作音視頻特效處理
libavdevice,device,設備(攝像頭、拾音器)
libswscale,scale,視頻影像縮放,像素格式互換
libavresample,resample,重采樣
libswresample,也是重采樣,類似影像縮放
libpostproc,后期處理
二、FFmpeg核心結構體
AVFormatContext:解封裝功能的結構體,包含檔案名、音視頻流、時長、位元率等資訊;
AVCodecContext:編解碼器背景關系,編碼和解碼時必須用到的結構體,包含編解碼器型別、視頻寬高、音頻通道數和采樣率等資訊;
AVCodec:存盤編解碼器資訊的結構體;
AVStream:存盤音頻或視頻流資訊的結構體;
AVPacket:存盤音頻或視頻編碼資料;
AVFrame:存盤音頻或視頻解碼資料(原始資料),
三、播放流程

四、FFmpeg解碼實作
解碼實作的是將壓縮域的視頻資料解碼為像素域的 YUV 資料,實作的程序,可以大致用如下圖所示,

從圖中可以看出,大致可以分為下面三個步驟:
- 首先要有待解碼的壓縮域的視頻,
- 其次根據壓縮域的壓縮格式獲得解碼器,
- 最后解碼器的輸出即為像素域的 YUV 資料
五、FFmpeg編碼實作
視頻域 YUV 資料編碼為壓縮域的幀資料

從圖中可以大致看出視頻編碼的流程:
- 首先要有未壓縮的 YUV 原始資料,
- 其次要根據想要編碼的格式選擇特定的編碼器,
- 最后編碼器的輸出即為編碼后的視頻幀,
六、FFmpeg轉碼實作
傳統的編碼轉換程式作業原理圖


封裝的目的:
1. 是為了在一個檔案流(Stream)中能同時存盤視頻流(Video Stream)、音頻流(Audio Stream)、字幕(Subtitle)、附件(t)、資料(d)等內容,這正是“復用”的含義所在(分時復用),
2. 是在網路環境下確保資料的可靠快速傳輸,
編碼的目的:
是為了壓縮媒體資料,有別于通用檔案資料的壓縮,在影像或音頻壓縮的時候,可以借助影像特性(如前后關聯、相鄰圖塊關聯)或聲音特性(聽覺模型)進行壓縮,可以達到比通用壓縮技術更高的壓縮比,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/230649.html
標籤:其他
