本文中涉及到的一些編碼,圖像等的具體處理在代碼上的體現(xiàn)可查看:[總結(jié)]視音頻編解碼技術(shù)零基礎(chǔ)學(xué)習(xí)方法
基本概念-顏色
RGB和YUV:圖像常見的兩類數(shù)字化表達(dá)。
RGB是基于三原色原理,對紅綠藍(lán)三個顏色通道疊加得到各式各樣的顏色。主要用來在顯示器上顯示(渲染)。
常見的RGB格式:
RGB 1:2色,每個像素用1位表示
RGB 4:16色,每個像素用4位表示
RGB 8:256色,每個像素用8位表示
RGB 565:每個像素16位表示,R5位 G6位 B5位
RGB 16/555:每個像素16位表示,R5位 G5位 B5位 剩下1位不用
RGB 24:每個像素24位表示,R8位 G8位 B8位
RGB 32:每個像素32位表示,R8位 G8位 B8位 剩下8位不用
-
ARGB 32:每個像素32位表示,R8位 G8位 B8位 剩下8位 標(biāo)識 Alpha通道。
一個像素所使用的位數(shù)不同,顯示出來的色彩豐富度不同,位數(shù)越大,色彩越豐富。
YUV是另一種編碼方式,Y表示明亮度,U表示色度,V表示濃度。描述影像的色彩及飽和度,用于指定像素的顏色。主要用于食品信號的壓縮、傳輸和存儲。
YCbCr:YUV的另外一種表示YUV是信號領(lǐng)域,YCbCr是數(shù)字圖像領(lǐng)域。Cr紅色分量信號,Cb藍(lán)色分量信號,Y除了g綠色分量信號,還疊加了亮度信號。
常見的YUV/YCbCr格式的采樣方法有:
4:4:4 、 4;2:2 、 4:2:0 、 4:1:1。




其中4:2:0并不意味只有Y,Cb沒有Cr,它指的是對每行掃描線來說只有一種色度分量以2:1的抽樣率存儲。
YUV的存儲格式:
平面格式:先連續(xù)存儲所有像素點的Y分量,然后存儲U分量,最后是V分量。
打包模式:每個像素點的YUV分量連續(xù)交替存儲.


RGB和YUV的轉(zhuǎn)化。
RGB轉(zhuǎn)YUV:
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128
YUV轉(zhuǎn)RGB:
B = 1.164(Y - 16) + 2.018(U - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
R = 1.164(Y - 16) + 1.596(V - 128)
RGB用來顯示,YUV用來傳輸
基本概念-視頻
視頻:連續(xù)的圖像變化每秒超過24幀(frame)畫面以上時,看上去就是平滑連續(xù)的視覺效果,這樣連續(xù)的畫面叫做視頻。
幀(Frame):影像中常用的最小單位,一幀就是一副靜止的畫面。
幀速率(FPS):每秒說傳輸?shù)膱D片個數(shù),或者可以理解為處理器每秒刷新的次數(shù)。FPS越高,畫面越流暢。
轉(zhuǎn)碼:實質(zhì)是一種針對特定的音視頻格式內(nèi)容壓縮成另一種視頻格式的方式。
- (原視頻 -- 解碼 -- 像素數(shù)據(jù) -- 編碼 -- 目標(biāo)視頻)
- (原音頻 -- 解碼 -- 音頻數(shù)據(jù) -- 編碼 -- 目標(biāo)音頻)
為什么要編碼?
一段網(wǎng)絡(luò)上的視頻信號數(shù)字化后占用大量的存儲空間和數(shù)據(jù)帶寬,比如高清視頻的碼率往往可以達(dá)到200Mb/s、120分鐘的電影將占到180G以上,通過編碼后,下載的電影也就2G-8G。
為什么要解碼?
編碼過的內(nèi)容無法直接使用,使用(觀看)時必須解壓縮,還原為原始的信號(比如視頻中某個點的顏色等)
采樣頻率:錄音設(shè)備在一秒鐘內(nèi)對聲音信號的采樣次數(shù),它用赫茲(Hz)來表示,比如44.1KHz采樣率的聲音就是要花費44000個數(shù)據(jù)點來描述1秒鐘的聲音波形。原則上采樣率越高,聲音質(zhì)量越好。
常見的CD采樣頻率是44.1KHz ,因為人能夠感受到的最高頻率是20KHz
碼率/比特率:1秒內(nèi)傳輸?shù)谋忍財?shù)
壓縮:使用更少的數(shù)據(jù)來表達(dá)更多的信息。 - 有損壓縮:通過刪除不必要或者不重要的內(nèi)容減少數(shù)據(jù)量。
- 無損壓縮:壓縮過程中不丟失任何信息。
視頻的構(gòu)成
image.png
一個完整的視頻文件是由音頻和視頻兩部分組成的,而音頻和視頻又是由封裝格式和編碼格式構(gòu)成的

通常我們看見的視頻文件的后綴名就是封裝格式比如MP4,3GP,RMVB,MOV。這些封裝格式里邊還有一層編碼文件。常見的視頻編碼格式有H.264,mpeg-4,常見的音頻編碼格式有MP3、AAC。
視頻編碼(壓縮)方式/編碼(壓縮)原理/概念
視頻數(shù)據(jù)有極強(qiáng)的相關(guān)性,幀與幀之間有大量冗余信息,壓縮的本質(zhì)就是去除這些冗余信息。
壓縮的方向:
- 空間冗余,視頻的背景和整體顏色相近并且平穩(wěn)變化,可以利用幀內(nèi)編碼進(jìn)行壓縮;(無損)
- 時間冗余,兩個視頻幀之間具有強(qiáng)相關(guān)性,利用運動估計和運動補(bǔ)償進(jìn)行幀間壓縮;(無損)
- 運動補(bǔ)償:通過先前的局部圖像來預(yù)測,補(bǔ)償當(dāng)前的局部圖像;
- 運動表示:不同區(qū)域的圖像需要使用不同的運動矢量來描述運動信息;
- 運動估計:從視頻序列中抽取運動信息的一整套技術(shù)。
- 結(jié)構(gòu)冗余,圖像內(nèi)部存在相似性,通過這種關(guān)系可以進(jìn)行分形編碼;
- 編碼冗余,出現(xiàn)概率大的顏色編碼長度短,概率小的顏色編碼長度長;(可變長度編碼)
- 視覺冗余,利用人眼對亮度和色度的敏感度不同,在編碼時進(jìn)行數(shù)據(jù)壓縮;(有損壓縮)
GOP概念:它代表兩個I幀之間形成的一組連續(xù)的圖像幀。
通常在編碼器設(shè)置參數(shù)時,必須會設(shè)置一個gop_size的值,其實就是代表2個I幀之間的幀數(shù)目。在一個GOP組中容量最大的就是I幀,所以相對而言,gop_size設(shè)置的越大,整個視頻畫面質(zhì)量就會越好。但是解碼端必須從接受的第一個I幀開始才可以正確解碼出原始圖像,否則無法正確解碼。
IPB幀:
簡略: - I幀是關(guān)鍵幀,解碼時只需要本幀數(shù)據(jù);
- P幀是參考幀,表示這一幀與前一個關(guān)鍵幀(或P幀)的差別;
- B幀是雙向參考幀,表示本幀與前后幀的差別;(B幀壓縮率高,解碼復(fù)雜,直播中較少用)
- IDR幀是第一個I幀,為的是和其他I幀區(qū)別開,方便控制編碼和解碼;
編碼角度來理解IPB: - I幀通過視頻壓縮算法解壓成一張單獨的完整視頻畫面,I幀去掉的是視頻幀在空間維度上的冗余信息;
- P幀需要參考其前面的一個I幀或者P幀來解碼成一張完整的視頻畫面;
- B幀需要參考其前一個I幀或者P幀,以及后面的一個P幀來生成一張完整的視頻畫面,所以P幀和B幀去掉的是視頻幀在時間維度上的冗余信息。
DTS:Decode Timestamp 解碼時間戳。用于解碼階段進(jìn)行視頻的同步和輸出。
PTS:Presentation Timestamp 顯示時間戳
硬編碼:使用GPU計算,性能高 VideoToolBox、AudioToolBox。但是特性支持有限,而且壓縮率一般偏低
軟編碼:使用CPU來進(jìn)行編碼計算,實現(xiàn)簡單直接,升級容易,但是CPU負(fù)載重。壓縮率比較高,而且支持的H264特性也會比硬編碼多很多,相對來說比較可控。
視頻:使用ffmpeg,x264算法吧視頻原始數(shù)據(jù)YUV/RGB編碼成H264
-
音頻:使用fdk_aac將音頻數(shù)據(jù)PCM轉(zhuǎn)換成AAC。
在優(yōu)勢方面,軟件編碼兼容性好,能解碼所有的視頻格式文件,畫質(zhì)清晰、畫面精致,速度較快。而硬件編碼的優(yōu)勢在于它的編碼速度非??烨倚蕵O高,由于GPU承擔(dān)起了編碼的重?fù)?dān),因此硬編碼對CPU的占用率低,就算長時間高清錄制視頻手機(jī)也不會發(fā)燙降頻。
在劣勢方面,軟件編碼的CPU占用率高,一些性能比較差的手機(jī)可能會因CPU發(fā)熱而降頻、卡頓,無法流暢錄制、播放視頻,同時使用軟件編碼的方式可能會讓軟件包體變大,手機(jī)內(nèi)存占用率變高。而硬件編碼的確定就更明顯,在某些智能手機(jī)上,由于機(jī)型區(qū)別,采取硬件編碼的方式可能會出現(xiàn)兼容性上的問題,還有硬件編碼畫面不夠精細(xì)的問題一直都很難解決。
播放一個網(wǎng)絡(luò)上的視頻需要的步驟
1.解協(xié)議:將流媒體協(xié)議的數(shù)據(jù),解析為標(biāo)準(zhǔn)的響應(yīng)的封裝格式數(shù)據(jù)。
2.解封裝:將輸入的封裝格式的數(shù)據(jù),分離成音頻流壓縮編碼數(shù)據(jù)和視頻流壓縮編碼數(shù)據(jù)。
3.解碼:就是將視頻/音頻壓縮編碼數(shù)據(jù),解碼成為非壓縮的視頻/音頻原始數(shù)據(jù)。
- 把壓縮編碼的視頻數(shù)據(jù),輸出成為非壓縮的顏色數(shù)據(jù),例如YUV420P,RGB等等;
-
把壓縮編碼的音頻數(shù)據(jù),輸出成為非壓縮的音頻抽樣數(shù)據(jù),例如PCM數(shù)據(jù)。
4.音視頻同步:根據(jù)封裝模塊處理過程中獲取的參數(shù)信息,同步解碼出來的視頻和音頻數(shù)據(jù),并將其發(fā)送到系統(tǒng)的顯卡和聲卡播放出來。
image.png
