ffmpeg基礎知識

ffmpeg是音視頻處理的c庫, 音視頻在網(wǎng)絡傳輸過程中,由于數(shù)據(jù)量大,所有需要進行壓縮
壓縮目的為了去除冗余信息,冗余信息分為:
1、空間冗余:圖像相鄰像素之間有較強的相關性
2、時間冗余:視頻序列的相鄰圖像之間內容相似
3、 編碼冗余:不同像素值出現(xiàn)的概率不同
?4、 視覺冗余:人的視覺系統(tǒng)對某些細節(jié)不敏感
? 5、知識冗余:規(guī)律性的結構可由先驗知識和背景知識得到

壓縮分類:

● 無損壓縮(Winzip)
? 壓縮前解壓縮后圖像完全一致
? 壓縮比低

● 有損壓縮(H.264)
? 壓縮前解壓縮后圖像不一致
? 壓縮比高
? 利用人的視覺系統(tǒng)的特性(人眼能見的動畫頻率和圖像細節(jié)有限制)

音視頻壓縮其實就是對音視頻進行編碼,
視頻編碼格式


image.png

音頻編碼格式


image.png

封裝格式


image.png

流媒體協(xié)議


image.png

YUV簡介

YUV,是一種顏色編碼方法。常使用在各個視頻處理組件中。 YUV在對照片或視頻編碼時,考慮到人類的感知能力,允許降低色度的帶寬。
YUV是編譯true-color顏色空間(colorspace)的種類,Y'UV,YUV,YCbCr,YPbPr等專有名詞都可以稱為YUV,彼此有重疊?!癥”表示明亮度(Luminance、Luma),“U”和“V”則是**[色度]
YUV格式有兩大類:(平面格式)planar和(打包格式)packed。

1.planar:先存儲Y,然后U,然后V

2.packed:yuv交叉存儲

還有我們常說的YUV420sp與YUV420p。

YUV420sp: 一種two-plane模式,即Y和UV分為兩個平面,U、V交錯排列。

YUV420p: 先把U存放完后,再存放V。UV是連續(xù)的。

YUV420的數(shù)據(jù)大小為: 亮度(行×列) + V(行×列/4) + U(行×列/4)即:WH3/2,

普遍的編碼器都以接受planar的I420數(shù)據(jù)(YUV420P)

4*4的I420數(shù)據(jù)排列如下:

y1 y2 y3 y4

y5 y6 y7 y8

y9 y10 y11 y12

y13 y14 y15 y16

u1 u2 u3 u4

v1 v2 v3 v4
Android相機的采集的視頻是NV21(YUV420sP), 也是YUV的格式 只不過U和V的交叉的。
y1 y2 y3 y4

y5 y6 y7 y8

y9 y10 y11 y12

y13 y14 y15 y16

u1 v1 u2 v2

u3 v3 u4 v4
在采集相機數(shù)據(jù)時需要把UV數(shù)據(jù)給轉換成上面的 順序。

H.264 I,P,B幀和PTS,DTS

I frame :幀內編碼幀 ,I 幀通常是每個 GOP(MPEG 所使用的一種視頻壓縮技術)的第一個幀,經過適度地壓縮,做為隨機訪問的參考點,可以當成圖象。I幀可以看成是一個圖像經過壓縮后的產物。

P frame: 前向預測編碼幀,通過充分將低于圖像序列中前面已編碼幀的時間冗余信息來壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫預測幀;

B frame: 雙向預測內插編碼幀 ,既考慮與源圖像序列前面已編碼幀,也顧及源圖像序列后面已編碼幀之間的時間冗余信息來壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫雙向預測幀;

I frame:自身可以通過視頻解壓算法解壓成一張單獨的完整的圖片。

P frame:需要參考其前面的一個I frame 或者B frame來生成一張完整的圖片。

B frame:則要參考其前一個I或者P幀及其后面的一個P幀來生成一張完整的圖片。

PTS:Presentation Time Stamp。PTS主要用于度量解碼后的視頻幀什么時候被顯示出來

DTS:Decode Time Stamp。DTS主要是標識讀入內存中的幀數(shù)據(jù)在什么時候開始送入解碼器中進行解碼。

在沒有B幀存在的情況下DTS的順序和PTS的順序應該是一樣的。

DTS主要用于視頻的解碼,在解碼階段使用。PTS主要用于視頻的同步和輸出.在顯示的時候使用。


image.png

如上圖:I frame 的解碼不依賴于任何的其它的幀.而p frame的解碼則依賴于其前面的I frame或者P frame.B frame的解碼則依賴于其前的最近的一個I frame或者P frame 及其后的最近的一個P frame.

FFmpeg核心模塊

libavformat

? 用于各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;音視頻的格式解析協(xié)議,為 libavcodec 分析碼流提供獨立的音頻或視頻碼流源。

libavcodec

? 用于各種類型聲音/圖像編解碼;該庫是音視頻編解碼核心,實現(xiàn)了市面上可見的絕大部分解碼器的功能,libavcodec 庫被其他各大解碼器 ffdshow,Mplayer 等所包含或應用。

libavfilter

? filter(FileIO、FPS、DrawText)音視頻濾波器的開發(fā),如水印、倍速播放等。

libavutil

? 包含一些公共的工具函數(shù)的使用庫,包括算數(shù)運算 字符操作;

libswresample

? 原始音頻格式轉碼。

libswscale
? (原始視頻格式轉換)用于視頻場景比例縮放、色彩映射轉換;圖像顏色空間或格式轉換,如 rgb565,rgb888 等與 yuv420 等之間轉換。

音視頻解5封裝流程:


image.png

ffmpeg解碼流程:


解碼流程.png

ffmpeg核心類的結構和作用
常用結構體.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容