一、直播的基礎(chǔ)架構(gòu)
一個直播功能通用的基礎(chǔ)架構(gòu)涉及三個部分,即音視頻采集端、云服務(wù)端和音視頻播放端。
如下圖,是一個APP直播功能的架構(gòu):
從上圖中我們可以看到,每一個部分都有各自要處理的一些工作。
總體來說,視頻直播類功能的整體流程包括以下內(nèi)容:
音視頻采集音視頻處理音視頻編碼和封裝推流流媒體服務(wù)器處理拉流音視頻解碼音視頻播放在具體了解每個流程之前,我們先從音視頻的基本知識入手。
二、音視頻技術(shù)基礎(chǔ)
1. 音頻
聲音:
我們平時在手機或電腦里聽到的音頻,是已經(jīng)數(shù)字化了的音頻模擬信號。最初,這些音頻都是始于物理的聲音。
中學(xué)物理都學(xué)過,聲音是波,是通過物體的振動產(chǎn)生的。
聲波具有三要素:
音調(diào):也叫音頻,頻率越高,波長就會越短,而低頻聲響的波長則較長。所以這樣的聲音更容易繞過障礙物。能量衰減就越小,聲音就會傳播的越遠;音量:就是振動的幅度。用不同的力度敲打桌面,聲音的大小勢必發(fā)生變換。在生活中,我們用分貝描述聲音的響度;音色:在同樣的頻率和響度下,不同的物體發(fā)出的聲音不一樣。波形的形狀決定了聲音的音色。因為不同的介質(zhì)所產(chǎn)生的波形不同,就會產(chǎn)生不一樣的音色。模擬信號的數(shù)字化過程:
模擬信號的數(shù)字化過程,就是將模擬信號轉(zhuǎn)換為數(shù)字信號的過程,包括采樣、量化和編碼。
我們可以通過下圖理解這一過程:
采樣:可以理解為在時間軸上對信號進行數(shù)字化。通常用采樣率來保證一定頻率范圍內(nèi)的聲音可以被數(shù)字化成功,比如:采樣頻率一般是44.1KHZ,指的就是1秒會采樣44100次。量化:指的是在幅度軸上對信號進行數(shù)字化,就是聲音波形的數(shù)據(jù)是多少位的二進制數(shù)據(jù),單位是bit。
? ? ? ?比如:常用16bit的二進制信號來存放一個采樣,這又叫做量化級。量化級是數(shù)字聲音質(zhì)量的重要指標,通常將聲音描述為24bit(量化級)、48KHZ(采樣率)。編碼:按照一定的格式記錄采樣和量化后的數(shù)據(jù)。音頻編碼的格式有很多種,通常所說的音頻裸數(shù)據(jù)指的是脈沖編碼調(diào)制(PCM)數(shù)據(jù)。
? ? ? ?PCM音頻流的碼率可以用來描述PCM數(shù)據(jù),它的計算公式是:采樣頻率*采樣大?。炕墸?聲道數(shù)(單聲道、雙聲道和多聲道)。通過上述的流程,就實現(xiàn)了音頻信號的數(shù)字化過程。轉(zhuǎn)為數(shù)字信號之后,就可以對這些數(shù)據(jù)進行存儲、播放、復(fù)制獲取等其他操作了。
音頻編碼:
上面我們說到了,編碼就是按照一定的格式記錄采樣和量化后的數(shù)據(jù),那么到底為什么需要編碼呢?
采集和量化后的數(shù)據(jù)是非常大的,從存儲或者網(wǎng)絡(luò)實時傳播的角度來說,這個數(shù)據(jù)量都太大了。對于存儲和傳輸都是非常具有挑戰(zhàn)的,所以我們需要通過編碼來進行壓縮。
壓縮編碼的指標是壓縮比,壓縮比通常是小于1的。
壓縮編碼算法分為2種:有損壓縮和無損壓縮。
無損壓縮:解壓后的數(shù)據(jù)可以完全復(fù)原。在常用的壓縮格式。用的較多的都是有損壓縮。有損壓縮:解壓后的數(shù)據(jù)不能完全復(fù)原,會丟失一部分信息。壓縮比越小,丟失的信息就會越多,信號還原的失真就會越大。壓縮編碼的實質(zhì)就是壓縮冗余的信號,冗余信號就是指不能被人耳感知的信號,包括:人耳聽覺范圍之外的音頻信號以及被掩蓋掉的音頻信號。信號的掩蔽可以分為頻域掩蔽和時域掩蔽,關(guān)于信號的掩蔽大家可以自行百度一下,這里就不做過多闡述了。
那么,音頻壓縮編碼的常用格式都有哪些呢?
主要包括:WMA編碼;MP3編碼;AAC編碼,這個是現(xiàn)在比較熱門的有損壓縮編碼技術(shù),也是目前在直播或小視頻中常用的編碼格式;OGG編碼等。
2. 視頻
數(shù)字視頻:
我們平時在手機或PC上看到的視頻,是由內(nèi)容元素、編碼格式和封裝容器構(gòu)成的。
內(nèi)容元素:包括圖像(Image)、音頻(Audio)和元信息(Metadata)。編碼格式:包括視頻常用編碼格式H264,和音頻常用編碼格式AAC。封裝容器:這就是常見的文件格式,如MP4、MOV、FLV、RMVB、AVI等等。圖像:
圖像是人對視覺感知的物質(zhì)重現(xiàn)。三維圖像的對象包括:深度、紋理和亮度信息,二維圖像包括紋理和亮度信息,我們可以簡單的把紋理就理解為圖像。
說了圖像的概念,現(xiàn)在來說下視頻:視頻是由多幅圖像構(gòu)成的,是一組連續(xù)的圖像。一個基本的數(shù)字視頻,基本是通過“采集——處理——顯示”形成的。
編碼格式:
上面我們說到了音頻的編碼,視頻同樣是存在編碼的過程的。視頻編解碼的過程是指對數(shù)字視頻進行壓縮或解壓縮的過程。
在進行視頻的編解碼時,需要考慮以下因素的平衡:視頻的質(zhì)量、用來表示視頻所需要的數(shù)據(jù)量(通常稱之為碼率)、編碼算法和解碼算法的復(fù)雜度、針對數(shù)據(jù)丟失和錯誤的魯棒性、編輯的方便性、隨機訪問、編碼算法設(shè)計的完美性、端到端的延時以及其它一些因素。
常用的視頻編解碼方式有H.26X系列和MPEG系列,而目前最常用的視頻編碼格式是H.264,它的優(yōu)點是低碼率、圖像質(zhì)量高、容錯能力強、網(wǎng)絡(luò)適應(yīng)性更強,并且已被廣泛應(yīng)用于實時視頻應(yīng)用中。
再介紹一些關(guān)于H.264的知識:
在H.264中,圖像是包括幀、頂場和底場的,一副完整的圖像就是一幀。
當(dāng)采集視頻信號時,如果采用逐行掃描,則每次掃描得到的信號就是一副圖像,也就是一幀。如果采用隔行掃描(奇、偶數(shù)行),則掃描下來的一幀圖像就被分為了兩個部分,這每一部分就稱為場,根據(jù)次序分為:頂場(也成為偶數(shù)場)和底場(也成為奇數(shù)場)。
幀和場的概念又帶來了不同的編碼方式:幀編碼和場編碼。逐行掃描適合于運動圖像,所以對于運動圖像采用幀編碼更好;而隔行掃描適合于非運動圖像,所以對于非運動圖像采用場編碼更理想。
此外,每一幀圖像可以分為多個片,每一個片由宏塊構(gòu)成,而每個宏塊又是由子塊所構(gòu)成的。
封裝格式:
視頻的封裝格式可以看成是一個裝載著視頻、音頻、視頻編解碼方式等信息的容器。一種視頻封裝格式可以支持多種的視頻編解碼方式,比如:QuickTime(.MOV)支持幾乎所有的編解碼方式,MPEG(.MP4)也支持大部分的編解碼方式。
在PC上,我們經(jīng)常會使用.MOV的視頻文件。通過以上的介紹,我們就知道了,這個視頻的文件格式是.MOV,封裝格式是QuickTIme File Format,但是我們無法知道它的視頻編解碼方式。如果我們想要專業(yè)的去描述一個視頻,可以描述成:H.264/MOV的視頻文件,這就是說它的封裝方式是QuickTIme File Format,文件格式是.MOV,編碼方式是H.264。
H.264:
H.264是一種高性能的視頻編解碼技術(shù),是由“國際電聯(lián)”和“國際標準化組織ISO”聯(lián)合組建的聯(lián)合視頻組共同制定的新的數(shù)字視頻編碼標準。
我們在上面已經(jīng)說到了H.264編碼技術(shù)的優(yōu)勢,我們接下來看一下H.264所涉及的關(guān)鍵技術(shù):
我們首先要知道,無論是視頻或音頻編碼,其目的都是壓縮。視頻編碼的目的,是抽取出冗余信息,這些冗余信息包括:空間冗余、時間冗余、編碼冗余、視覺冗余和知識冗余。
基于此,H.264的壓縮技術(shù)涉及:
a)幀內(nèi)預(yù)測壓縮,解決的就是空間數(shù)據(jù)冗余問題。空間冗余數(shù)據(jù)就是圖里數(shù)據(jù)在寬高空間內(nèi)包含了很多顏色和光亮,人的肉眼很難察覺的數(shù)據(jù)。對于這些數(shù)據(jù),我們是可以直接壓縮掉的。
幀內(nèi)壓縮對應(yīng)的是I幀——即關(guān)鍵幀。那么什么是I幀呢?網(wǎng)上教程中有一個經(jīng)典的例子,如果攝像頭對著你拍攝,1秒之內(nèi)實際你發(fā)生的變化是非常少的。攝像機一般1秒鐘會抓取幾十幀的數(shù)據(jù),比如像動畫,就是25幀/s,一般視頻文件都是在30幀/s左右。那些對于一組幀來說變化很小的,為了便于壓縮數(shù)據(jù),就將第一幀完整的保存下來。如果沒有這個關(guān)鍵幀后面解碼數(shù)據(jù)是完成不了的,所以I幀是特別關(guān)鍵的。
b)幀間預(yù)測壓縮,解決的是時間數(shù)據(jù)冗余問題。在上面的例子中,攝像頭在一段時間內(nèi)所捕捉的數(shù)據(jù)沒有較大的變化,我們針對這一時間內(nèi)的相同的數(shù)據(jù)壓縮掉,這就是時間數(shù)據(jù)壓縮。
幀間壓縮對應(yīng)的是P幀和B幀。P幀是向前參考幀,壓縮時只參考前一個幀。而B幀是雙向參考幀,壓縮時即參考前一幀也參考后一幀。
c)整數(shù)離散余弦變換(DCT),將空間上的相關(guān)性變?yōu)轭l域上無關(guān)的數(shù)據(jù)然后進行量化。
d)CABAC壓縮:無損壓縮。
H.264除了上述的關(guān)鍵技術(shù),還有幾個重要的概念需要了解:
GOF:一組幀,就是一個I幀到下一個I幀,這一組的數(shù)據(jù)。包括B幀/P幀,我們稱為GOF。SPS和PPS:SPS和PPS是GOF的參數(shù),SPS是存放幀數(shù),參考幀數(shù)目,解碼圖像尺寸,幀場編碼模式選擇標識等。而PPS是存放熵編碼模式選擇標識,片組數(shù)目,初始量化參數(shù)和去方塊濾波系數(shù)調(diào)整標識等。在進行視頻解碼的時候,接收到一組幀GOF之前,我們首先收到的是SPS/PPS數(shù)據(jù),如果沒有這組參數(shù)的話,是無法進行解碼的。
因此,如果在解碼時發(fā)生錯誤,首先要檢查是否有SPS/PPS。如果沒有,就要檢查是因為對端沒有發(fā)送過來還是因為對端在發(fā)送過程中丟失了。
更加詳細的H.264編碼原理這里就不做介紹了,大家感興趣的可以上網(wǎng)查閱一下資料,比如:宏塊分組劃分、宏塊查找、幀內(nèi)預(yù)測、DCT壓縮以及H.264的碼流結(jié)構(gòu)等知識。
三、直播流程詳述
通過上面的介紹,我們已經(jīng)了解音視頻一些基本的知識。接下來,我們一起再描述一遍直播類應(yīng)用的整體流程。
1. 音視頻采集
在音視頻采集階段會包括:音頻采集和圖像采集。
在音頻采集時,除了上面我們說到的采樣率、量化級數(shù)和聲道數(shù)參數(shù)外,還需要音頻幀。
音頻跟視頻很不一樣,視頻每一幀就是一張圖像,而從聲音的正玄波可以看出:音頻數(shù)據(jù)是流式的,沒有明確的一幀幀的概念。在實際的應(yīng)用中,為了音頻算法處理/傳輸?shù)姆奖?,一般約定俗成取 2.5ms~60ms 為單位的數(shù)據(jù)量為一幀音頻。
這個時間被稱之為“采樣時間”,其長度沒有特別的標準,它是根據(jù)編解碼器和具體應(yīng)用的需求來決定的。
如果某音頻信號是采樣率為 8kHz、雙通道、量化級數(shù)是16bit,采樣時間是20ms,則一幀音頻數(shù)據(jù)的大小為:8000 * 2 * 16bit * 0.02s = 5120 bit = 640 byte
在圖像采集中,采集的圖片結(jié)果會組合成一組連續(xù)播放的動畫,即構(gòu)成視頻中可肉眼觀看的內(nèi)容。
圖像的采集過程主要由攝像頭等設(shè)備拍攝成 YUV 編碼的原始數(shù)據(jù),然后經(jīng)過編碼壓縮成 H.264 等格式的數(shù)據(jù)分發(fā)出去。在圖像采集階段,涉及的主要技術(shù)參數(shù)包括:圖像傳輸格式、圖像格式、傳輸通道、分辨率以及采樣率。
在音視頻的采集階段,常用的采集源包括攝像頭,比如手機的前后置攝像頭;游戲直播中使用的屏幕錄制;和電視節(jié)目中視頻文件的直接推流。
2. 音視頻處理
音視頻處理會分為:視頻處理和音頻處理。
視頻處理包括:美顏、濾鏡、面部識別、水印、剪輯拼接等。音頻處理包括:混音、降噪、聲音特效等。
下面我們簡要描述一下美顏和視頻水印的基本原理:
美顏的主要原理是通過【磨皮】+【美白】來達到整體美顏效果的。磨皮的技術(shù)術(shù)語是去噪,也就是對圖像中的噪點進行去除或者模糊化處理,常見的去噪算法有均值模糊、高斯模糊和中值濾波等。這個環(huán)節(jié)中也涉及到人臉和皮膚檢測技術(shù)。
視頻水印包括播放器水印和視頻內(nèi)嵌水印兩種方式。對于播放器水印來說,如果沒有有效的防盜措施,對于沒有播放鑒權(quán)的推流,客戶端拿到直播流之后可以在任何一個不帶水印的播放器里面播放,因此也就失去了視頻保護的能力。所以,一般來說會選擇視頻內(nèi)嵌水印的方式打水印,這樣,水印就會內(nèi)嵌到視頻之內(nèi),在視頻播放的過程中持續(xù)顯示。
再多聊一些,視頻內(nèi)嵌水印也會應(yīng)用在軟件中,軟件中播出企業(yè)內(nèi)部版權(quán)保護的動畫段視頻時,會應(yīng)用到內(nèi)嵌水印的技術(shù)。
3. 音視頻編碼和封裝
音視頻的編碼以及視頻的封裝在上述基礎(chǔ)知識部分已經(jīng)介紹過了,這里不再贅述。
在這里說一下編碼器的知識。上文中我們了解了H.264的編碼技術(shù),編碼流程是要基于編碼器進行的。
編碼器的主要流程是:幀內(nèi)預(yù)測(去除空間冗余)/幀間預(yù)測(去除時間冗余)——變換(去除空間冗余)——量化(去除視覺冗余)——熵編碼(去除編碼冗余)。通過該流程,即可完成音視頻的編碼步驟。
4. 推流
推流就是將處理過的音頻和視頻數(shù)據(jù)通過流媒體協(xié)議發(fā)送到流媒體服務(wù)器。
推流協(xié)議:
推流所遵循的協(xié)議有RTMP、WebRTC和基于UDP的私有協(xié)議。
RTMP協(xié)議是基于TCP協(xié)議的,RTMP 是目前主流的流媒體傳輸協(xié)議,廣泛用于直播領(lǐng)域,市面上絕大多數(shù)的直播產(chǎn)品都采用了這個協(xié)議。但是,由于基于TCP協(xié)議,傳輸成本高,在弱網(wǎng)環(huán)境下丟包率高,不支持瀏覽器推送。
? ? ? ?WebRTC是一個支持網(wǎng)頁瀏覽器進行實時語音對話或視頻對話的 API,主要應(yīng)用于視頻會議。它的主流瀏覽器支持度高,并且底層基于SRTP和UDP,弱網(wǎng)情況優(yōu)化空間大?;赨DP的私有協(xié)議。有些直播應(yīng)用會使用 UDP 做為底層協(xié)議開發(fā)自己的私有協(xié)議,因為 UDP在弱網(wǎng)環(huán)境下的優(yōu)勢通過一些定制化的調(diào)優(yōu)可以達到比較好的弱網(wǎng)優(yōu)化效果,但是開發(fā)成過高。CDN:
推出去的流媒體要給各個地理位置的觀眾看,那么這里就需要CDN網(wǎng)絡(luò)了。CDN就是為了解決用戶訪問網(wǎng)絡(luò)資源慢而產(chǎn)生的技術(shù)。
CDN包括邊緣節(jié)點、二級節(jié)點和源站。內(nèi)容提供方可以將內(nèi)容放到源站上,用戶從邊緣節(jié)點獲取數(shù)據(jù),而CDN的二級節(jié)點則用于緩存,減輕源站壓力。
在直播領(lǐng)域中,CDN要支持的服務(wù)如下:
流媒體協(xié)議的支持。比如RTMP等;首屏秒開。從用戶點擊到播放控制在秒級以內(nèi);1~3 延遲控制。從推流端到播放端,延遲控制在 1~3 秒之間;全球全網(wǎng)智能路由??梢岳谜麄€CDN網(wǎng)絡(luò)內(nèi)的所有節(jié)點為某一單一用戶服務(wù),不受地域限制。
5. 流媒體服務(wù)器處理
流媒體服務(wù)器要做的事情包括:數(shù)據(jù)分發(fā)(CDN)、支持上述CDN的一些服務(wù)、實時轉(zhuǎn)碼以及內(nèi)容的檢測(鑒黃)等。
6. 拉流
拉流就是客戶端從流媒體服務(wù)器上拉取獲得上述步驟中的音視頻數(shù)據(jù)。同理,這個過程也是要基于上述的協(xié)議和CDN。
7. 音視頻解碼
在上述H.264編碼的介紹中,說到了SPS/PPS是解碼必備的數(shù)據(jù)。此步驟就是需要對拉流下來已編碼的音視頻數(shù)據(jù)進行解碼。
解碼過程就是編碼的逆過程,這個過程包括:熵解碼、變換解碼、預(yù)測解碼。
H.264規(guī)范規(guī)定了解碼器的結(jié)構(gòu),解碼的過程大體如下:以宏塊為單位,依次進行熵解碼、反量化、反變換,得到殘差數(shù)據(jù)。再結(jié)合宏塊里面的預(yù)測信息,找到已解碼的被參考塊,進而結(jié)合已解碼被參考塊和本塊殘差數(shù)據(jù),得到本塊的實際數(shù)據(jù)。宏塊解碼后,組合出片,片再進而組合出圖像。
這里要說明的是:如果H264碼流中I幀錯誤或丟失,就會導(dǎo)致錯誤傳遞,單獨的P幀或B幀是完成不了解碼工作的。I幀所保留的是一張完整的視頻幀,是解碼的關(guān)鍵所在。
8. 音視頻播放
在完成了音視頻數(shù)據(jù)的解碼后,就可以通過硬件設(shè)備(手機或PC)上的播放器對音視頻文件進行渲染播放了。
那么,上述架構(gòu)圖中的信令服務(wù)器是干什么的呢?
——信令服務(wù)器是用來處理主播端和用戶端的一些信令指令的。
在網(wǎng)絡(luò)中傳輸著各種信號,其中一部分是我們需要的(例如:打電話的語音,上網(wǎng)的數(shù)據(jù)包等等),而另外一部分是我們不需要的(只能說不是直接需要)它用來專門控制電路的,這一類型的信號我們就稱之為信令(摘自百度百科)。也就是說,信令是指通信系統(tǒng)中的控制指令。