視頻直播技術之iOS端推流

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

相關閱讀推薦

短視頻技術詳解:Android端的短視頻開發技術緩存

視頻直播:Windows中各種畫面源的截取和合成方法總結服務器

視頻直播關鍵技術:流暢、擁塞和延時追趕網絡

直播架構

想必瞭解過直播的人都清楚直播主要分爲3部分:推流->流媒體服務器->拉流。架構


而咱們今天須要講的就是推流這部分,它主要包括音視頻採集,音視頻前處理,音視頻編碼,推流和傳輸4個方面。可是因爲網絡的複雜性和大數據的統計,推流還須要有全局負載均衡調度GSLB(Global Server Load Balance),以及實時的統計數據上報服務器,包括提供頻道管理給用戶運營,所以推流SDK須要接入GSLB中心調度,統計服務器,心跳服務器,用於推流分配到網絡最好的節點,有大數據的統計和分析。負載均衡


下圖涵蓋了直播相關的全部服務,紅色小標的線條表明指令流向,綠色小標的線條表明數據流向。框架


直播技術點


音視頻採集

採集是全部環節中的第一環,咱們使用的系統原生框架AVFoundation採集數據。經過iPhone攝像頭(AVCaptureSession)採集視頻數據,經過麥克風(AudioUnit)採集音頻數據。目前視頻的採集源主要來自攝像頭採集、屏幕錄製(ReplayKit)、從視頻文件讀取推流。ide

音視頻都支持參數配置。音頻能夠設置採樣率、聲道數、幀大小、音頻碼率、是否使用外部採集、是否使用外部音頻前處理;視頻能夠設置幀率、碼率、分辨率、先後攝像頭、攝像頭採集方向、視頻端顯示比例、是否開啓攝像頭閃光燈、是否打開攝像頭響應變焦、是否鏡像前置攝像頭預覽、是否鏡像前置攝像頭編碼、是否打開濾鏡功能、濾鏡類型、是否打開水印支持、是否打開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端推流技術的詳細講解。

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

相關文章
相關標籤/搜索