零基礎入門:實時音視頻技術基礎知識全面盤點

本文引用自公衆號“開發的貓”,本次收錄時有改動,感謝原作者“開發的貓”的分享。

1、引言

隨着移動網絡速度越來越快、質量越來越來,實時音視頻技術已經在各種應用場景下全面開花,語音通話、視頻通話、視頻會議、遠程白板、遠程監控等等。

實時音視頻技術的開發也越來越受到重視,但是由於音視頻開發涉及知識面比較廣,入門門檻相對較高,讓許許多多開發者望而生畏。

雖然網上有很多的博文總結了實時音視頻技術的學習路線,但是相關的知識都相對獨立,有講“音視頻解碼相關”的、有講“OpenGL相關”的、也有講“FFmpeg相關的”、還有講“RTP/RTCP、RTMP、HLS、QUIC等通信相關的”,但是對於新手來說,把所有的知識銜接串聯起來,並很好的理解所有的知識,卻是非常困難的。

本人在學習音視頻開發的過程中,深刻體會到了由於知識的分散、過渡斷層帶來的種種困惑和痛苦,因此希望通過自己的理解,可以把音視頻開發相關的知識總結出來,並形成系列文章,循序漸進,剖析各個環節,一則對自己所學做一個總結和鞏固,二則希望可以幫助想入門音視頻開發的開發者小夥伴們。

本文是作者自已根據入門實時音視頻的親身經歷,對於基礎知識點的認知總結。雖然很淺顯,但相對小白來說,能稍微系統的瞭解這些概念就已經是很好的起點了。

本文已同步發佈於“即時通訊技術圈”公衆號。

2、相關文章

零基礎,史上最通俗視頻編碼技術入門》(* 必讀

3、視頻是什麼?

3.1 動畫書

不知道大家小時候是否玩過一種動畫小人書,連續翻動的時候,小人書的畫面就會變成一個動畫,類似現在的gif格式圖片。 

本來是一本靜態的小人書,通過翻動以後,就會變成一個有趣的小動畫,如果畫面夠多,翻動速度夠快的話,這其實就是一個小視頻。

而視頻的原理正是如此,由於人類眼睛的特殊結構,畫面快速切換時,畫面會有殘留,感覺起來就是連貫的動作。所以,視頻就是由一系列圖片構成的。

3.2 視頻幀

幀,是視頻的一個基本概念,表示一張畫面,如上面的翻頁動畫書中的一頁,就是一幀。一個視頻就是由許許多多幀組成的。

3.3 幀率

幀率,即單位時間內幀的數量,單位爲:幀/秒 或fps(frames per second)。如動畫書中,一秒內包含多少張圖片,圖片越多,畫面越順滑,過渡越自然。

幀率的一般以下幾個典型值:

  • 1)24/25 fps:1秒 24/25 幀,一般的電影幀率;
  • 2)30/60 fps:1秒 30/60 幀,遊戲的幀率,30幀可以接受,60幀會感覺更加流暢逼真。

85 fps以上人眼基本無法察覺出來了,所以更高的幀率在視頻裏沒有太大意義。

3.4 色彩空間

這裏我們只講常用到的兩種色彩空間。

  • 1)RGB:RGB的顏色模式應該是我們最熟悉的一種,在現在的電子設備中應用廣泛。通過R G B三種基礎色,可以混合出所有的顏色;
  • 2)YUV:這裏着重講一下YUV,這種色彩空間並不是我們熟悉的。這是一種亮度與色度分離的色彩格式。

早期的電視都是黑白的,即只有亮度值,即Y。有了彩色電視以後,加入了UV兩種色度,形成現在的YUV,也叫YCbCr。

  • 1)Y:亮度,就是灰度值。除了表示亮度信號外,還含有較多的綠色通道量;
  • 2)U:藍色通道與亮度的差值;
  • 3)V:紅色通道與亮度的差值。

如下圖,可以看到Y、V、U 3個分量的效果差值: 

採用YUV有什麼優勢呢?

人眼對亮度敏感,對色度不敏感,因此減少部分UV的數據量,人眼卻無法感知出來,這樣可以通過壓縮UV的分辨率,在不影響觀感的前提下,減小視頻的體積。

RGB和YUV的換算:

Y = 0.299R + 0.587G + 0.114B

U = -0.147R - 0.289G + 0.436B

V = 0.615R - 0.515G - 0.100B

——————————————————

R = Y + 1.14V

G = Y - 0.39U - 0.58V

B = Y + 2.03U

3.5 進一步學習

如果你認爲上面的文字還是有點專業,則強烈建議閱讀下文:《零基礎,史上最通俗視頻編碼技術入門》,絕對史上最通俗!

4、音頻是什麼?

4.1 基本知識

音頻數據的承載方式最常用的是脈衝編碼調製,即 PCM

在自然界中,聲音是連續不斷的,是一種模擬信號,那怎樣才能把聲音保存下來呢?那就是把聲音數字化,即轉換爲數字信號。

我們知道聲音是一種波,有自己的振幅和頻率,那麼要保存聲音,就要保存聲音在各個時間點上的振幅。

而數字信號並不能連續保存所有時間點的振幅,事實上,並不需要保存連續的信號,就可以還原到人耳可接受的聲音。

根據奈奎斯特採樣定理:爲了不失真地恢復模擬信號,採樣頻率應該不小於模擬信號頻譜中最高頻率的2倍。

根據以上分析,PCM的採集步驟分爲以下步驟:

模擬信號 -> 採樣 -> 量化 -> 編碼 -> 數字信號

4.2 採樣率和採樣位數

採樣率,即採樣的頻率。

上面提到,採樣率要大於原聲波頻率的2倍,人耳能聽到的最高頻率爲20kHz,所以爲了滿足人耳的聽覺要求,採樣率至少爲40kHz,通常爲44.1kHz,更高的通常爲48kHz。

採樣位數,涉及到上面提到的振幅量化。波形振幅在模擬信號上也是連續的樣本值,而在數字信號中,信號一般是不連續的,所以模擬信號量化以後,只能取一個近似的整數值,爲了記錄這些振幅值,採樣器會採用一個固定的位數來記錄這些振幅值,通常有8位、16位、32位。

位數越多,記錄的值越準確,還原度越高。

4.3 編碼

最後就是編碼了。由於數字信號是由0,1組成的,因此,需要將幅度值轉換爲一系列0和1進行存儲,也就是編碼,最後得到的數據就是數字信號:一串0和1組成的數據。

整個過程如下: 

4.4 聲道數

聲道數,是指支持能不同發聲(注意是不同聲音)的音響的個數。

單聲道:1個聲道

雙聲道:2個聲道

立體聲道:默認爲2個聲道

立體聲道(4聲道):4個聲道

4.5 碼率

碼率,是指一個數據流中每秒鐘能通過的信息量,單位bps(bit per second)。

碼率 = 採樣率 * 採樣位數 * 聲道數

5、爲什麼要編碼

這裏的編碼和上面音頻中提到的編碼不是同個概念,而是指壓縮編碼。

我們知道,在計算機的世界中,一切都是0和1組成的,音頻和視頻數據也不例外。由於音視頻的數據量龐大,如果按照裸流數據存儲的話,那將需要耗費非常大的存儲空間,也不利於傳送。而音視頻中,其實包含了大量0和1的重複數據,因此可以通過一定的算法來壓縮這些0和1的數據。

特別在視頻中,由於畫面是逐漸過渡的,因此整個視頻中,包含了大量畫面/像素的重複,這正好提供了非常大的壓縮空間。

因此,編碼可以大大減小音視頻數據的大小,讓音視頻更容易存儲和傳送。

那麼,未經編碼的原始音視頻,數據量至底有多大?

以一個分辨率1920×1280,幀率30的視頻爲例:

共:1920×1280=2,073,600(Pixels 像素),每個像素點是24bit(前面算過的哦);

也就是:每幅圖片2073600×24=49766400 bit,8 bit(位)=1 byte(字節);

所以:49766400bit=6220800byte≈6.22MB。

這是一幅1920×1280圖片的原始大小,再乘以幀率30。

也就是說:每秒視頻的大小是186.6MB,每分鐘大約是11GB,一部90分鐘的電影,約是1000GB。。。

以上舉例引用自:《零基礎,史上最通俗視頻編碼技術入門

6、視頻編碼

視頻編碼格式有很多,比如H26x系列和MPEG系列的編碼,這些編碼格式都是爲了適應時代發展而出現的。

其中,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)國際電傳視訊聯盟主導

MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的組織)主導。

當然,他們也有聯合制定的編碼標準,那就是現在主流的編碼格式H264,當然還有下一代更先進的壓縮編碼標準H265。

視頻編碼知識比較專業,限於篇幅,我就不在此展開討論了。

7、音頻編碼

原始的PCM音頻數據也是非常大的數據量,因此也需要對其進行壓縮編碼。

和視頻編碼一樣,音頻也有許多的編碼格式,如:WAV、MP3、WMA、APE、FLAC等等,音樂發燒友應該對這些格式非常熟悉,特別是後兩種無損壓縮格式。

但是,我們今天的主角不是他們,而是另外一個叫AAC的壓縮格式。本節以AAC格式爲例,直觀的瞭解音頻壓縮格式。

AAC是新一代的音頻有損壓縮技術,一種高壓縮比的音頻壓縮算法。在MP4視頻中的音頻數據,大多數時候都是採用AAC壓縮格式。

AAC格式主要分爲兩種:ADIF、ADTS。

1)ADIF:Audio Data Interchange Format。音頻數據交換格式。這種格式的特徵是可以確定的找到這個音頻數據的開始,不需進行在音頻數據流中間開始的解碼,即它的解碼必須在明確定義的開始處進行。這種格式常用在磁盤文件中。

2)ADTS:Audio Data Transport Stream。音頻數據傳輸流。這種格式的特徵是它是一個有同步字的比特流,解碼可以在這個流中任何位置開始。它的特徵類似於mp3數據流格式。

ADTS可以在任意幀解碼,它每一幀都有頭信息。ADIF只有一個統一的頭,所以必須得到所有的數據後解碼。且這兩種的header的格式也是不同的,目前一般編碼後的都是ADTS格式的音頻流。

ADIF數據格式:

header | raw_data

ADTS 一幀 數據格式(中間部分,左右省略號爲前後數據幀):

AAC內部結構也不再贅述,如果有興趣,可以參考《AAC 文件解析及解碼流程》。

8、音視頻容器

細心的讀者可能已經發現,前面我們介紹的各種音視頻的編碼格式,沒有一種是我們平時使用到的視頻格式,比如:mp4、rmvb、avi、mkv、mov...

沒錯,這些我們熟悉的視頻格式,其實是包裹了音視頻編碼數據的容器,用來把以特定編碼標準編碼的視頻流和音頻流混在一起,成爲一個文件。

例如:mp4支持H264、H265等視頻編碼和AAC、MP3等音頻編碼。

mp4是目前最流行的視頻格式,在移動端,一般將視頻封裝爲mp4格式。

對於音視頻編碼格式和容器之間的關係,可以詳細讀《零基礎,史上最通俗視頻編碼技術入門》一文中的“6、視頻編碼的國際標準”一節。

9、硬解碼和軟解碼

我們在一些播放器中會看到,有硬解碼和軟解碼兩種播放形式給我們選擇,但是我們大部分時候並不能感覺出他們的區別,對於普通用戶來說,只要能播放就行了。

那麼他們內部究竟有什麼區別呢?

在手機或者PC上,都會有CPU、GPU或者解碼器等硬件。通常,我們的計算都是在CPU上進行的,也就是我們軟件的執行芯片,而GPU主要負責畫面的顯示(是一種硬件加速)。

所謂軟解碼:就是指利用CPU的計算能力來解碼,通常如果CPU的能力不是很強的時候,一則解碼速度會比較慢,二則手機可能出現發熱現象。但是,由於使用統一的算法,兼容性會很好。

所謂硬解碼:指的是利用手機上專門的解碼芯片來加速解碼。通常硬解碼的解碼速度會快很多,但是由於硬解碼由各個廠家實現,質量參差不齊,非常容易出現兼容性問題。

10、參考資料

[1] 音視頻開發基礎知識

[2] YUV顏色編碼解析

[3] YUV數據格式

[4] 音頻基礎知識

[5] AAC 文件解析及解碼流程

[6] 入門理解H264編碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章