網際網路資訊的傳播與娛樂方式經歷了從文字到圖片再到音視訊的轉變,現如今抖音、快手等短視訊更是如日中天,特別是5G時代的到來,筆者相信網際網路對音視訊開發者的需求會迎來更大的增長需求,何況音視訊開發者因為其稀缺性薪酬本來就比較高。
在學習音視訊開發之前,我們先來了解一下音視訊的基本知識。
視訊檔案播放流程圖:
音訊
聲波的三要素:頻率、振幅和波形。頻率代表音階的高低,振幅代表響度,波形代表音色。
頻率越高,波長就越短。低頻聲響的波長則較長,所以其可以更容易地繞過障礙物,因此能量衰減就小,聲音就會傳得遠。人的聽力有一個頻率範圍,大約是20Hz~20kHz。
音訊資料的承載方式最常用的是脈衝編碼調製,即PCM。
數字訊號
在自然界中,聲音是連續不斷的,是一種模擬訊號,那怎樣才能把聲音儲存下來呢?那就是把聲音數字化,即轉換為數字訊號。
將模擬訊號數字化,要經過取樣、量化和編碼三個步驟。
音訊數字化有一個問題:數字訊號並不能連續儲存所有時間點的振幅。
實際上,音訊數字化並不需要儲存連續的訊號,就可以還原到人耳可接受的聲音。
取樣率
每一秒鐘所取樣的數目稱為取樣頻率或採率,單位為HZ(赫茲)。取樣頻率越高所能描述的聲波頻率就越高。
根據奈奎斯特定理,按比聲音最高頻率高2倍以上的頻率對聲音進行取樣,經過數字化處理之後,人耳聽到的聲音質量不會被降低。所以取樣頻率一般為44.1kHz。
- 8khz:電話等使用,對於記錄人聲已經足夠使用。
- 22.05khz:廣播使用頻率。
- 44.1khz:音訊CD。
- 48khz:DVD、數字電視中使用。
- 96khz-192khz:DVD-Audio、藍光高清等使用。
量化格式
量化格式也叫取樣大小或取樣精度,指的是一個取樣使用多少bit存放,一般是16bit,一個位元組是8bit。
編解碼
描述一段PCM資料一般需要以下幾個概念:量化格式(sampleFormat)、取樣率(sampleRate)、聲道數(channel)。 量化格式和取樣率上面提到過了,聲道數是指支援能不同發聲的音響的個數。不難理解,立體聲道的聲道數預設為2個聲道。
資料位元率,即1秒時間內的位元數目。
以CD的音質為例,量化格式(位深度)為16位元,樣率為44100,聲道數為2。
位元率: 位元率 = 取樣率 × 取樣深度 × 通道數 44100 * 16 * 2 = 1378.123kbps 注意這裡的k表示1024
一分鐘音訊資料的大小: 1378.125 * 60 / 8 / 1024 = 10.09MB
注意:1個位元組等於8位,也就是8位元
這不對啊,我們平時聽的陰影四五分鐘也才四五兆,到了你這裡怎麼一秒鐘就十多兆了呢?這就是編碼的功勞了。
我們先來看看位元率中的數字和字母到底是什麼意思?
首先128k的全稱“128kbps”,我們分解一下:128是數字,k是千位符,b是單位,s是秒,ps其實就是“/s”。這樣來看,128kbps就是128kb/s。也就是每秒128kb。請注意,這裡的b是小寫的b,也就是位。
知道了這個,我們就能算出來128kb的檔案大概佔用多少的儲存空間:
128*1000=128000b/s÷8=16000B/s÷1024=15.625KB/s
15.625KB/s*60=937.5KB/分鐘÷1024=0.9155MB/分鐘 所以,128kb的音訊檔案,大概每分鐘長度的大小都在0.92M或者916kb左右。
注意b和B是不同的概念
編碼就是一個壓縮的過程,而壓縮又分為有失真壓縮和無失真壓縮:
有失真壓縮就是去掉冗餘訊號,冗餘訊號是指不能被人耳感知到的訊號,包含人耳聽覺範圍之外的音訊訊號以及被掩蔽掉的音訊訊號等
無失真壓縮就是通過優化排列方式來達到壓縮目的。
常見的音訊編碼格式:
- WAV(無損)
WAV編碼就是在PCM資料格式的前面加上44位元組,分別用來描述PCM的取樣率、聲道數、資料格式等資訊。
特點:音質非常好,大量軟體都支援。 缺點:因為沒用經過壓縮,所以檔案佔用的儲存空間會特別大。
適用場合:多媒體開發的中間檔案、儲存音樂和音效素材。
- MP3(有損)
MP3具有不錯的壓縮比,使用LAME編碼(MP3編碼格式的一種實現)的中高位元速率的MP3檔案,聽感上非常接近源WAV檔案。現如今市面上的音樂大多是這種編碼格式。
特點:音質在128Kbit/s以上表現還不錯,壓縮比比較高,大量軟體和硬體都支援,相容性好。 缺點:由於技術比較落後,同樣位元速率下音質會比AAC、OGG差一些。
- AAC(有損)
AAC是新一代的音訊有失真壓縮技術,它通過一些附加的編碼技術(比如PS、SBR等),衍生出了LC-AAC、HE-AAC、HE-AAC v2三種主要的編碼格式。
LC-AAC是比較傳統的AAC,相對而言,其主要應用於中高位元速率場景的編碼(≥80Kbit/s);
HE-AAC(相當於AAC+SBR)主要應用於中低位元速率場景的編碼(≤80Kbit/s);
而新近推出的HE-AAC v2(相當於AAC+SBR+PS)主要應用於低位元速率場景的編碼(≤48Kbit/s)。事實上大部分編碼器都設定為≤48Kbit/s自動啟用PS技術,而>48Kbit/s則不加PS,相當於普通的HE-AAC。
特點:在小於128Kbit/s的位元速率下表現優異,並且多用於視訊中的音訊編碼。 不足:雖然在低位元速率上表現比MP3好一些,但是還沒有達到全面碾壓的地步。
適用場合:128Kbit/s以下的音訊編碼,多用於視訊中音訊軌的編碼。
AAC格式主要分為兩種:ADIF、ADTS。
ADIF:Audio Data Interchange Format。 音訊資料交換格式。這種格式的特徵是可以確定的找到這個音訊資料的開始,不能在音訊資料流中間開始的解碼,即它的解碼必須在明確定義的開始處進行。這種格式常用在磁碟檔案中。
ADTS:Audio Data Transport Stream。 音訊資料傳輸流。這種格式的特徵是它是一個有同步字的位元流,解碼可以在這個流中任何位置開始。它的特徵類似於mp3資料流格式。
ADTS可以在任意幀解碼,它每一幀都有頭資訊。ADIF只有一個統一的頭,所以必須得到所有的資料後解碼。且這兩種的header的格式也是不同的,目前一般編碼後的都是ADTS格式的音訊流。
- Ogg(有損)
Ogg是一種非常有潛力的編碼,在各種位元速率下都有比較優秀的表現,尤其是在中低位元速率場景下。Ogg除了音質好之外,還是完全免費的,這為Ogg獲得更多的支援打好了基礎。Ogg有著非常出色的演算法,可以用更小的位元速率達到更好的音質,128Kbit/s的Ogg比192Kbit/s甚至更高位元速率的MP3還要出色。但目前因為還沒有媒體服務軟體的支援,因此基於Ogg的數字廣播還無法實現。Ogg目前受支援的情況還不夠好,無論是軟體上的還是硬體上的支援,都無法和MP3相提並論。
特點:可以用比MP3更小的位元速率實現比MP3更好的音質,高中低位元速率下均有良好的表現。 缺點:相容性不夠好,流媒體特性不支援。
適用場合:語音聊天的音訊訊息場景。
- FLAC(無損)
FLAC是一套著名的自由音訊壓縮編碼,其特點是無失真壓縮。不同於其他有失真壓縮編碼如MP3 及AAC,它不會破壞任何原有的音訊資訊,所以可以還原音樂光碟音質。2012年以來它已被很多軟體及硬體音訊產品(如CD等)所支援.
FLAC與MP3不同,MP3是音訊壓縮編碼,但FLAC是無失真壓縮,也就是說音訊以FLAC編碼壓縮後不會丟失任何資訊,將FLAC檔案還原為WAV檔案後,與壓縮前的WAV檔案內容相同。這種壓縮與ZIP的方式類似,但FLAC的壓縮比率大於ZIP和RAR,因為FLAC是專門針對PCM音訊的特點設計的壓縮方式。而且可以使用播放器直接播放FLAC壓縮的檔案,就象通常播放你的MP3檔案一樣.
視訊
所謂視訊其實就是由很多的靜態圖片組成的。由於人類眼睛的特殊結構,畫面快速切換時,畫面會有殘留,所以靜態圖片快速切換的時候感覺起來就是連貫的動作。這就是視訊的原理。
視訊幀: 既然視訊是由許多靜態圖片組成的,那麼視訊的每一張靜態圖片就叫一幀。
視訊幀又分為I幀、B幀和P幀:
I幀:幀內編碼幀,大多數情況下I幀就是關鍵幀,就是一個完整幀,無需任何輔助就能獨立完整顯示的畫面。
B幀:幀是雙向預測幀。參考前後影像幀編碼生成。需要前面的 I/P 幀或者後面的 P 幀來協助形成一個畫面。
P幀:前向預測編碼幀。是一個非完整幀,通過參考前面的I幀或P幀生成畫面。
所以 I 幀是很關鍵的存在,壓縮 I 幀就可以很容易壓制掉空間的大小,而壓縮P幀和B幀可以壓縮掉時間上的冗餘資訊 。所以在視訊 seek 的時候,I 幀很關鍵,如果視訊 seek 之後發生往前的跳動,有可能就是你要seek到的位置沒用關鍵幀,這就需要處理了。好像Android自帶的播放器就會有這個問題,有時候無法精確地seek到某個位置。
還有一個叫 IDR 幀的概念,IDR都是I幀,可以防止一幀解碼出錯,導致後面所有幀解碼出錯的問題。 因為 H264 採用的是多幀預測,導致 I 幀不能作為獨立的觀察條件,所以多出一個叫 IDR 幀的特殊 I 幀用於參考,IDR 幀最關鍵的概念就是:在解碼器過程中一旦收到 IDR 幀,就會立即清空參考幀緩衝區,並將IDR幀作為被參考幀。這樣,即便前面一幀解碼出現重大錯誤,也不會蔓延到後面的資料中。
注:關鍵幀都是I幀,但是I幀不一定是關鍵幀 這是為什麼?求高人指點!!!
DTS全稱:Decoding Time Stamp。標示讀入記憶體中資料流在什麼時候開始送入解碼器中進行解碼。也就是解碼順序的時間戳。
PTS全稱:Presentation Time Stamp。用於標示解碼後的視訊幀什麼時候被顯示出來。
在沒有B幀的情況下,DTS和PTS的輸出順序是一樣的,一旦存在B幀,PTS和DTS則會不同。 因為解碼的順序和播放的順序可能是不一致的。
GOP(Group Of Picture)就是兩個 I 幀之間的距離,一般 GOP 設定得越大,畫面的效果就會越好,到那時需要解碼的時間就會越長。 所以如果位元速率固定而 GOP 值越大,P/B幀 數量會越多,畫面質量就會越高。
幀率: 幀率,即單位時間內幀的數量,單位為:幀/秒 或fps(frames per second)。幀率越高,每秒切換的圖片就越多,畫面越順滑,過渡越自然。 幀率的一般以下幾個典型值:
- 24/25 fps:1秒 24/25 幀,一般的電影幀率。
- 30/60 fps:1秒 30/60 幀,遊戲的幀率,30幀可以接受,60幀會感覺更加流暢逼真。 Android系統的高效能渲染就是以60幀為標準。
- 85 fps以上人眼基本無法察覺出來了,所以更高的幀率在視訊裡沒有太大意義。
色彩空間:
我們都知道RGB是三原色,通過RGB三種基礎色,可以混合出所有的顏色。
還有一張是YUV,這種色彩空間並不是我們熟悉的。這是一種亮度與色度分離的色彩格式。 早期的電視都是黑白的,即只有亮度值,即Y。有了彩色電視以後,加入了UV兩種色度,形成現在的YUV,也叫YCbCr。 Y:亮度,就是灰度值。除了表示亮度訊號外,還含有較多的綠色通道量。 U:藍色通道與亮度的差值。 V:紅色通道與亮度的差值。
因為人眼對亮度敏感,對色度不敏感,因此減少部分UV的資料量,人眼卻無法感知出來,這樣可以通過壓縮UV的解析度,在不影響觀感的前提下,減小視訊的體積。大大提高傳輸的效率和節省頻寬。 關於YUV這裡我就不多數了,後面我會專門寫一篇文章介紹。比如YUV444,YUV422,YUV420和YUV420sp以及YUV和RGB是如何轉換的等等。
視訊編碼格式:
視訊編碼格式有很多,比如H26x系列和MPEG系列的編碼,這些編碼格式都是為了適應時代發展而出現的。 其中,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)國際電傳視訊聯盟主導的。 MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的組織)主導。 H264是目前最主流的視訊編碼標準,目前大多數的視訊和流媒體都是使用這種編碼格式。
H264編碼演算法是十分複雜,不是三言兩語能夠講清楚的,也不在我的能力範圍只能,我們要做到的就是知道怎麼使用就好了。
編解碼
編碼:編碼就是將原始音訊資料也就是PCM壓縮的一個過程;或者是將原始的視訊資料RGB或YUV壓縮的一個過程。
解碼:解碼就是編碼一個逆過程,比如將編碼後的資料AAC解碼成PCM給播放器播放;或者將編碼後的H264資料解碼成YUV或RGB給播放器渲染的過程。
編解碼又分為硬體編解碼和軟體編解碼。
軟體編解碼就是指利用CPU的計算能力來進行編解碼碼,通常如果CPU的能力不是很強的時候,一則編解碼速度會比較慢,二則手機可能出現發熱現象。但是,由於使用統一的演算法,相容性會很好。
硬體編解碼解碼,指的是利用手機上專門的解碼晶片來加速解碼。通常硬解碼的解碼速度會快很多,但是由於硬解碼由各個廠家實現,質量參差不齊,非常容易出現相容性問題。
封裝格式
封裝格式業界也又人稱音視訊容器,比如我們經常看到的視訊字尾名:mp4、rmvb、avi、mkv、mov
等就是音視訊的容器,它們將音訊和視訊甚至是字幕一起打包進去,封裝成一個檔案。
結語
對於音視訊的基礎知識今天先介紹到這裡,如果你對音視訊開發感興趣可掃碼關注,後續我們共同探討,共同進步。