第二篇 FFmpeg轉(zhuǎn)碼流程、工作原理

昨天舞臺敘事的原創(chuàng)文字,不給審核通過,b站HR說我們這些用戶是loser,我也沒辦法咯。
3. FFmpeg轉(zhuǎn)碼流程、工作原理及相關(guān)術(shù)語
3.1 文件轉(zhuǎn)碼流程:
解封裝Demux ——> 解碼Decode ——> 編碼Encode ——> 封裝Mux

3.2 相關(guān)術(shù)語
3.2.1?封裝格式轉(zhuǎn)換:解封裝Demux與封裝Mux(無編解碼/轉(zhuǎn)碼)
封裝(Container)見上文2.2.1稱為容器。https://www.bilibili.com/read/cv14517014
3.2.1.1 封裝,還稱為多路復(fù)用(Mux)。
封裝的目的:
1. 是為了在一個文件流(Stream)中能同時存儲視頻流(Video Stream)、音頻流(Audio Stream)、字幕(Subtitle)、附件(t)、數(shù)據(jù)(d)等內(nèi)容。這正是“復(fù)用”的含義所在(分時復(fù)用)。
2. 是在網(wǎng)絡(luò)環(huán)境下確保數(shù)據(jù)的可靠快速傳輸。
3.2.1.2 封裝格式轉(zhuǎn)換:
包括封裝與解封裝,即「復(fù)用(Mux)」與「解復(fù)用(Demux)」。
封裝格式轉(zhuǎn)換,就是在AVI,FLV,MKV,MP4這些格式之間進(jìn)行轉(zhuǎn)換(對應(yīng).avi/.flv/.mkv/.mp4后綴文件)。
「復(fù)用(Mux)」又稱為封裝
將多路流(視頻、音頻、字幕等),按照某種容器規(guī)則,混入一路輸出中(普通文件、流等)。是multiplex的縮寫。
「解復(fù)用(Demux)」又稱為解封裝
復(fù)用(Mux) 的反操作。從一路輸入中,解析分離出多路流(視頻、音頻、字幕等)。
「復(fù)用(Mux)」處理的是輸入格式,「解復(fù)用(Demux)」處理的輸出格式。
3.2.1.3?封裝格式轉(zhuǎn)換工作原理圖

封裝格式轉(zhuǎn)換并不進(jìn)行視音頻的編碼和解碼工作。而是直接將視音頻壓縮碼流,從一種封裝格式文件中獲取出來,然后打包成另外一種封裝格式的文件。
3.2.1.4?封裝格式轉(zhuǎn)換特點:
處理速度極快。視音頻編解碼算法十分復(fù)雜,占據(jù)了轉(zhuǎn)碼的絕大部分時間。因為不需要進(jìn)行視音頻的編碼和解碼,所以節(jié)約了大量的時間。
視音頻質(zhì)量無損。因為不需要進(jìn)行視音頻的編碼和解碼,所以不會有視音頻的壓縮損傷。
3.2.2 編解碼轉(zhuǎn)換(轉(zhuǎn)碼)
使用FFmpeg對輸入源處理,然后輸出的過程叫做?
轉(zhuǎn)碼。轉(zhuǎn)碼可以改變文件格式,或者文件格式不變,只是更改其他數(shù)據(jù)。
編碼的目的
為了壓縮媒體數(shù)據(jù)。
有別于通用文件數(shù)據(jù)的壓縮,在圖像或音頻壓縮的時候,可以借助圖像特性(如前后關(guān)聯(lián)、相鄰圖塊關(guān)聯(lián))或聲音特性(聽覺模型)進(jìn)行壓縮,可以達(dá)到比通用壓縮技術(shù)更高的壓縮比。
傳統(tǒng)的編碼轉(zhuǎn)換程序工作原理圖

3.3?轉(zhuǎn)碼步驟
1. Demuxer 解復(fù)用器 進(jìn)行Demuxing 解封裝:
FFmpeg根據(jù)輸入源的文件擴(kuò)展名,來選擇最佳的解封裝器:調(diào)用libavformat庫(包含解復(fù)用器)讀取 [輸入文件(Input file)] ,解封裝后生成 [包含編碼數(shù)據(jù)的數(shù)據(jù)包(Encoded data packets)],即壓縮狀態(tài)的數(shù)據(jù)包。(文件file → 數(shù)據(jù)包data packets)2.2.5 「數(shù)據(jù)包(Packet)」
2. Decoder 解碼器 進(jìn)行Decoding解碼 :
通過適當(dāng)?shù)慕獯a器將步驟1里面的數(shù)據(jù)包解碼為[未壓縮的數(shù)據(jù)幀](原始視頻/PCM音頻/...),可以通過 ※過濾Optional filtering※ 進(jìn)一步處理。(數(shù)據(jù)包data packages ——> 數(shù)據(jù)幀frames)2.2.3 「幀(Frame)」
※ Optional filtering可選的濾鏡:通過指定的濾鏡修改解碼后的數(shù)據(jù)幀。(修改數(shù)據(jù)幀)
如果使用-c copy或-codec copy,將不會有解碼這個步驟,也就不會有下面的編碼步驟。
3. Encoder 編碼器 進(jìn)行Encoding編碼:
通過指定編碼器,對其進(jìn)行編碼,將數(shù)據(jù)幀編碼輸出為[編碼后的數(shù)據(jù)包(Encoded data packets)]。(數(shù)據(jù)幀frames ——> 數(shù)據(jù)包data packages)
4. Muxer 復(fù)用器 進(jìn)行Muxing封裝:
將[編碼的數(shù)據(jù)包]封裝為指定的媒體格式[輸出文件(Output file)]。(數(shù)據(jù)包data packages ——> 文件file)
FFmpeg相關(guān)術(shù)語中易混淆的概念(下一次詳細(xì)講)
自行思考「文件格式(File Format)」與「封裝格式(Container Format)」的區(qū)別
附上一張圖片
