視頻直播是指利用互聯(lián)網(wǎng)及流媒體技術(shù),硬件視頻采集卡組合起來進(jìn)行直播,視頻包含了圖像、聲音、文字等重要元素,圖文聲三者合一,效果極佳,逐漸成為互聯(lián)網(wǎng)的主流方式。視頻通過真實(shí)、生動(dòng)的直播,營(yíng)造出強(qiáng)烈的現(xiàn)場(chǎng)感,吸引眼球,達(dá)成印象深刻、記憶持久的傳播效果,能夠真實(shí)、直觀、快速、全面、展示自己一個(gè)完整的流媒體平臺(tái)。
視頻直播,主要涉及到采集、預(yù)處理、編碼、傳輸、服務(wù)器轉(zhuǎn)碼、解碼這樣一個(gè)流程。
一、視頻采集:通過視頻采集卡或編碼器進(jìn)行圖像采集和音頻采集;
圖像采集設(shè)置攝像頭、攝像機(jī),并配置采集的參數(shù)、圖像數(shù)據(jù)的長(zhǎng)寬、fps、輸出的方向、橫屏豎屏等,然后從回調(diào)中取到數(shù)據(jù)。
音頻采集和編碼主要面臨的挑戰(zhàn)在于:噪聲消除、回聲消除等。
前期不需要音頻數(shù)據(jù)處理需求的時(shí)候,只需配置音頻采集的采樣率、碼率和聲道。
二、預(yù)處理:分為音頻處理和視頻處理兩個(gè)方面。
音頻處理是直播難點(diǎn)之一,直播環(huán)境會(huì)有噪音,所以直播的音頻處理是整體降噪的過程。增益降噪等處理可直接從項(xiàng)目中抽出來的聲音處理代碼,然后調(diào)用、處理。如有類似在直播的時(shí)候播放背景音樂的混音需求,就需要實(shí)現(xiàn)音頻數(shù)據(jù)的混音,而還需要將混音的背景音樂轉(zhuǎn)成PCM數(shù)據(jù),拷貝一份送入混音,原來的數(shù)據(jù)送入播放器。
濾鏡、美顏功能是直播標(biāo)配,如果需要美白、水印、裁剪等處理效果,還要考慮到拿到的數(shù)據(jù)是YUV還是RGB。通過軟件進(jìn)行采集和美白、水印、裁剪的處理,然后取出來進(jìn)行編碼上傳,并顯示在預(yù)覽畫面上。
三、編碼:
編碼:現(xiàn)在廣泛采用FFmpeg庫(kù)結(jié)合編碼庫(kù)來實(shí)現(xiàn),F(xiàn)Fmpeg+x264來編碼視頻數(shù)據(jù)YUV/RGB輸出H264數(shù)據(jù),F(xiàn)Fmpeg+fdk_aac來編碼音頻數(shù)據(jù)PCM輸出AAC數(shù)據(jù)。
四、傳輸:采用FFMPEG進(jìn)行數(shù)據(jù)的接收,推流端默認(rèn)使用FFMPEG進(jìn)行數(shù)據(jù)的封包發(fā)送。
相對(duì)來說,封包更主要注意的一個(gè)點(diǎn)是時(shí)間戳。字面上可以理解,就是解碼時(shí)間和顯示時(shí)間,在沒有B幀存在的情況下DTS的順序和PTS的順序應(yīng)該是一樣的。這塊還涉及到重連和丟幀,用戶的網(wǎng)絡(luò)情況波動(dòng)斷開了,會(huì)進(jìn)行重連。重連失敗之后才會(huì)發(fā)送失敗回調(diào)。丟幀是一個(gè)弱網(wǎng)情況的策略,根據(jù)音視頻數(shù)據(jù)的緩沖區(qū)大小來判斷是否丟幀,丟幀會(huì)優(yōu)先丟非關(guān)鍵幀,保留關(guān)鍵幀,而一旦需要丟關(guān)鍵幀的時(shí),關(guān)鍵幀后的非關(guān)鍵幀也會(huì)一起丟掉直到下一個(gè)關(guān)鍵幀,來保證畫面不會(huì)花屏。
五、服務(wù)端
現(xiàn)在主流的兩種推送協(xié)議是RTMP和HLS
六、播放器
播放器主要負(fù)責(zé)拉流、解碼、播放。
1.解析協(xié)議
播放器端根據(jù)URL解析所用的流媒體協(xié)議(RTMP,HLS)。
2.解封裝
解封裝,從容器格式(FLV,TS)中,分離出音視頻數(shù)據(jù)。
3.解碼
解碼,就是把獲取到的數(shù)據(jù)解壓縮,恢復(fù)成原始數(shù)據(jù)。解碼就是將H264變成YUV,AAC變成PCM。解碼可以使用軟解碼,硬解碼。
4.渲染數(shù)據(jù)
采用OpenGL渲染YUV數(shù)據(jù),呈現(xiàn)視頻畫面。將PCM送入設(shè)備的硬件資源播放,產(chǎn)生聲音。