隨著網路基礎建設的發展和資費的下降,在這個內容消費升級的時代,文字、圖片無法滿足人們對視覺的需求,因此視訊直播應運而生。承載了實時性Real-Time和互動性的直播雲服務是直播覆蓋各行各業的新動力。網易雲信推出一系列文章,對視訊直播技術進行深入講解,本篇文章將向大家介紹iOS端的推流技術。
相關閱讀推薦
《視訊直播:Windows中各類畫面源的擷取和合成方法總結》
直播架構
想必瞭解過直播的人都清楚直播主要分為3部分:推流->流媒體伺服器->拉流。
而我們今天需要講的就是推流這部分,它主要包括音視訊採集,音視訊前處理,音視訊編碼,推流和傳輸4個方面。但是由於網路的複雜性和大資料的統計,推流還需要有全域性負載均衡排程GSLB(Global Server Load Balance),以及實時的統計資料上報伺服器,包括提供頻道管理給使用者運營,因此推流SDK需要接入GSLB中心排程,統計伺服器,心跳伺服器,用於推流分配到網路最好的節點,有大資料的統計和分析。
下圖涵蓋了直播相關的所有服務,紅色小標的線條代表指令流向,綠色小標的線條代表資料流向。
直播技術點
音視訊採集
採集是所有環節中的第一環,我們使用的系統原生框架AVFoundation採集資料。通過iPhone攝像頭(AVCaptureSession)採集視訊資料,通過麥克風(AudioUnit)採集音訊資料。目前視訊的採集源主要來自攝像頭採集、螢幕錄製(ReplayKit)、從視訊檔案讀取推流。
音視訊都支援引數配置。音訊可以設定取樣率、聲道數、幀大小、音訊位元速率、是否使用外部採集、是否使用外部音訊前處理;視訊可以設定幀率、位元速率、解析度、前後攝像頭、攝像頭採集方向、視訊端顯示比例、是否開啟攝像頭閃光燈、是否開啟攝像頭響應變焦、是否映象前置攝像頭預覽、是否映象前置攝像頭編碼、是否開啟濾鏡功能、濾鏡型別、是否開啟水印支援、是否開啟QoS功能、是否輸出RGB資料、是否使用外部視訊採集。
音視訊處理
前處理模組也是主觀影響主播觀看效果最主要的環節。目前iOS端比較知名的是GPUImage,提供了豐富的預處理效果,我們也在此基礎上進行了封裝開發。視訊前處理包含濾鏡、美顏、水印、塗鴉等功能,同時在人臉識別和特效方面接入了第三方廠商FaceU。SDK內建4款濾鏡黑白、自然、粉嫩、懷舊;支援16:9裁剪;支援磨皮和美白(高斯模糊加邊緣檢測);支援靜態水印,動態水印,塗鴉等功能。音訊前處理則包括回聲抑制、嘯叫、增益控制等。音視訊都支援外部前處理。
音視訊編碼
編碼最主要的兩個難點是:
1 處理硬體相容性問題
2 在高FPS、低bitrate和音質畫質之間找個一個平衡點
由於iOS端硬體相容性比較好,因此可以採用硬編。SDK目前支援軟體編碼openH264,硬體編碼VideoToolbox。而音訊支援軟體編碼FDK-AAC和硬體編碼AudioToolbox。
視訊編碼的核心思想就是去除冗餘資訊:
空間冗餘:影象相鄰畫素之間有較強的相關性。
時間冗餘:視訊序列的相鄰影象之間內容相似。
編碼冗餘:不同畫素值出現的概率不同。
視覺冗餘:人的視覺系統對某些細節不敏感。
音視訊傳送
推流SDK使用的流媒體協議是RTMP(RealTime Messaging Protocol)。而音視訊傳送最困難的就是針對網路的頻寬評估。由於從直播端到RTMP伺服器的網路情況複雜,尤其是在3G和頻寬較差的Wifi環境下,網路丟包、抖動和延遲經常發生,導致直播推流不暢。RTMP基於TCP進行傳輸,TCP自身實現了網路擁塞下的處理,內部的機制較為複雜,而且對開發者不可見,開發者無法根據TCP協議的資訊判斷當時的網路情況,導致傳送位元速率大於實際網路頻寬,造成比較嚴重的網路擁塞。因此我們自研開發了一款實時根據網路變化的QoS演算法,用於實時調節位元速率、幀率、解析度,同時將資料實時上報統計平臺。
模組設計&執行緒模型
模組設計
鑑於推流的主流程分為上述描述的4個部分:音視訊採集、音視訊前處理、音視訊編碼、音視訊傳送。因此將推流SDK進行模組劃分為LSMediacapture層(對外API+伺服器互動)、視訊融合模組(視訊採集+視訊前處理)、音訊融合模組(音訊採集+音訊前處理)、基礎服務模組、音視訊編碼模組、網路傳送模組。
執行緒模型
推流SDK總共含有10個執行緒。視訊包含AVCaptureSession的原始採集執行緒、前處理執行緒、硬體編碼執行緒、資料流向定義的採集執行緒、編碼執行緒、傳送執行緒。音訊包含AudioUnit包含的原始採集執行緒、資料流向定義的採集執行緒、編碼執行緒、傳送執行緒。在資料流向定義的採集執行緒、編碼執行緒、傳送執行緒之間會建立2個bufferQueue,用於快取音視訊資料。採集編碼佇列可以有效的控制編碼位元速率,編碼傳送佇列可以有效自適應網路推流。
QoS&跳幀
下圖是直播的主要流程,使用者初始化SDK,建立執行緒,開始直播,音視訊資料採集,編碼,傳送。在傳送執行緒下,音視訊資料傳送,QoS開啟,根據網路實時評估頻寬,調整幀率,位元速率控制編碼器引數,同時觸發跳幀,調整解析度控制採集解析度引數。使用者停止直播,反初始化SDK,銷燬執行緒。QoS&跳幀可以有效的解決使用者在網路不好的情況下,直播卡頓的問題。在不同的位元速率和解析度情況下,都能夠做到讓使用者流暢地觀看視訊直播。
以上就是iOS端推流技術的詳細講解。
另外,想要閱讀更多關於視訊直播技術的文章,可以移步網易雲信部落格。