引言
在現(xiàn)在移動互聯(lián)網(wǎng)如火如荼的時代,流媒體業(yè)務(wù)在移動互聯(lián)網(wǎng)業(yè)務(wù)中所占的比重越來越大,特別是今年直播業(yè)務(wù)的興起,使互聯(lián)網(wǎng)社交進(jìn)入了直播時代,直播已經(jīng)成為很多APP特別是社交APP的標(biāo)配業(yè)務(wù)。站在一個程序員的角度(coding角度)來看,直播業(yè)務(wù)其實就是流媒體業(yè)務(wù)。那么流媒體業(yè)務(wù)開發(fā)涉及到哪些方面的知識呢?下面我們來看看一個流媒體數(shù)據(jù)(音頻數(shù)據(jù)和圖像數(shù)據(jù))從采集 ->處理->編碼和格式封裝 -> 傳輸-> 解碼 -> 播放
整個過程中所涉及到的知識點。例如一個直播業(yè)務(wù)的流媒體數(shù)據(jù)從采集到播放是這樣的:
采集
采集是整個過程中的第一個環(huán)節(jié),它從系統(tǒng)的采集設(shè)備中獲取原始視頻數(shù)據(jù),將其輸出到下一個環(huán)節(jié)。視頻的采集涉及兩方面數(shù)據(jù)的采集:音頻采集和圖像采集,它們分別對應(yīng)兩種完全不同的輸入源和數(shù)據(jù)格式。
-
音頻采集
采集源:麥克風(fēng)、系統(tǒng)聲音或者本地音頻文件等
-
采集內(nèi)容:
采集過程主要通過設(shè)備將環(huán)境中的模擬信號采集成 PCM 編碼的原始數(shù)據(jù),然后編碼壓縮成 MP3 等格式的數(shù)據(jù)分發(fā)出去。
音頻采集和編碼主要面臨的挑戰(zhàn)在于:延時敏感、卡頓敏感、噪聲消除(Denoise)、回聲消除(AEC)、靜音檢測(VAD)和各種混音算法等。
在音頻采集階段,參考的主要技術(shù)參數(shù)有 :
采樣率(samplerate):采樣就是把模擬信號數(shù)字化的過程,采樣頻率越高,記錄這一段音頻信號所用的數(shù)據(jù)量就越大,同時音頻質(zhì)量也就越高。
位寬:每一個采樣點都需要用一個數(shù)值來表示大小,這個數(shù)值的數(shù)據(jù)類型大小可以是:4bit、8bit、16bit、32bit 等等,位數(shù)越多,表示得就越精細(xì),聲音質(zhì)量自然就越好,而數(shù)據(jù)量也會成倍增大。我們在音頻采樣過程中常用的位寬是 8bit 或者 16bit。
聲道數(shù)(channels):由于音頻的采集和播放是可以疊加的,因此,可以同時從多個音頻源采集聲音,并分別輸出到不同的揚聲器,故聲道數(shù)一般表示聲音錄制時的音源數(shù)量或回放時相應(yīng)的揚聲器數(shù)量。聲道數(shù)為 1 和 2 分別稱為單聲道和雙聲道,是比較常見的聲道參數(shù)。
音頻幀(frame):音頻跟視頻很不一樣,視頻每一幀就是一張圖像,而從上面的正玄波可以看出,音頻數(shù)據(jù)是流式的,本身沒有明確的一幀幀的概念,在實際的應(yīng)用中,為了音頻算法處理/傳輸?shù)姆奖悖话慵s定俗成取 2.5ms~60ms 為單位的數(shù)據(jù)量為一幀音頻。這個時間被稱之為“采樣時間”,其長度沒有特別的標(biāo)準(zhǔn),它是根據(jù)編解碼器和具體應(yīng)用的需求來決定的。
根據(jù)以上定義,我們可以計算一下一幀音頻幀的大小。假設(shè)某音頻信號是采樣率為 8kHz、雙通道、位寬為 16bit,20ms 一幀,則一幀音頻數(shù)據(jù)的大小為:
size = 8000 x 2 x 16bit x 0.02s = 5120 bit = 640 byte
-
圖像采集
采集源:攝像頭、屏幕錄制或者本地的視頻文件等
-
采集內(nèi)容:
圖像采集圖像采集的圖片結(jié)果組合成一組連續(xù)播放的動畫,即構(gòu)成視頻中可肉眼觀看的內(nèi)容。圖像的采集過程主要由攝像頭等設(shè)備拍攝成 YUV 編碼的原始數(shù)據(jù),然后經(jīng)過編碼壓縮成 H.264 等格式的數(shù)據(jù)分發(fā)出去。
圖像由于其直觀感受最強(qiáng)并且體積也比較大,構(gòu)成了一個視頻內(nèi)容的主要部分。
圖像采集和編碼面臨的主要挑戰(zhàn)在于:設(shè)備兼容性差、延時敏感、卡頓敏感以及各種對圖像的處理操作如美顏和水印等。
在圖像采集階段,參考的主要技術(shù)參數(shù)有:
圖像傳輸格式:通用影像傳輸格式(Common Intermediate Format)是視訊會議(video conference)中常使用的影像傳輸格式。
圖像格式:通常采用 YUV 格式存儲原始數(shù)據(jù)信息,其中包含用 8 位表示的黑白圖像灰度值,以及可由 RGB 三種色彩組合成的彩色圖像。
傳輸通道:正常情況下視頻的拍攝只需 1 路通道,隨著 VR 和 AR 技術(shù)的日漸成熟,為了拍攝一個完整的 360° 視頻,可能需要通過不同角度拍攝,然后經(jīng)過多通道傳輸后合成。
分辨率:隨著設(shè)備屏幕尺寸的日益增多,視頻采集過程中原始視頻分辨率起著越來越重要的作用,后續(xù)處理環(huán)節(jié)中使用的所有視頻分辨率的定義都以原始視頻分辨率為基礎(chǔ)。視頻采集卡能支持的最大點陣反映了其分辨率的性能。
采樣頻率:采樣頻率反映了采集卡處理圖像的速度和能力。在進(jìn)行高度圖像采集時,需要注意采集卡的采樣頻率是否滿足要求。采樣率越高,圖像質(zhì)量越高,同時保存這些圖像信息的數(shù)據(jù)量也越大。
處理
視頻或者音頻完成采集之后得到原始數(shù)據(jù),為了增強(qiáng)一些現(xiàn)場效果或者加上一些額外的效果,我們一般會在將其編碼壓縮前進(jìn)行處理,比如打上時間戳或者公司 Logo 的水印,祛斑美顏和聲音混淆等處理
常見視頻處理功能:
-
美顏
美顏的主要原理是通過「磨皮+美白」來達(dá)到整體美顏的效果。磨皮的技術(shù)術(shù)語是「去噪」,也即對圖像中的噪點進(jìn)行去除或者模糊化處理,常見的去噪算法有均值模糊、高斯模糊和中值濾波等。當(dāng)然, 由于臉部的每個部位不盡相同,臉上的雀斑可能呈現(xiàn)出眼睛黑點的樣子,對整張圖像進(jìn)行「去噪」處理的時候不需要將眼睛也去掉,因此這個環(huán)節(jié)中也涉及到人臉和皮膚檢測技術(shù)
-
視頻水印
水印是圖片和視頻內(nèi)容中常見的功能之一,它可用于簡單是版權(quán)保護(hù),或者進(jìn)行廣告設(shè)置.也就是在視頻圖像上的某些位置添加上別的圖片或文字。
-
濾鏡
在 iOS 端可以考慮使用 GPUImage 這個庫,這是一個開源的基于GPU的圖片或視頻的處理框架,內(nèi)置了多達(dá)120多種常見的濾鏡效果。
-
特效
特效其實就是在視頻中添加一組動態(tài)的圖片水印。一般是基于人臉識別的。
編碼和格式封裝
-
編碼
編碼是對從采集源獲取到的數(shù)據(jù)或者處理過的數(shù)據(jù)按照某種規(guī)范進(jìn)行壓縮的技術(shù)。例如:移動端一般將從采集源獲取的音頻原始數(shù)據(jù)(PCM格式)編碼成AAC格式的數(shù)據(jù),常見的音頻壓縮格式有:MP3,AAC,HE-AAC,Opus,F(xiàn)LAC,Vorbis (Ogg),Speex 和 AMR等。從采集源獲取到的原始圖像數(shù)據(jù)(一般是YUV格式的)編碼成 h.264格式的數(shù)據(jù)。為什么要對這些原始數(shù)據(jù)進(jìn)行編碼,主要有兩個原因:
- 存儲困難 :因為原始數(shù)據(jù),體積很大。
- 傳輸困難 :占帶寬, 費流量。
為什么可以壓縮,主要是因為:
- 空間冗余:圖像相鄰像素之間有較強(qiáng)的相關(guān)性
- 時間冗余:視頻序列的相鄰圖像之間內(nèi)容相似
- 編碼冗余:不同像素值出現(xiàn)的概率不同
- 視覺冗余:人的視覺系統(tǒng)對某些細(xì)節(jié)不敏感
- 知識冗余:規(guī)律性的結(jié)構(gòu)可由先驗知識和背景知識得到
數(shù)據(jù)壓縮一般分為 無損壓縮(Lossless)和 有損壓縮(Lossy)
編碼方式:
- 軟件編碼 常用FFMpeg多媒體庫,利用CPU做視頻的編碼
- 硬件編碼 利用GPU或者專用處理器來對視頻流進(jìn)行編碼
軟件編碼比較通用,但是占用CPU資源,編解碼效率不高。硬件編碼效率很高。
-
封裝格式
所謂封裝格式也稱多媒體容器 (Multimedia Container),也就是將所有的處理好的視頻、音頻都包裝到一個文件容器內(nèi)呈現(xiàn)給觀眾,這個包裝的過程就叫封裝。常見的視頻封裝格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。
傳輸
傳輸是指:通過互聯(lián)網(wǎng),地面無線廣播,衛(wèi)星等方式將將壓縮的視頻碼流從編碼端傳輸?shù)浇獯a端。
解碼
解碼是對已編碼的視頻數(shù)據(jù)進(jìn)行還原解碼操作。
解碼方式:
> 1. 軟件解碼 常用FFMpeg多媒體庫,利用CPU做視頻的解碼
> 2. 硬件解碼 利用GPU或者專用處理器來對視頻流進(jìn)行解碼
軟件解碼比較通用,但是占用CPU資源,編解碼效率不高。硬件解碼效率很高。
播放
播放就是將解碼后的音頻數(shù)據(jù)通過音響等播放, 將視頻圖像數(shù)據(jù)通過顯示器等顯示。
總結(jié):以上是通過查相關(guān)資料整理后的一些個人理解。可能有誤敬請各位同學(xué)指導(dǎo)批判。后面還會分模塊詳解。其中參考了雷霄驊很多資料,在此向大神表示敬意。
未完待續(xù)。