《音視訊開發進階指南》讀書筆記(一) —— 音視訊基礎概念

Hsusue發表於2019-05-11

前言

最近要學音視訊,在圖書館借到這本《音視訊開發進階指南》,讀了一段時間覺得挺好就在某寶買了。

《音視訊開發進階指南》讀書筆記(一) —— 音視訊基礎概念

以後一段時間應該都會沉浸在研究音視訊中,開個專題記錄哈每一章的讀書筆記吧(以iOS開發的角度記錄,安卓的暫時不涉及)。

第一章 音視訊基礎概念

本章介紹了 聲音、影像、視訊的相關概念。筆者在書本的基礎上,研究了一些自己讀書時好奇的問題,並且記錄在這篇文章中。

聲音的物理性質

聲波的三要素:頻率、振幅和波形。頻率代表音階的高低,振幅代表響度,波形代表音色。

頻率越高,波長就越短。低頻聲響的波長則較長,所以其可以更容易地繞過障礙物,因此能量衰減就小,聲音就會傳得遠。人的聽力有一個頻率範圍,大約是20Hz~20kHz

響度是能量大小的反應。

波的形狀決定了其所代表的音色。

數字音訊

將模擬訊號數字化,要經過3個步驟,取樣,量化和編碼。

取樣

取樣:在時間軸上對訊號進行數字化。對應著聲音的頻率。

根據奈奎斯特定理,按比聲音最高頻率高2倍以上的頻率對聲音進行取樣,經過數字化處理之後,人耳聽到的聲音質量不會被降低。所以取樣頻率一般為44.1kHz

量化

量化:在幅度軸上對訊號進行數字化。對應著聲音的振幅。

比如,每個取樣用16位元的二進位制訊號來表示,則範圍是[-32768, 32767]。


取樣和量化,能勾畫出波的形狀,即音色。聲波的三要素就轉化完成了。

《音視訊開發進階指南》讀書筆記(一) —— 音視訊基礎概念


編碼

編碼,就是按照一定的格式記錄取樣和量化後的數字資料,比如順序儲存或壓縮儲存,等等。

  • 音訊的裸資料格式,脈衝編碼調製,英文叫PCM(Pulse Code Modulation)。

描述一段PCM資料一般需要以下幾個概念:量化格式(sampleFormat)、取樣率(sampleRate)、聲道數(channel)。

量化格式和取樣率上面提到過了,聲道數是指支援能不同發聲的音響的個數。不難理解,立體聲道的聲道數預設為2個聲道。

  • 資料位元率,即1秒時間內的位元數目。

以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。這個區別也是很容易理解的。


下面介紹幾種常用的壓縮編碼格式。簡單看一下就行。

  1. WAV 編碼

WAV 編碼的一種實現就是在PCM 資料格式的前面加上44位元組,分別用來描述PCM 的取樣率、聲道數、資料格式等資訊。

特點:音質非常好,大量軟體都支援。

適用場合:多媒體開發的中間檔案、儲存音樂和音效素材。

  1. MP3 編碼

MP3,使用LAME 編碼的中高位元速率的MP3檔案,聽感上非常接近源WAV檔案。

特點:音質在128Kbit/s以上表現還不錯,壓縮比比較高,大量軟體和硬體都支援,相容性好。

適用場合:高位元率下對相容性有要求的音樂欣賞。

  1. AAC 編碼

image.png

特點:在小於128Kbit/s 的位元速率下表現優異,並且多用於視訊中的音訊編碼。

適用場合:128Kbit/s 以下的音訊編碼,多用於視訊中音訊軌的編碼。

  1. Ogg 編碼

特點:可以用比MP3更小的位元速率實現比MP3更好的音質,高中低位元速率下均有良好的表現,相容性不夠好,流媒體特性不支援。

適用場合:語音聊天的音訊訊息場景。


關於音訊的概念,書上就介紹到以上。但筆者還有困惑,一段音訊,播放器是怎麼知道它的取樣率、聲道數、資料格式呢?


WAV檔案的組成

於是筆者查閱到這篇文章WAV 檔案格式。簡單點說,就是頭部的某一段,被定義下來代表的含義。所以編解碼就按照約定的意義執行

至於其他編碼格式,檔案格式是怎麼樣的,就請讀者有需要的時候再查閱了。


影像的物理現象

  • 紅綠藍三種光無法被分解,故稱為三原色光。

假設一部手機螢幕的解析度是 1280 * 720,說明有1280列,720行,所以整個手機螢幕就有1280 * 720 個畫素點。每個畫素點由三個子畫素點組成。這三個畫素點分別為紅、綠、藍,共同作用下形成一種顏色。

image.png

影像的數值表示

RGB 表示方式

  • 浮點表示:取值範圍為 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

YUV表示方式

“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分量。

image.png

image.png

舉書本上一個例子,可以看到,色度的抽樣率是4:1,即Y:U:V為4:1:1。32個畫素點,就有32個Y,U和V一共16個,按1位元組來算,佔用48位元組儲存空間。

YUV 和 RGB 的轉化

這一部分略,就是套用一個合理的轉化公式轉換。


書上關於影像就介紹到以上。筆者自己還查閱了影像的檔案組成。

影像壓縮編碼格式及檔案的組成

jpg是有失真壓縮格式,png是無失真壓縮格式。

有關它們的區別。

《音視訊開發進階指南》讀書筆記(一) —— 音視訊基礎概念

對於jpg檔案格式,查到這篇jpg檔案格式分析。和WAV 檔案格式原理類似。

有趣的是,檔案格式裡有一段用於表述縮圖的資料。

《音視訊開發進階指南》讀書筆記(一) —— 音視訊基礎概念

在iOS開發中,相簿顯示圖片時,可以先讀取縮圖。具體顯示時再載入原圖資料。


視訊的編碼

採集到的視訊源存在冗餘資訊,我們可以通過幀間編碼技術以及幀內編碼技術分別去除時間上和空間上的冗餘資訊。具體怎麼做以及為什麼可以這麼做,具體請看這篇文章,書上沒有介紹這部分。

經過一系列的去處冗餘資訊,可以大大的降低視訊的資料量,更利於視訊的儲存、傳輸,去除冗餘資訊的過程,我們就稱之為壓縮編碼。


壓縮編碼有很多標準,目前應用最廣泛的是ITU-T 制定的H.264(AVC),以高壓縮高質量和支援多種網路的流媒體傳輸著稱。

原理:分組,組內每一幀之間可以通過互相參照,從而去掉冗餘的資訊。

先來了解有關的概念

  • IPB 幀

    • I 幀:幀內編碼幀,I幀通常是每個GOP(暫且理解為一個組)的第一個幀。
    • P 幀:前向預測編碼幀(predictive-frame),也稱預測幀。
    • B 幀:雙向預測內插編碼幀,也稱為雙向預測幀。

一般來說 I的壓縮率是7,P的壓縮率是20,B可以達到50。

  • GOP

兩個 I 幀之間形成的一組圖片,就是GOP(Group Of Picture)的概念。gop_size表示的是兩個 I 幀之間的幀數目。

  • IDR幀

在解碼器中,一旦接收到一個 IDR 幀,就會立即清理參考幀緩衝區,並將 IDR 幀作為被參考的幀。

  • PTS 與 DTS

兩種不同的時間戳。DTS(Decoding Time Stame)主要用於視訊的解碼,PTS(Presentation Time Stamp) 主要用於在解碼階段進行視訊的同步和輸出。


前面說到B幀,是前後預測幀。所以在解碼時,會打亂解碼和顯示的順序。所以存在B幀,PTS 和 DTS勢必就會不同。

《音視訊開發進階指南》讀書筆記(一) —— 音視訊基礎概念


除了H.264,ISO制定的標準:Motion JPEG即,MPEG,MPEG 演算法是適用於動態視訊的壓縮演算法。

H.264 和 MPEG 只是編碼演算法,檔案字尾名取決於你選取的封裝容器。


書上第一章的內容介紹到以上就結束了。

視訊壓縮編碼格式及檔案的組成

跟音訊和影像比起來,視訊的檔案組成複雜很多。


參考

  • [1] 展曉凱,魏曉紅.音視訊開發進階指南(基於Android與iOS平臺的實踐)[M].北京:機械工業出版社,2018:1-13.

相關文章