七牛雲於 6 月底發佈了一個針對視頻直播的實時流網絡 LiveNet 和完整的直播雲解決方案,不少開發者對這個網絡和解決方案的細節和使用場景很是感興趣。html
咱們將用七篇文章,更系統化地介紹當下大熱的視頻直播各環節的關鍵技術,幫助視頻直播創業者們更全面、深刻地瞭解視頻直播技術,更好地技術選型。android
本系列文章大綱以下,想複習以前文章的直接點擊直達連接:
(一)採集git
(二)處理github
(三)編碼和封裝算法
(四)推流和傳輸網絡
(五)延遲優化app
(六)現代播放器原理框架
(七)SDK 性能測試模型ide
在上期採集中,咱們介紹了視頻採集針對音頻採集和圖像採集以及它們分別對應兩種徹底不一樣的輸入源和數據格式。 本篇是《解密視頻直播技術》系列之二:處理。咱們將講解常見視頻處理功能如美顏、視頻水印、濾鏡、連麥等。性能
視頻或者音頻完成採集以後獲得原始數據,爲了加強一些現場效果或者加上一些額外的效果,咱們通常會在將其編碼壓縮前進行處理,好比打上時間戳或者公司 Logo 的水印,祛斑美顏和聲音混淆等處理。在主播和觀衆連麥場景中,主播須要和某個或者多個觀衆進行對話,並將對話結果實時分享給其餘全部觀衆,連麥的處理也有部分工做在推流端完成。
如上圖所示,處理環節中分爲音頻和視頻處理,音頻處理中具體包含混音、降噪和聲音特效等處理,視頻處理中包含美顏、水印、以及各類自定義濾鏡等處理。對於七牛這樣的直播雲服務來講,爲了知足全部客戶的需求,除了要提供這些「標準」處理功能以外,咱們還須要將該模塊設計成可自由接入自定義處理功能的方式。
iOS SDK 地址:https://github.com/pili-engineering/PLMediaStreamingKit
Android SDK 地址:GitHub - pili-engineering/PLDroidMediaStreaming
1.美顏
都說「80% 的主播沒有美顏根本無法看」,美顏是直播產品中最多見的功能之一。最近準備在香港上市的美圖公司的主打產品就是美顏相機和美拍,有媒體戲稱其會衝擊化妝品行業,其實就是美顏的效果的功勞,讓美女主播們不化妝也能夠自信的直播,而美顏相機的用戶則能夠拍出「更好的本身」。
美顏的主要原理是經過「磨皮+美白」來達到總體美顏的效果。磨皮的技術術語是「去噪」,也即對圖像中的噪點進行去除或者模糊化處理,常見的去噪算法有均值模糊、高斯模糊和中值濾波等。固然, 因爲臉部的每一個部位不盡相同,臉上的雀斑可能呈現出眼睛黑點的樣子,對整張圖像進行「去噪」處理的時候不須要將眼睛也去掉,所以這個環節中也涉及到人臉和皮膚檢測技術。
在咱們的直播系統中提供的 iOS 和 Android 推流 SDK 中內置了美顏功能,你能夠根據本身的須要選擇開關美顏功能,而且可以自由調節包括美顏,美白,紅潤等在內的參數。其中 iOS 端 SDK PLCameraStreamingKit 的參數設置以下:
1)按照默認參數開啓或關閉美顏:
-(void)setBeautifyModeOn:(BOOL)beautifyModeOn;
2)設置美顏程度,範圍爲 0 ~ 1:
-(void)setBeautify:(CGFloat)beautify;
3)設置美白程度,範圍爲 0 ~ 1
-(void)setWhiten:(CGFloat)whiten;
4)設置紅潤程度,範圍爲 0 ~ 1
-(void)setRedden:(CGFloat)redden;
2.視頻水印
水印是圖片和視頻內容中常見的功能之一,它可用於簡單是版權保護,或者進行廣告設置。處於監管的需求,國家相關部門也規定視頻直播過程當中必須打上水印,同時直播的視頻必須錄製存儲下來保存必定的時間,並在錄製的視頻上打上水印。
視頻水印包括播放器水印和視頻內嵌水印兩種方式可供選擇,對於播放器水印來講,若是沒有有效的防盜措施,對於沒有播放鑑權的推流,客戶端拿到直播流以後能夠在任何一個不帶水印的播放器裏面播放,所以也就失去了視頻保護的能力。綜合考慮雲端錄製對於水印的需求,咱們通常會選擇「視頻內嵌水印」的方式打水印。
在咱們的直播系統中提供的 iOS 和 Android 推流 SDK 中也內置了水印功能,你能夠根據本身的須要添加水印或移除水印,而且可以自由設置水印的大小和位置。其中 iOS 端 SDK PLCameraStreamingKit 的參數設置以下:
1)添加水印
-(void)setWaterMarkWithImage:(UIImage *)wateMarkImage position:(CGPoint)position;
該方法將爲直播流添加一個水印,水印的大小由 wateMarkImage 的大小決定,位置由 position 決定,須要注意的是這些值都是以採集數據的像素點爲單位的。例如咱們使用AVCaptureSessionPreset1280x720 進行採集,同時 wateMarkImage.size 爲 (100, 100) 對應的origin 爲 (200, 300),那麼水印的位置將在大小爲 1280x720 的採集畫幅中位於 (200, 300) 的位置,大小爲 (100, 100)。
2)移除水印
-(void)clearWaterMark;
3.濾鏡
除了上面提到的美顏和水印以外,視頻中還有不少其它的處理效果也在這個環節完成。七牛直播雲提供的 SDK 在開放性設計基礎之上,經過數據源回調接口,能夠支持各類自定義濾鏡的接入。
爲了實現豐富的濾鏡效果,在 iOS 端能夠考慮使用 GPUImage 這個庫,這是一個開源的基於GPU的圖片或視頻的處理框架,內置了多達120多種常見的濾鏡效果。有了它,添加實時的濾鏡只須要簡單地添加幾行代碼,還能夠基於這個庫本身寫算法實現更豐富端效果。GPUImage 地址:GitHub - BradLarson/GPUImage: An open source iOS framework for GPU-based image and video processing
除了 iOS 端以外,Android 也有 GPUImage 這個庫的移植:GitHub - CyberAgent/android-gpuimage: Android filters based on OpenGL (idea from GPUImage for iOS)
同時,Google 官方也開源了一個偉大的庫,覆蓋了 Android 上面不少多媒體和圖形圖像相關的處理:GitHub - google/grafika: Grafika test app
4.連麥
連麥是互動直播中常見的需求,其流程如上圖所示。主播和部分觀衆之間能夠進行實時互動,而後將互動結果實時播放給其餘觀衆觀看。
基於以上業務需求,咱們很容易想到基於單向直播原理,在主播端和連麥觀衆端進行雙向推流和雙向播流的方式互動,而後在服務端將兩路推流合成一路推送給其餘觀衆。但 RTMP 帶來的延遲決定了這種方式沒法作到用戶可接受的互動直播。
實際上,互動直播的主要技術難點在於:
1)低延遲互動:保證主播和互動觀衆之間可以實時互動,二者之間就像電話溝通,所以必須保證二者能在秒級之內聽到對方的聲音,看到對方的視頻;
2)音畫同步:互動直播中對音畫同步的需求和單向直播中相似,只不過互動直播中的延遲要求更高,必須保證在音視頻秒級傳輸狀況下的秒級同步。
3)音視頻實時合成:其餘觀衆須要實時觀看到對話結果,所以須要在客戶端或者服務端將畫面和聲音實時合成,而後以低成本高品質的方式傳輸觀衆端。
在視頻和電話會議領域,目前比較成熟的方案是使用思科或者 WebEx 的方案,但這些商用的方案一不開源,二比較封閉,三成本比較高。對於互動人數比較少的互動直播,目前市場上比較成熟的方案是使用基於 WebRTC 的實時通信方案。
上圖是一個基於 WebRTC 協議實現多方實時通信的示意圖,本地用戶(主播)和遠程用戶(連麥觀衆)之間的鏈接經過 RTCPeerConnection API 管理,這個 API 包裝了底層流管理和信令控制相關的細節。基於該方案能夠輕鬆實現多人(14 人如下)的多方實時通訊,以下圖所示:
固然,在通訊人數少的狀況下,其複雜度相對簡單,如 2 人狀況下。但人數增多至 4 人以後,其可選的網絡結構就增多了,如上圖所示,能夠每一個點之間造成自組織網絡的方式通訊,也能夠以 1 人爲中心造成星型通訊網絡,還可讓你們都經過一個集中式的服務端進行通訊。
做爲一個高性能、可伸縮的直播基礎服務提供商,七牛直播雲通過評估選擇了以主播爲中心造成星形通訊網絡,支持主播和多個觀衆之間的互動質量。同時,爲了保證合成後的音視頻實時傳輸到其餘觀衆端,這裏採用通過改造的 UDP 協議傳輸:
在下一篇連載中,咱們將詳細介紹編碼和封裝。
敬請期待!
本文做者: 何李石@七牛雲首席佈道師,更多雲行業技術洞見請訪問七牛雲博客。