音視頻行業已經發展不少年了,隨着近幾年移動端愈來愈多的音視頻APP的出現,將音視頻推向一個高潮,可是因爲音視頻的學習成本很高,不少開發者望而卻步,爲了跟緊時代的步伐,我寫了這篇音視頻基礎,講解了音視頻的相關知識,給你們破除音視頻的「高門檻」,但願能夠共同進步。git
將聲音保存成音頻的過程,其實就是將模擬音頻數字化的過程,爲了實現這個過程,就須要對模擬音頻進行採樣、量化和編碼。接下來咱們詳細講解這一過程。算法
採樣是將信號從連續時間域上的模擬信號轉換到離散時間域上的離散信號的過程(離散就是不連續),根據著名的奈奎斯特定理,須要按聲音最高頻率2倍進行採樣,人耳能聽到的聲音是20Hz~20kHz,因此通常針對聲音的採樣率是44.1KHz(爲何是44.1KHz呢,而不是40KHz?由於通過嘗試使用這個採樣率進行採樣效果最好)。下面列表一些其餘的採樣率,可做爲參考。bash
如上圖所示就是一個採樣的過程,將模擬音頻在連續的時間域上,切割成不連續的時間域的信號過程,便是對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
。人工智能
Stereo
取代當咱們站在不一樣位置聽單聲道時,它呈現的效果是不同的,而立體聲則否則,在不一樣方向仍可保持天然與悅耳,如今CD通常都是雙聲道立體聲,那聲道數就是2個。spa
所謂編碼,就是按照必定的格式記錄採樣和量化後的數字數據,好比順序存儲或壓縮存儲空間了。從宏觀上能夠分紅兩類:壓縮編碼和非壓縮編碼。3d
一個存儲的格式有不少種,一般音頻裸數據便是咱們所說的PCM,也叫脈衝編碼調製(英語:Pulse-code modulation,縮寫:PCM)是一種模擬信號的數字化方法,它是一種非壓縮編碼格式。
一般描述一段PCM數據須要如下幾個概念:
通常咱們使用碼率
來描述音頻,便是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格式的,那麼它必定是有損壓縮,也就是咱們所說的假無損。常見的有損壓縮以下:
說完音頻,咱們來講說視頻,首先得說說視頻是什麼?咱們都知道視頻是由一幀一幀聯繫圖像構成的,因此再介紹視頻以前,先得了解一下什麼是圖像?
咱們從小學習物理知識就知道,經過三菱鏡就能夠將光色散成不一樣的顏色,通過進一步研究發現,只有紅(R)、綠(G)、藍(B)不能被分解,因此它們被稱爲光的三原色。
通常咱們買手機的時候會參考它的分辨率,固然是分辨率越大越好,由於越大越清晰,更接近事物的原始樣貌,那這是爲何呢?
其實爲了讓人可以在手機上感知圖像,也採用了這樣的RGB模式。以「1080x1920」爲例,那就是每個橫向就有1080個像素點,縱向有1920個像素點,那總共就有1080x1920=2073600個像素。每個像素又包含了紅(R)、綠(G)、藍(B)三個子像素,這樣每一個像素就能夠有本身的所有顏色呈現。
咱們知道紅(R)、綠(G)、藍(B)均可以使用00~FF或者0~255表示,由上面咱們知道8比特恰好能夠表示0~255,一個像素又包含了紅(R)、綠(G)、藍(B)三個子像素,那一個像素至少須要24位,咱們通常還要給顏色加上一個不透明度(A),因此一個像素實際上是32位,這種表示方式就是咱們經常使用的RGBA_8888
,那若是一張圖片要在上面分辨率的手機上全屏展現出來須要多大的空間呢?
1080*1920*4 = 8294400b = 8100kb = 7.91Mb
複製代碼
這也是位圖(bitmap)在內存中所佔用的大小,每一張圖像的裸數據都是很大的,因此在手機上若是直接加載bitmap的話,很快就會內存溢出。因此若是讓圖像直接在網絡上行走的話確定是不行的,通常都會進行一個壓縮,常見的壓縮格式有:
這是就是爲何在製做小圖(好比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:二、YCbCr 4:1:1和YCbCr 4:4:4。YUV的表示法稱爲A:B:C表示法:
咱們再對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。
在介紹編碼以前,咱們先介紹兩個概念:
咱們就能夠計算一下在1080* 1920的手機上播放YUV420視頻數據的比特率:
bitRate = 1080* 1920* (1+0.5+0)* 24 = 71.2 Mbps
複製代碼
還能夠得出90分鐘電影數據量:
total = bitRate * 60 * 90 = 375.42 GB
複製代碼
這對於咱們來講是確定不能接受的,因此就必須對其進行編碼,跟音頻編碼相似,通常採用壓縮編碼,否則就沒得玩咯~
與音頻編碼不一樣,視頻數據之間有很強的關聯性,也就是由大量的冗餘信息,包括時間上的冗餘信息和空間上的冗餘信息。
如今常見的視頻編碼有兩個系列:
MPEG定義了I幀、P幀、B幀,並根據不一樣幀實現了不一樣的壓縮算法
注意:
在I幀中有一個特殊的幀IDR
,它也是一個I幀,若是在視頻編碼過程當中出現一個IDR幀,那麼就意味着以後全部的幀不能再參考前面的幀了,其做用就至關於一個分水嶺。
前面咱們說到,視頻是由一系列圖像組成,每一個圖像就是一幀。圖像是一組一組處理的,一組幀經常使用的結構由15個幀組成,具備IBBPBBPBBPBBPBB形式,一組幀又叫GOP
,能夠參考下圖
從上圖能夠看到解碼順序和顯示順序是不同的,可是若是沒有B幀的話,那就是相同的了。
以上就是音視頻基礎的相關內容,你們若是有不明白或者不正確的地方,請在下方評論區留言,咱們一塊兒討論。
學習音視頻不容易,光基礎就是一個小難題!我以爲最好的方式有很是好的課程,能夠按部就班,有條理、系統的學習,給你們推薦Android架構師的經驗教學視頻
裏面包含FFmpeg編解碼專題,MediaCodec視頻編輯專題,直播推流專題,WebRtc視頻會議專題。帶你全面深刻音視頻編碼原理,掌握音視頻開發技巧。
若是你想學習音視頻基礎知識,音視頻處理、編輯、特效相關的內容就重點學習ffmpeg。若是你想學習音視頻實時通信(如音視頻會議、在線教育)就重點學習WebRTC相關內容。
總之,音視頻已經強勢崛起,相信將來的十年必定是音視頻的十年。而且將音視頻技術與計算機視覺和人工智能結合將引領將來二十年。
之後我將多多分享相關文章,關注我不要迷路!
如今正是學習音視技術的最佳時機,你們必定要把握住機會,跟上時代的步伐,讓本身能夠在將來大有做爲。