「ApsaraVideo for Live技術詳解」系列之二:處理,
七牛雲於 6 月底發布了一個針對ApsaraVideo for Live的即時資料流網路 LiveNet 和完整的直播雲解決方案,很多開發人員對這個網路和解決方案的細節和使用情境非常感興趣。
我們將用七篇文章,更系統化地介紹當下大熱的ApsaraVideo for Live各環節的關鍵技術,協助ApsaraVideo for Live創業者們更全面、深入地瞭解ApsaraVideo for Live技術,更好地技術選型。
本系列文章大綱如下,想複習之前文章的直接點擊直達連結:
(一)採集
(二)處理
(三)編碼和封裝
(四)推流和傳輸
(五)延遲最佳化
(六)現代播放器原理
(七)SDK 效能測試模型
在上期採集中,我們介紹了視頻採集針對音頻採集和映像採集以及它們分別對應兩種完全不同的輸入源和資料格式。 本篇是《解密ApsaraVideo for Live技術》系列之二:處理。我們將講解常見視頻處理功能如美顏、視頻浮水印、濾鏡、連麥等。
視頻或者音頻完成採集之後得到未經處理資料,為了增強一些現場效果或者加上一些額外的效果,我們一般會在將其編碼壓縮前進行處理,比如打上時間戳記或者公司 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.視頻浮水印
浮水印是圖片和視頻內容中常見的功能之一,它可用於簡單是著作權保護,或者進行廣告設定。處於監管的需求,國家相關部門也規定ApsaraVideo for Live過程中必須打上浮水印,同時直播的視頻必須錄製儲存下來儲存一定的時間,並在錄製的視頻上打上浮水印。
視頻浮水印包括播放器浮水印和視頻內嵌浮水印兩種方式可供選擇,對於播放器浮水印來說,如果沒有有效防盜措施,對於沒有播放鑒權的推流,用戶端拿到直播流之後可以在任何一個不帶浮水印的播放器裡面播放,因此也就失去了視頻保護的能力。綜合考慮雲端錄製對於浮水印的需求,我們一般會選擇「視頻內嵌浮水印」的方式打浮水印。
在我們的直播系統中提供的 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 協議傳輸:
在下一篇連載中,我們將詳細介紹編碼和封裝。
敬請期待!
本文作者: 何李石@七牛雲首席佈道師,更多雲行業技術洞見請訪問七牛雲部落格。