視頻直播技術之iOS端推流

隨着網絡基礎建設的發展和資費的下降,在這個內容消費升級的時代,文字、圖片無法滿足人們對視覺的需求,因此視頻直播應運而生。承載了實時性Real-Time和交互性的直播雲服務是直播覆蓋各行各業的新動力。網易雲信推出一系列文章,對視頻直播技術進行深入講解,本篇文章將向大家介紹iOS端的推流技術。

相關閱讀推薦
《短視頻技術詳解:Android端的短視頻開發技術》

《視頻直播: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端推流技術的詳細講解。

另外,想要閱讀更多關於視頻直播技術的文章,可以移步網易雲信博客。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章