最近要學音視頻,在圖書館借到這本《音視頻開發進階指南》,讀了一段時間以爲挺好就在某寶買了。html
之後一段時間應該都會沉浸在研究音視頻中,開個專題記錄哈每一章的讀書筆記吧(以iOS開發的角度記錄,安卓的暫時不涉及)。算法
本章介紹了 聲音、圖像、視頻的相關概念。筆者在書本的基礎上,研究了一些本身讀書時好奇的問題,而且記錄在這篇文章中。網絡
聲波的三要素:頻率、振幅和波形。頻率表明音階的高低,振幅表明響度,波形表明音色。post
頻率越高,波長就越短。低頻聲響的波長則較長,因此其能夠更容易地繞過障礙物,所以能量衰減就小,聲音就會傳得遠。人的聽力有一個頻率範圍,大約是20Hz~20kHz。學習
響度是能量大小的反應。ui
波的形狀決定了其所表明的音色。編碼
將模擬信號數字化,要通過3個步驟,採樣,量化和編碼。.net
採樣:在時間軸上對信號進行數字化。對應着聲音的頻率。3d
根據奈奎斯特定理,按比聲音最高頻率高2倍以上的頻率對聲音進行採樣,通過數字化處理以後,人耳聽到的聲音質量不會被下降。因此採樣頻率通常爲44.1kHz。orm
量化:在幅度軸上對信號進行數字化。對應着聲音的振幅。
好比,每一個採樣用16比特的二進制信號來表示,則範圍是[-32768, 32767]。
採樣和量化,能勾畫出波的形狀,即音色。聲波的三要素就轉化完成了。
編碼,就是按照必定的格式記錄採樣和量化後的數字數據,好比順序存儲或壓縮存儲,等等。
描述一段PCM數據通常須要如下幾個概念:量化格式(sampleFormat)、採樣率(sampleRate)、聲道數(channel)。
量化格式和採樣率上面提到過了,聲道數是指支持能不一樣發聲的音響的個數。不難理解,立體聲道的聲道數默認爲2個聲道。
以CD的音質爲例,量化格式(位深度)爲16比特,採樣率爲44100,聲道數爲2。
比特率 44100 * 16 * 2 = 1378.123kbps
一分鐘這類數據的存儲空間 1378.125 * 60 / 8 / 1024 = 10.09MB
壓縮編碼的原理其實是壓縮掉冗餘信號,冗餘信號是指不能被人耳感知到的信號,包含人耳聽覺範圍以外的音頻信號以及被掩蔽掉的音頻信號等。人耳聽覺範圍以外的音頻上面提到過。被掩蔽掉的音頻信號則主要是由於人耳的掩蔽效應,主要表現爲頻域掩蔽效應與時域掩蔽效應。
書上沒有介紹掩蔽效應,估計對於應用層的開發人員來講,不用理解也能夠。但筆者仍是查閱了一番,感嘆一句,人類真奇妙。
這裏引用了百度百科的資料,不感興趣的能夠直接略過。
頻域掩蔽效應
一個強純音會掩蔽在其附近同時發聲的弱純音,這種特性稱爲頻域掩蔽,也稱同時掩蔽(simultaneous masking)。如,一個聲強爲60dB、頻率爲1000Hz的純音,另外還有一個1100Hz的純音,前者比後者高18dB,在這種狀況下咱們的耳朵就只能聽到那個1000Hz的強音。若是有一個1000Hz的純音和一個聲強比它低18dB的2000Hz的純音,那麼咱們的耳朵將會同時聽到這兩個聲音。要想讓2000Hz的純音也聽不到,則須要把它降到比1000Hz的純音低45dB。通常來講,弱純音離強純音越近就越容易被掩蔽;低頻純音能夠有效地掩蔽高頻純音,但高頻純音對低頻純音的掩蔽做用則不明顯。
因爲聲音頻率與掩蔽曲線不是線性關係,爲從感知上來統一度量聲音頻率,引入了「臨界頻帶(criticalband)」的概念。一般認爲,在20Hz到16kHz範圍內有24個臨界頻帶。
時域掩蔽效應
除了同時發出的聲音之間有掩蔽現象以外,在時間上相鄰的聲音之間也有掩蔽現象,而且稱爲時域掩蔽。時域掩蔽又分爲超前掩蔽(pre-masking)和滯後掩蔽(post-masking),如圖12-05所示。產生時域掩蔽的主要緣由是人的大腦處理信息須要花費必定的時間。通常來講,超前掩蔽很短,只有大約5~20ms,而滯後掩蔽能夠持續50~200ms。這個區別也是很容易理解的。
下面介紹幾種經常使用的壓縮編碼格式。簡單看一下就行。
WAV 編碼的一種實現就是在PCM 數據格式的前面加上44字節,分別用來描述PCM 的採樣率、聲道數、數據格式等信息。
特色:音質很是好,大量軟件都支持。
適用場合:多媒體開發的中間文件、保存音樂和音效素材。
MP3,使用LAME 編碼的中高碼率的MP3文件,聽感上很是接近源WAV文件。
特色:音質在128Kbit/s以上表現還不錯,壓縮比比較高,大量軟件和硬件都支持,兼容性好。
適用場合:高比特率下對兼容性有要求的音樂欣賞。
特色:在小於128Kbit/s 的碼率下表現優異,而且多用於視頻中的音頻編碼。
適用場合:128Kbit/s 如下的音頻編碼,多用於視頻中音頻軌的編碼。
特色:能夠用比MP3更小的碼率實現比MP3更好的音質,高中低碼率下均有良好的表現,兼容性不夠好,流媒體特性不支持。
適用場合:語音聊天的音頻消息場景。
關於音頻的概念,書上就介紹到以上。但筆者還有困惑,一段音頻,播放器是怎麼知道它的採樣率、聲道數、數據格式呢?
因而筆者查閱到這篇文章WAV 文件格式。簡單點說,就是頭部的某一段,被定義下來表明的含義。因此編解碼就按照約定的意義執行。
至於其餘編碼格式,文件格式是怎麼樣的,就請讀者有須要的時候再查閱了。
假設一部手機屏幕的分辨率是 1280 * 720,說明有1280列,720行,因此整個手機屏幕就有1280 * 720 個像素點。每一個像素點由三個子像素點組成。這三個像素點分別爲紅、綠、藍,共同做用下造成一種顏色。
浮點表示:取值範圍爲 0.0 ~ 1.0,好比,在OpenGL ES中對每個子像素點的表示使用的就是這種表達方式。
整數表示:取值範圍爲 0 ~ 255 或者 00 ~ FF,8個比特表示一個子像素,32個比特表示一個像素,這就是相似於某些平臺上表示圖像格式的 RGBA_8888 數據格式。好比, Android 平臺上 RGB_565 的表示方法爲16比特模式表示一個像素, R 用5個比特來表示, G 用 6個比特來表示, B 用5個比特來表示。
對於一幅圖像,通常使用整數表示方法來進行描述,好比計算一張 1280 * 720 的 RGBA_8888圖像的大小,這也是位圖(bitmap)在內存中所佔用的大小。
1280 * 720 * 32 / 8 = 3.516MB
「Y」表示明亮度,也稱灰階值;而「U」和「V」表示的則是色度,它們的做用是描述影像的色彩及飽和度,用於指定像素的顏色。
「U」和「V」分別用Cr 和 Cb來表示。分別反映了 RGB 輸入信號紅色部分和藍色部分 與 RGB 信號亮度值之間的差別。
若是隻有 Y 信號份量而沒有U、V份量,那麼這樣表示的圖像就是黑白灰度圖像。
最經常使用的表示形式是Y、U、V都使用一個字節來表示,因此取值範圍就是 0 ~ 255。
YUV最經常使用的採樣格式是 4:2:0。
這並不意味着只有Y、Cb,沒有Cr份量。直接上圖,方便理解。
如下說的取樣針對UV份量。 4:4:4表示徹底取樣,每個Y對應一組UV份量。 4:2:2表示2:1的水平取樣,垂直徹底採樣,每兩個Y共用一組UV份量。 4:2:0表示2:1的水平取樣,垂直2:1採樣,每四個Y共用一組UV份量。
舉書本上一個例子,能夠看到,色度的抽樣率是4:1,即Y:U:V爲4:1:1。32個像素點,就有32個Y,U和V一共16個,按1字節來算,佔用48字節存儲空間。
這一部分略,就是套用一個合理的轉化公式轉換。
書上關於圖像就介紹到以上。筆者本身還查閱了圖像的文件組成。
jpg是有損壓縮格式,png是無損壓縮格式。
有關它們的區別。
對於jpg文件格式,查到這篇jpg文件格式分析。和WAV 文件格式原理相似。
有趣的是,文件格式裏有一段用於表述縮略圖的數據。
在iOS開發中,相冊顯示圖片時,能夠先讀取縮略圖。具體顯示時再加載原圖數據。
採集到的視頻源存在冗餘信息,咱們能夠經過幀間編碼技術以及幀內編碼技術分別去除時間上和空間上的冗餘信息。具體怎麼作以及爲何能夠這麼作,具體請看這篇文章,書上沒有介紹這部分。
通過一系列的去處冗餘信息,能夠大大的下降視頻的數據量,更利於視頻的保存、傳輸,去除冗餘信息的過程,咱們就稱之爲壓縮編碼。
壓縮編碼有不少標準,目前應用最普遍的是ITU-T 制定的H.264(AVC),以高壓縮高質量和支持多種網絡的流媒體傳輸著稱。
原理:分組,組內每一幀之間能夠經過互相參照,從而去掉冗餘的信息。
先來了解有關的概念
IPB 幀
通常來講 I的壓縮率是7,P的壓縮率是20,B能夠達到50。
兩個 I 幀之間造成的一組圖片,就是GOP(Group Of Picture)的概念。gop_size表示的是兩個 I 幀之間的幀數目。
在解碼器中,一旦接收到一個 IDR 幀,就會當即清理參考幀緩衝區,並將 IDR 幀做爲被參考的幀。
兩種不一樣的時間戳。DTS(Decoding Time Stame)主要用於視頻的解碼,PTS(Presentation Time Stamp) 主要用於在解碼階段進行視頻的同步和輸出。
前面說到B幀,是先後預測幀。因此在解碼時,會打亂解碼和顯示的順序。因此存在B幀,PTS 和 DTS勢必就會不一樣。
除了H.264,ISO制定的標準:Motion JPEG即,MPEG,MPEG 算法是適用於動態視頻的壓縮算法。
H.264 和 MPEG 只是編碼算法,文件後綴名取決於你選取的封裝容器。
書上第一章的內容介紹到以上就結束了。
跟音頻和圖像比起來,視頻的文件組成複雜不少。
2019.5.17更新
回看這章,以爲有必要補充一點知識。
封裝:運用編碼算法處理後,再封裝成某種類型的文件。例如PCM -> WAV,這種沒用到編碼算法,而後再文件數據頭添加一些說明音頻的信息,封裝成.wav文件。
解封裝:封裝的時候,會有音視頻的信息。解封裝時,根據這份說明,把二進制數據識別出來。
編碼:就是按照必定的格式記錄採樣和量化後的數字數據,好比順序存儲或壓縮存儲,等等。例如視頻進行壓縮編碼,去除空間冗餘信息。固然不可能每一幀都存滿每個像素點的數據,而是要利用說明信息,告訴是怎麼編的。
解碼:就是將視頻/音頻壓縮編碼數據,解碼成爲非壓縮的視頻/音頻原始數據。上面編完碼的視頻,根聽說明信息,生成每一幀的圖像。
視音頻同步:圖像和聲音的同步。視頻和音頻都有時間戳。有三種方法同步,第三章會提到。
協議/解協議:類比於計網協議。在網絡上傳輸時,遵照哪一個協議,接收端就做出相應的處理。協議除了音視頻數據,還能有播放等指令。
因此接收到網絡上的視頻流,會有如下步驟。
[1] 展曉凱,魏曉紅.音視頻開發進階指南(基於Android與iOS平臺的實踐)[M].北京:機械工業出版社,2018:1-13.