怎么直播?實現(xiàn)視頻直播的6個主要步驟
視頻直播,主要涉及到采集、預處理、編碼、傳輸、服務器轉碼、解碼這樣一個流程。
一、視頻采集:采集主要包含圖像采集和音頻采集;
圖像采集設置前置攝像頭、后置攝像頭,并配置采集的參數(shù)、圖像數(shù)據(jù)的長寬、fps、輸出的方向、橫屏豎屏等,然后從回調中取到數(shù)據(jù)。
音頻采集和編碼主要面臨的挑戰(zhàn)在于:噪聲消除(Denoise)、回聲消除(AEC)算法等。
前期不需要音頻數(shù)據(jù)處理需求的時候,只需配置音頻采集的采樣頻率、采樣精度和聲道。
二、預處理:分為音頻處理和視頻處理兩個方面。
音頻處理是直播難點之一,尤其主播離手機有一段距離,直播環(huán)境會有噪音,所以直播的音頻處理是整體降噪的過程。增益降噪等處理可直接從speex項目中抽出來的聲音處理代碼,然后調用、處理。如有類似在直播的時候播放背景音樂的混音需求,就需要使用Audio Unit來實現(xiàn)音頻數(shù)據(jù)的混音,而還需要將混音的背景音樂轉成PCM數(shù)據(jù),拷貝一份送入混音,原來的數(shù)據(jù)送入播放器。
濾鏡、美顏功能是直播標配,如果需要美白、水印、裁剪等處理效果,就必須處理拿到的buffer,這個時候還要考慮到拿到的數(shù)據(jù)是YUV還是RGB。iOS上是不能對YUV格式直接進行美顏處理,只能是RGB格式。可選擇使用GPUImage庫,調用GPUImage來進行采集和美白、水印、裁剪的處理,然后取出來進行編碼上傳,并顯示在預覽畫面上。
三、編碼:
軟編碼:現(xiàn)在廣泛采用FFmpeg庫結合編碼庫來實現(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ù)。
硬編碼:iOS 8之后開放了硬解碼和硬編碼AP,所以基本上都是選擇VideoToolBox和AudioToolBox進行圖像和音頻的硬編碼。
四、傳輸:又拍云播放器采用FFMPEG進行數(shù)據(jù)的接收,推流端默認使用FFMPEG進行數(shù)據(jù)的封包發(fā)送。
相對來說,封包最主要注意的一個點是時間戳。因為用的AVPacket封包,每個包都會有一個DST(Decode Time Stamp)、PST(Presentation Time Stamp)參數(shù),從字面上可以理解,就是解碼時間和顯示時間,在沒有B幀存在的情況下DTS的順序和PTS的順序應該是一樣的。這塊還涉及到重連和丟幀,用戶的網絡情況波動斷開了,會進行重連。重連失敗之后才會發(fā)送失敗回調。丟幀是一個弱網情況的策略,根據(jù)音視頻數(shù)據(jù)的緩沖區(qū)大小來判斷是否丟幀,丟幀會優(yōu)先丟非關鍵幀,保留關鍵幀,而一旦需要丟關鍵幀的時,關鍵幀后的非關鍵幀也會一起丟掉直到下一個關鍵幀,來保證畫面不會花屏。
五、服務端
現(xiàn)在主流的兩種推送協(xié)議是RTMP和HLS,兩者的優(yōu)缺點我就不在這里做比較了。又拍直播云采用用的是RTMP協(xié)議。
六、播放器
播放器主要負責拉流、解碼、播放。
1.解析協(xié)議
播放器端根據(jù)URL解析所用的流媒體協(xié)議(RTMP,HLS)。
2.解封裝
解封裝,就是demux的過程,從容器格式(FLV,TS)中,分離出音視頻數(shù)據(jù)。
3.解碼
解碼,就是把獲取到的數(shù)據(jù)解壓縮,恢復成原始數(shù)據(jù)。解碼就是將H264變成YUV,AAC變成PCM。解碼可以使用軟解碼,硬解碼。
4.渲染數(shù)據(jù)
采用OpenGL渲染YUV數(shù)據(jù),呈現(xiàn)視頻畫面。將PCM送入設備的硬件資源播放,產生聲音。
iOS播放流式音頻,使用Audio Queue的方式,即利用AudioToolbox.framework框架。