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