音視頻的基礎(chǔ)知識

在我們利用FFmpeg開源庫編寫自己簡易的播放器時(shí),還是先來了解一下音視頻的基礎(chǔ)知識。畢竟知識還是要循序漸進(jìn),只有了解一些音視頻基礎(chǔ)知識才能更好的學(xué)習(xí)音視頻。筆者最開始接觸音視頻的時(shí)候是從[雷霄驊]https://blog.csdn.net/leixiaohua1020專欄中。他留下的知識對音視頻行業(yè)的影響依舊是不可磨滅的。關(guān)于初學(xué)者怎么去學(xué)習(xí)FFmepg 雷神給出方向https://blog.csdn.net/leixiaohua1020/article/details/15811977

視頻播放流程

視頻播放流程.png

上圖是播放一個(gè)視頻的流程也是播放器的核心原理步驟,視頻的播放源可以是文件也可以是http,rtmp等協(xié)議流通過解協(xié)議得到封裝格式的數(shù)據(jù),通過解封裝進(jìn)一步分離視頻流和音頻流,得到視頻壓縮數(shù)據(jù)和音頻的壓縮數(shù)據(jù),視頻數(shù)據(jù)通過對應(yīng)的壓縮算法找到對應(yīng)的解碼器得到視頻的像素?cái)?shù)據(jù),音頻壓縮數(shù)據(jù)通過解碼的到音頻采樣數(shù)據(jù)(pcm數(shù)據(jù)),在揚(yáng)聲器播放pcm數(shù)據(jù)和屏幕顯示像素?cái)?shù)據(jù)是通過數(shù)據(jù)同步以后才播放的。沒有接觸過視音頻技術(shù)的人,在學(xué)習(xí)FFmpeg之前先了解一下幾種最基本的視音頻數(shù)據(jù)的格式。

視頻像素?cái)?shù)據(jù)格式 RGB、YUV

YUV

YUV顏色的表示方法 “Y”表示亮度,“ U”表示色度,“V”表示飽和度。視頻中常用的YUV格式有YUV420,YUV444,YUV422。這些個(gè)格式代表的是YUV分量的比例,下面還可以細(xì)分很多格式。像YUV420又可以分為兩種:YUV420P和YUV420SP,android的相機(jī)默認(rèn)圖像格式NV21屬于YUV420SP格式。
YUV 4:2:0采樣,每四個(gè)Y共用一組UV分量,一個(gè)YUV占1.5個(gè)字節(jié)。
YUV 4:2:2采樣,每兩個(gè)Y共用一組UV分量,一個(gè)YUV占 2個(gè)字節(jié)。
YUV 4:4:4采樣,每一個(gè)Y對應(yīng)一組UV分量,一個(gè)YUV占3個(gè)字節(jié)。

1.YUV420P:(YU12(Android平臺下叫I420格式)和YV12)一幀YUV420P(YU12)像素?cái)?shù)據(jù),包含wh3/2 Byte的數(shù)據(jù),前wh Byte存儲Y分量,接著wh 1/4存儲U,最后wh1/4存儲的是V。一幀YUV420P的圖像Y:U:V = 4 :1:1
2.YUV444P:一幀YUV444P像素?cái)?shù)據(jù)包含w
h3 Byte的數(shù)據(jù)。前wh Byte存儲Y,接著的wh Byte存儲U,最后wh Byte存儲V。一幀YUV420P的圖像Y:U:V = 1:1:1
上面只是舉例

YUV420 數(shù)據(jù)存儲方式
Y Y Y Y Y Y           Y Y Y Y Y Y           Y Y Y Y Y Y           Y Y Y Y Y Y
Y Y Y Y Y Y           Y Y Y Y Y Y           Y Y Y Y Y Y           Y Y Y Y Y Y
Y Y Y Y Y Y           Y Y Y Y Y Y           Y Y Y Y Y Y           Y Y Y Y Y Y
Y Y Y Y Y Y           Y Y Y Y Y Y           Y Y Y Y Y Y           Y Y Y Y Y Y
U U U U U U           V V V V V V           U V U V U V           V U V U V U
V V V V V V           U U U U U U           U V U V U V           V U V U V U
   (I420)                (YV12)                (N12)                 (NV21)
RGB

RGB相信大家都比較熟悉,他是顏色的三原色,“R”代表紅色,“G”代表綠色,“B”代表藍(lán)色,不同的分量顏色值搭配可以表示不同的顏色。
RGB24像素?cái)?shù)據(jù),RGB的分量是怎樣存儲的呢。上述我們YUV420P的存儲分量是分開存儲的(平面方式),而RGB每個(gè)像素的三個(gè)分量是連續(xù)存儲的(打包方式)。一幀RGB24數(shù)據(jù)格式的圖像,包含wh3Byte的數(shù)據(jù),存儲的順序是第一個(gè)像素(8bit)R,(8bit)G,(8bit)B接著存儲下一個(gè)像素點(diǎn)(8bit)R,(8bit)G,(8bit)B這樣一次存儲下去的。
小結(jié):數(shù)據(jù)的存在格式可以分為packed(打包)和planar(平面)兩種,上述的YUV420P,YUV444P就是屬于平面的存儲方式,RGB24屬于打包的存儲方式。YUV420(NV12、NV21)的數(shù)據(jù)存儲既有平面又有打包,Y平面,UV打包,即Y信息存儲在一個(gè)數(shù)組中,UV信息存儲在一個(gè)矩陣中。了解了最基礎(chǔ)的像素?cái)?shù)據(jù)格式以及存儲的分量的位置,便可以去處理操作圖像。

音頻采樣數(shù)據(jù)PCM

PCM它是由模擬信號經(jīng)過采樣、量化、編碼轉(zhuǎn)換成的標(biāo)準(zhǔn)數(shù)字音頻數(shù)據(jù)。
來了解一下PCM重要的屬性:
1.Sample Rate : 采樣率(一秒鐘采樣點(diǎn)的個(gè)數(shù))8kHz,44.1kHz(CD音質(zhì)),48kHz
2.Sample Size : 位寬度 8-bit,16-bit 一個(gè)點(diǎn)所占的bit位,位寬度越高聲音保真度越高
3.Channels : 通道個(gè)數(shù),包含立體聲和單聲道兩種類型,立體聲包含左聲道和右聲道
PCM數(shù)據(jù)存入的循序。如果是單聲道的音頻文件,采樣數(shù)據(jù)按時(shí)間的先后順序依次存入,如果是雙聲道的話就按照LRLRLR的方式存儲。


pcm存儲的循序.jpg

小結(jié):了解PCM 數(shù)據(jù)的基礎(chǔ)便能對音頻進(jìn)行操作,左右聲道的分離,聲音音量的調(diào)節(jié),音頻的截取等功能。

H.264視頻壓縮數(shù)據(jù)

簡單的了解H.264。H.264是一種視頻的壓縮算法,內(nèi)部實(shí)現(xiàn)的原理比較復(fù)雜,熵編碼,環(huán)路濾波,幀內(nèi)壓縮,幀間壓縮。
壓縮步驟:
1.分組:把幾幀圖像分為一組(GOP,也就是一個(gè)序列),為防止運(yùn)動(dòng)變化,幀數(shù)不宜取多。
2.定義幀:將每組內(nèi)各幀圖像定義為三種類型,即I幀、B幀和P幀;
3.預(yù)測幀:以I幀做為基礎(chǔ)幀,以I幀預(yù)測P幀,再由I幀和P幀預(yù)測B幀;(B幀圖像位于I幀和P幀之間)
4.保存幀信息:I幀作為基礎(chǔ)幀保留完整的數(shù)據(jù)信息(JPEG壓縮編碼)每組里面也只會(huì)存在一個(gè)I幀,P作為預(yù)測幀保存下來的信息就是于I幀的區(qū)別差異處,B幀根據(jù)I幀和P幀生成的幀所以是信息量最少的一個(gè)幀,壓縮率最高的一個(gè)幀,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之后的畫面。
到后面再去具體的分析H.264的碼流結(jié)構(gòu)

視頻的常見封裝格式

簡單的可以把視頻格式看做一個(gè)容器,它承載的是視頻壓縮數(shù)據(jù)與音頻壓縮數(shù)據(jù),包括字幕,視頻信息等。不同的格式數(shù)據(jù)封裝的方法不同。常見的封裝格式有MP4,m3u8,FlV,AVI等。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容