音視頻行業已經發展很多年了,隨着近幾年移動端越來越多的音視頻APP的出現,將音視頻推向一個高潮,但是由於音視頻的學習成本很高,很多開發者望而卻步,爲了跟緊時代的步伐,我寫了這篇音視頻基礎,講解了音視頻的相關知識,給大家破除音視頻的“高門檻”,希望可以共同進步。
音頻
將聲音保存成音頻的過程,其實就是將模擬音頻數字化的過程,爲了實現這個過程,就需要對模擬音頻進行採樣、量化和編碼。接下來我們詳細講解這一過程。
採樣
採樣是將信號從連續時間域上的模擬信號轉換到離散時間域上的離散信號的過程(離散就是不連續),根據著名的奈奎斯特定理,需要按聲音最高頻率2倍進行採樣,人耳能聽到的聲音是20Hz~20kHz,所以一般針對聲音的採樣率是44.1KHz(爲什麼是44.1KHz呢,而不是40KHz?因爲經過嘗試使用這個採樣率進行採樣效果最好)。下面列表一些其他的採樣率,可作爲參考。
- 8,000 Hz - 電話所用採樣率,對於人的說話已經足夠
- 11,025 Hz
- 22,050 Hz - 無線電廣播所用採樣率
- 32,000 Hz - miniDV數字視頻camcorder、DAT(LP mode)所用採樣率
- 44,100 Hz - 音頻CD,也常用於MPEG-1音頻(VCD, SVCD, MP3)所用採樣率
- 47,250 Hz - Nippon Columbia(Denon)開發的世界上第一個商用PCM錄音機所用採樣率
- 48,000 Hz - miniDV、數字電視、DVD、DAT、電影和專業音頻所用的數字聲音所用採樣率
- 50,000 Hz - 二十世紀七十年代後期出現的3M和Soundstream開發的第一款商用數字錄音機所用採樣率
- 50,400 Hz - 三菱X-80數字錄音機所用所用採樣率
- 96,000或者192,000 Hz - DVD-Audio、一些LPCM DVD音軌、Blu-ray Disc(藍光光盤)音軌、和HD-DVD(高清晰度DVD)音軌所用所用採樣率
- 2.8224 MHz - SACD、索尼和飛利浦聯合開發的稱爲Direct Stream Digital的1位sigma-delta modulation過程所用採樣率。
如上圖所示就是一個採樣的過程,將模擬音頻在連續的時間域上,切割成不連續的時間域的信號過程,即是對x軸的操作。那麼有x軸就有y軸,實際上對y軸的操作就是量化。
量化
量化是什麼?就是要將上面分割的信息用具體的數據來進行表示,用形象的話來說,就是給每個x時間軸,對應其y軸的變化數值。那麼我們要表示一段聲音的具體值,肯定就需要先分配一個可變化區間(這個區間就叫做量化格式),二進制中的1個單位就是一個比特,通常有8比特,16比特,32比特。
這裏還需引入分貝(單位db)的概念:是描述聲音大小的單位,人耳承受的dB範圍是:0~90dB,0dB是人耳能聽到的最微弱的的聲音,在90dB環境中聽力會受到嚴重影響。經過研究,1個比特可以大約記錄6分貝的聲音,那麼我可以得出下圖的數據
單位 | 範圍 | dB |
---|---|---|
8比特 | 0~2^8-1 <=> 0~255 | 0~48 |
16比特 | 0~2^16-1 <=> 0~65535 | 0~96 |
32比特 | 0~2^32 -1 <=> 0~4294967295 | 0~192 |
由上可知,一般我們使用16比特,因爲其有0~65535中變化,而且剛好符合人對聲音大小的範圍,而8比特處理音頻,只有0~255中變化,變化不能夠被很精細的記錄下來,那爲什麼不使用32比特呢?這是因爲32位太消耗存儲了,當然如果想使音頻更加精細,也是可以使用32比特的。
由於量化是建立在採樣的基礎上的,所有一個量化就對應一個採樣,那麼我們怎麼存儲呢?這就會涉及到下面的編碼了。
聲道
什麼是聲道呢?聲道就是聲源,意思就是聲音的來源,常見的有Mono
和Stereo
。
- Mono 單聲道,單個聲源,很多地方已被
Stereo
取代 - Stereo 立體聲,2個及以上多個聲源
當我們站在不同位置聽單聲道時,它呈現的效果是不一樣的,而立體聲則不然,在不同方向仍可保持自然與悅耳,現在CD一般都是雙聲道立體聲,那聲道數就是2個。
音頻編碼
所謂編碼,就是按照一定的格式記錄採樣和量化後的數字數據,比如順序存儲或壓縮存儲空間了。從宏觀上可以分成兩類:壓縮編碼和非壓縮編碼。
一個存儲的格式有很多種,通常音頻裸數據即是我們所說的PCM,也叫脈衝編碼調製(英語:Pulse-code modulation,縮寫:PCM)是一種模擬信號的數字化方法,它是一種非壓縮編碼格式。
通常描述一段PCM數據需要以下幾個概念:
- 量化格式 - SampleFormat,默認16比特
- 採樣率 - SampleRate,默認44.1KHz
- 聲道數 - Channel ,默認2個
一般我們使用碼率
來描述音頻,即是1秒內吞吐量,單位bps :
碼率 = 採樣率 * 量化格式 * 聲道數
如上,我們就可以得出:碼率 = 44100 * 16 * 2 = 1411200 bps = 1378.125 kbps
還可以得出1分鐘數據大小:1378.125 * 60 / 8 / 1024 = 10.1M
下圖是我從一個mp3格式上獲取的基本信息,可以看到量化格式、採樣率和聲道數都是一樣的,但是它的碼率卻是 320kbps,這與我們上面計算公式得出的結論不一致呀?這就是涉及到壓縮編碼格式了。
Duration: 00:00:39.99, start: 0.011995, bitrate: 320 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
壓縮編碼就是對數據進行壓縮,壓縮編碼的原理實際上是壓縮掉冗餘信號,冗餘信號是指不能被人耳感知到的信號,包含人耳聽覺範圍之外的音頻信號以及被掩蔽掉的音頻信號等,一般壓縮分爲兩種:
- 有損壓縮,數據經過壓縮後,信息不受損失,還能完全恢復到壓縮前的原樣
- 無損壓縮,經過此方法壓縮、解壓的數據會與原始數據不同但是非常接近
在音樂應用中,我們經常看到“無損音樂”,如果你發現它是mp3格式的,那麼它一定是有損壓縮,也就是我們所說的假無損。常見的有損壓縮如下:
- MP2
- MP3
- AAC
- WMA
- ADPCM
- ATRAC
- Dolby AC-3
- Musepack
- Ogg Vorbis
- Opus
- LDAC
視頻
說完音頻,我們來說說視頻,首先得說說視頻是什麼?我們都知道視頻是由一幀一幀聯繫圖像構成的,所以再介紹視頻之前,先得了解一下什麼是圖像?
圖像
我們從小學習物理知識就知道,通過三菱鏡就可以將光色散成不同的顏色,經過進一步研究發現,只有紅®、綠(G)、藍(B)不能被分解,所以它們被稱爲光的三原色。
一般我們買手機的時候會參考它的分辨率,當然是分辨率越大越好,因爲越大越清晰,更接近事物的原始樣貌,那這是爲什麼呢?
其實爲了讓人能夠在手機上感知圖像,也採用了這樣的RGB模式。以“1080x1920”爲例,那就是每一個橫向就有1080個像素點,縱向有1920個像素點,那總共就有1080x1920=2073600個像素。每一個像素又包含了紅®、綠(G)、藍(B)三個子像素,這樣每個像素就可以有自己的全部顏色呈現。
圖像表示
我們知道紅®、綠(G)、藍(B)都可以使用00~FF或者0~255表示,由上面我們知道8比特剛好可以表示0~255,一個像素又包含了紅®、綠(G)、藍(B)三個子像素,那一個像素至少需要24位,我們一般還要給顏色加上一個不透明度(A),所以一個像素其實是32位,這種表示方式就是我們常用的RGBA_8888
,那如果一張圖片要在上面分辨率的手機上全屏展示出來需要多大的空間呢?
1080*1920*4 = 8294400b = 8100kb = 7.91Mb
這也是位圖(bitmap)在內存中所佔用的大小,每一張圖像的裸數據都是很大的,所以在手機上如果直接加載bitmap的話,很快就會內存溢出。所以如果讓圖像直接在網絡上行走的話肯定是不行的,一般都會進行一個壓縮,常見的壓縮格式有:
- BMP - 無損壓縮
- PNG - 無損壓縮
- JPEG - 有損壓縮
這是就是爲什麼在製作小圖(比如icon)的時候使用png
格式,而大圖採用jpeg
的原因,小圖經過無損壓縮放大之後不讓其太過模糊,大圖保證其能夠清晰即可。
視頻表示
視頻的裸數據我們一般使用YUV來進行表示,YUV也是一種顏色編碼方式,爲什麼不使用RGB呢?與RGB視頻信號傳輸相比,它最大的優點在於只需要佔用極少的頻寬(RGB要求三個獨立的視頻信號同時傳輸)
“Y”表示明亮度(Luminance、Luma),也稱灰階值;“U”和“V”則是色度,它們的作用是描述影像的色彩及飽和度,用於指定像素的顏色。如果忽略掉UV,那就是隻剩下灰(Y),那就跟以前黑白電視機信號一樣了,所以YUV的發明了是爲了從黑白電視過渡彩色電視而發明的。
UV又由Cb和Cr來描述,Cb反映的則是RGB輸入信號藍色部分與RGB信號亮度值之間的差異,而Cr反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異。UV信號告訴了顯示器使得某個顏色亮度依某個基準偏移, UV的值越高,代表該像素會有更飽和的顏色。
爲節省帶寬起見,大多數YUV格式平均使用的每像素位數都少於24位。主要的抽樣(subsample)格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和YCbCr 4:4:4。YUV的表示法稱爲A:B:C表示法:
- 4:4:4表示完全取樣,與RGB類似
- 4:2:2表示2:1的水平取樣,垂直完全採樣。
- 4:2:0表示2:1的水平取樣,垂直2:1採樣。
- 4:1:1表示4:1的水平取樣,垂直完全採樣。
我們再對1080x1920手機上展示視頻一幀的數據量大小如下:
YUV格式 | 大小 (1080x1920分辨率) |
---|---|
444 | 1080* 1920* 3=6220800b = 6075 kb = 5.93Mb |
422 | 1080* 1920* (1+0.5+0.5) = 4147200 b = 4050 kb = 3.96Mb |
420 | 1080* 1920* (1+0.5+0) = 3110400 b = 3037.5 kb = 2.97Mb |
411 | 1080* 1920* (1+0.25+0.25) = 3110400 b = 3037.5 kb = 2.97Mb |
從上圖中我們可以看到,如果使用YUV420一幀會比直接使用RGB少了近3M,這也就是爲什麼使用YUV而不是用RGB的主要原因。
需要注意點是一般視頻都是使用的YUV4:2:0,YUV4:2:0並不是說只有U(即Cb), V(即Cr)一定爲0,而是指U:V互相援引,時見時隱,也就是說對於每一個行,只有一個U或者V分量,如果一行是4:2:0的話,下一行就是4:0:2,再下一行是4:2:0…以此類推。
怎麼讓YUV轉化成RGB數據在手機上呈現呢?這就需要一個轉化公式了
到此我們就知道視頻是怎麼回事了,視頻的是由一幀一幀圖像組成,一幀圖像又是由YUV裸數據組成,而YUV裸數據是可以與RGB互相轉化的,最終呈現在手機上的是轉化後的RGB。
視頻編碼
在介紹編碼之前,我們先介紹兩個概念:
- 幀率(fps) - 測量單位時間(s)顯示的幀數,一般視頻中使用24fps就可以了。對於遊戲來講,如果幀率少於30fps就會出現不連貫,也就是我們平常說的卡頓。
- 比特率 - 測量單位時間(s)數據量大小。
我們就可以計算一下在1080* 1920的手機上播放YUV420視頻數據的比特率:
bitRate = 1080* 1920* (1+0.5+0)* 24 = 71.2 Mbps
還可以得出90分鐘電影數據量:
total = bitRate * 60 * 90 = 375.42 GB
這對於我們來說是肯定不能接受的,所以就必須對其進行編碼,跟音頻編碼類似,一般採用壓縮編碼,不然就沒得玩咯~
與音頻編碼不同,視頻數據之間有很強的關聯性,也就是由大量的冗餘信息,包括時間上的冗餘信息和空間上的冗餘信息。
- 時間上的冗餘信息(temporal redundancy)- 在視頻數據中,相鄰的幀(frame)與幀之間通常有很強的關連性,這樣的關連性即爲時間上的冗餘信息。
- 空間上的冗餘信息(spatial redundancy)- 在同一張幀之中,相鄰的像素之間通常有很強的關連性,這樣的關連性即爲空間上的冗餘信息。
現在常見的視頻編碼有兩個系列:
- MPEG系列 - 包括 Mpeg1(用於VCD)、Mpeg2(用於DVD)、Mpeg4 AVC(現在流媒體使用最多的就是它了)
- H.26x系列 - 包括 H.261、H.262、H.263、H.264(現在視頻使用的最多就是它了)
IPB幀
MPEG定義了I幀、P幀、B幀,並根據不同幀實現了不同的壓縮算法
- I幀 - 幀內編碼幀,就是通過壓縮算法壓成一張單獨的完整視頻畫面,也是一組的第一幀,所以I幀去掉的是視頻幀在空間維度上的冗餘信息。
- P幀 - 前向預測編碼幀,需要參考其前面的一個I幀或者P幀來解碼成一張完整的視頻畫面 。
- B幀 - 雙向預測內插編碼幀,需要參考其前一個I幀或者P幀及其後面的一個P幀來生成一張完整的視頻畫面,所以P幀與B幀去掉的是視頻幀在時間維度上的冗餘信息。
注意:
在I幀中有一個特殊的幀IDR
,它也是一個I幀,如果在視頻編碼過程中出現一個IDR幀,那麼就意味着之後所有的幀不能再參考前面的幀了,其作用就相當於一個分水嶺。
前面我們說到,視頻是由一系列圖像組成,每個圖像就是一幀。圖像是一組一組處理的,一組幀常用的結構由15個幀組成,具有IBBPBBPBBPBBPBB形式,一組幀又叫GOP
,可以參考下圖
從上圖可以看到解碼順序和顯示順序是不一樣的,但是如果沒有B幀的話,那就是相同的了。
以上就是音視頻基礎的相關內容,大家如果有不明白或者不正確的地方,請在下方評論區留言,我們一起討論。
學習音視頻不容易,光基礎就是一個小難題!我覺得最好的方式有非常好的課程,可以循序漸進,有條理、系統的學習,給大家推薦Android架構師的經驗教學視頻
裏面包含FFmpeg編解碼專題,MediaCodec視頻編輯專題,直播推流專題,WebRtc視頻會議專題。帶你全面深入音視頻編碼原理,掌握音視頻開發技巧。
如果你想學習音視頻基礎知識,音視頻處理、編輯、特效相關的內容就重點學習ffmpeg。如果你想學習音視頻實時通訊(如音視頻會議、在線教育)就重點學習WebRTC相關內容。
小結
總之,音視頻已經強勢崛起,相信未來的十年一定是音視頻的十年。並且將音視頻技術與計算機視覺和人工智能結合將引領未來二十年。
以後我將多多分享相關文章,關注我不要迷路!
現在正是學習音視技術的最佳時機,大家一定要把握住機會,跟上時代的步伐,讓自己可以在未來大有作爲。