北京2016年8月26日電 /美通社/ -- 隨著互聯(lián)網(wǎng)用戶消費(fèi)內(nèi)容和交互方式的升級(jí),支撐這些內(nèi)容和交互方式的基礎(chǔ)設(shè)施也正在悄悄發(fā)生變革。手機(jī)設(shè)備拍攝視頻能力和網(wǎng)絡(luò)的升級(jí)催生了大家對(duì)視頻直播領(lǐng)域的關(guān)注,吸引了很多互聯(lián)網(wǎng)創(chuàng)業(yè)者或者成熟企業(yè)進(jìn)入該領(lǐng)域。
七牛云于 6 月底發(fā)布了一個(gè)針對(duì)視頻直播的實(shí)時(shí)流網(wǎng)絡(luò) LiveNet 和完整的直播云解決方案,很多開發(fā)者對(duì)這個(gè)網(wǎng)絡(luò)和解決方案的細(xì)節(jié)和使用場(chǎng)景非常感興趣。
結(jié)合七牛實(shí)時(shí)流網(wǎng)絡(luò) LiveNet 和直播云解決方案的實(shí)踐,我們將用七篇文章,更系統(tǒng)化地介紹當(dāng)下大熱的視頻直播各環(huán)節(jié)的關(guān)鍵技術(shù),幫助視頻直播創(chuàng)業(yè)者們更全面、深入地了解視頻直播技術(shù),更好地技術(shù)選型。本篇我們將詳解處理環(huán)節(jié)的技術(shù)問(wèn)題,比如常見視頻處理功能如美顏、視頻水印、濾鏡、連麥等等。
視頻或者音頻完成采集之后得到原始數(shù)據(jù),為了增強(qiáng)一些現(xiàn)場(chǎng)效果或者加上一些額外的效果,我們一般會(huì)在將其編碼壓縮前進(jìn)行處理,比如打上時(shí)間戳或者公司 Logo 的水印,祛斑美顏和聲音混淆等處理。在主播和觀眾連麥場(chǎng)景中,主播需要和某個(gè)或者多個(gè)觀眾進(jìn)行對(duì)話,并將對(duì)話結(jié)果實(shí)時(shí)分享給其他所有觀眾,連麥的處理也有部分工作在推流端完成。
一、開放式設(shè)計(jì)
如上圖所示,處理環(huán)節(jié)中分為音頻和視頻處理,音頻處理中具體包含混音、降噪和聲音特效等處理,視頻處理中包含美顏、水印、以及各種自定義濾鏡等處理。對(duì)于七牛這樣的直播云服務(wù)來(lái)說(shuō),為了滿足所有客戶的需求,除了要提供這些“標(biāo)準(zhǔn)”處理功能之外,我們還需要將該模塊設(shè)計(jì)成可自由接入自定義處理功能的方式。
二、常見視頻處理功能
1. 美顏
都說(shuō)“80% 的主播沒有美顏根本沒法看”,美顏是直播產(chǎn)品中最常見的功能之一。最近準(zhǔn)備在香港上市的美圖公司的主打產(chǎn)品就是美顏相機(jī)和美拍,有媒體戲稱其會(huì)沖擊化妝品行業(yè),其實(shí)就是美顏的效果的功勞,讓美女主播們不化妝也可以自信的直播,而美顏相機(jī)的用戶則可以拍出“更好的自己”。
美顏的主要原理是通過(guò)“磨皮+美白”來(lái)達(dá)到整體美顏的效果。磨皮的技術(shù)術(shù)語(yǔ)是“去噪”,也即對(duì)圖像中的噪點(diǎn)進(jìn)行去除或者模糊化處理,常見的去噪算法有均值模糊、高斯模糊和中值濾波等。當(dāng)然, 由于臉部的每個(gè)部位不盡相同,臉上的雀斑可能呈現(xiàn)出眼睛黑點(diǎn)的樣子,對(duì)整張圖像進(jìn)行“去噪”處理的時(shí)候不需要將眼睛也去掉,因此這個(gè)環(huán)節(jié)中也涉及到人臉和皮膚檢測(cè)技術(shù)。
七牛直播云提供的 iOS 和 Android 推流 SDK 中內(nèi)置了美顏功能,可以根據(jù)自己的需要選擇開關(guān)美顏功能,并且能夠自由調(diào)節(jié)包括美顏,美白,紅潤(rùn)等在內(nèi)的參數(shù)。其中 iOS 端 SDK PLCameraStreamingKit 的參數(shù)設(shè)置如下:
1)按照默認(rèn)參數(shù)開啟或關(guān)閉美顏:
-(void)setBeautifyModeOn:(BOOL)beautifyModeOn;
2)設(shè)置美顏程度,范圍為 0 ~ 1:
-(void)setBeautify:(CGFloat)beautify;
3)設(shè)置美白程度,范圍為 0 ~ 1
-(void)setWhiten:(CGFloat)whiten;
4)設(shè)置紅潤(rùn)程度,范圍為 0 ~ 1
-(void)setRedden:(CGFloat)redden;
2. 視頻水印
水印是圖片和視頻內(nèi)容中常見的功能之一,它可用于簡(jiǎn)單是版權(quán)保護(hù),或者進(jìn)行廣告設(shè)置。處于監(jiān)管的需求,國(guó)家相關(guān)部門也規(guī)定視頻直播過(guò)程中必須打上水印,同時(shí)直播的視頻必須錄制存儲(chǔ)下來(lái)保存一定的時(shí)間,并在錄制的視頻上打上水印。
視頻水印包括播放器水印和視頻內(nèi)嵌水印兩種方式可供選擇,對(duì)于播放器水印來(lái)說(shuō),如果沒有有效的防盜措施,對(duì)于沒有播放鑒權(quán)的推流,客戶端拿到直播流之后可以在任何一個(gè)不帶水印的播放器里面播放,因此也就失去了視頻保護(hù)的能力。綜合考慮云端錄制對(duì)于水印的需求,我們一般會(huì)選擇“視頻內(nèi)嵌水印”的方式打水印。
七牛直播云提供的 iOS 和 Android 推流 SDK 中也內(nèi)置了水印功能,可以根據(jù)自己的需要添加水印或移除水印,并且能夠自由設(shè)置水印的大小和位置。其中 iOS 端 SDK PLCameraStreamingKit 的參數(shù)設(shè)置如下:
1)添加水印
-(void)setWaterMarkWithImage:(UIImage *)wateMarkImage position:(CGPoint)position;
該方法將為直播流添加一個(gè)水印,水印的大小由 wateMarkImage 的大小決定,位置由 position 決定,需要注意的是這些值都是以采集數(shù)據(jù)的像素點(diǎn)為單位的。例如我們使用AVCaptureSessionPreset1280x720 進(jìn)行采集,同時(shí) wateMarkImage.size 為 (100, 100) 對(duì)應(yīng)的origin 為 (200, 300),那么水印的位置將在大小為 1280x720 的采集畫幅中位于 (200, 300) 的位置,大小為 (100, 100)。
2)移除水印
-(void)clearWaterMark;
3. 濾鏡
除了上面提到的美顏和水印之外,視頻中還有很多其它的處理效果也在這個(gè)環(huán)節(jié)完成。七牛直播云提供的 SDK 在開放性設(shè)計(jì)基礎(chǔ)之上,通過(guò)數(shù)據(jù)源回調(diào)接口,可以支持各種自定義濾鏡的接入。
為了實(shí)現(xiàn)豐富的濾鏡效果,在 iOS 端可以考慮使用 GPUImage 這個(gè)庫(kù),這是一個(gè)開源的基于GPU的圖片或視頻的處理框架,內(nèi)置了多達(dá)120多種常見的濾鏡效果。有了它,添加實(shí)時(shí)的濾鏡只需要簡(jiǎn)單地添加幾行代碼,還可以基于這個(gè)庫(kù)自己寫算法實(shí)現(xiàn)更豐富端效果。GPUImage 地址:https://github.com/BradLarson/GPUImage
除了 iOS 端之外,Android 也有 GPUImage 這個(gè)庫(kù)的移植:https://github.com/CyberAgent/android-gpuimage
同時(shí),Google 官方也開源了一個(gè)偉大的庫(kù),覆蓋了 Android 上面很多多媒體和圖形圖像相關(guān)的處理:https://github.com/google/grafika
4. 連麥
連麥?zhǔn)腔?dòng)直播中常見的需求,其流程如上圖所示。主播和部分觀眾之間可以進(jìn)行實(shí)時(shí)互動(dòng),然后將互動(dòng)結(jié)果實(shí)時(shí)播放給其他觀眾觀看?;谝陨蠘I(yè)務(wù)需求,我們很容易想到基于單向直播原理,在主播端和連麥觀眾端進(jìn)行雙向推流和雙向播流的方式互動(dòng),然后在服務(wù)端將兩路推流合成一路推送給其他觀眾。但 RTMP 帶來(lái)的延遲決定了這種方式無(wú)法做到用戶可接受的互動(dòng)直播。實(shí)際上,互動(dòng)直播的主要技術(shù)難點(diǎn)在于:
1)低延遲互動(dòng):保證主播和互動(dòng)觀眾之間能夠?qū)崟r(shí)互動(dòng),兩者之間就像電話溝通,因此必須保證兩者能在秒級(jí)以內(nèi)聽到對(duì)方的聲音,看到對(duì)方的視頻;
2)音畫同步:互動(dòng)直播中對(duì)音畫同步的需求和單向直播中類似,只不過(guò)互動(dòng)直播中的延遲要求更高,必須保證在音視頻秒級(jí)傳輸情況下的秒級(jí)同步。
3)音視頻實(shí)時(shí)合成:其他觀眾需要實(shí)時(shí)觀看到對(duì)話結(jié)果,因此需要在客戶端或者服務(wù)端將畫面和聲音實(shí)時(shí)合成,然后以低成本高品質(zhì)的方式傳輸觀眾端。
在視頻和電話會(huì)議領(lǐng)域,目前比較成熟的方案是使用思科或者 WebEx 的方案,但這些商用的方案一不開源,二比較封閉,三成本比較高。對(duì)于互動(dòng)人數(shù)比較少的互動(dòng)直播,目前市場(chǎng)上比較成熟的方案是使用基于 WebRTC 的實(shí)時(shí)通訊方案。
上圖是一個(gè)基于 WebRTC 協(xié)議實(shí)現(xiàn)多方實(shí)時(shí)通訊的示意圖,本地用戶(主播)和遠(yuǎn)程用戶(連麥觀眾)之間的連接通過(guò) RTCPeerConnection API 管理,這個(gè) API 包裝了底層流管理和信令控制相關(guān)的細(xì)節(jié)?;谠摲桨缚梢暂p松實(shí)現(xiàn)多人(14 人以下)的多方實(shí)時(shí)通信。
當(dāng)然,在通信人數(shù)少的情況下,其復(fù)雜度相對(duì)簡(jiǎn)單,如 2 人情況下。但人數(shù)增多至 4 人之后,其可選的網(wǎng)絡(luò)結(jié)構(gòu)就增多了,可以每個(gè)點(diǎn)之間形成自組織網(wǎng)絡(luò)的方式通信,也可以以 1 人為中心形成星型通信網(wǎng)絡(luò),還可以讓大家都通過(guò)一個(gè)集中式的服務(wù)端進(jìn)行通信。
作為一個(gè)高性能、可伸縮的直播基礎(chǔ)服務(wù)提供商,七牛直播云經(jīng)過(guò)評(píng)估選擇了以主播為中心形成星形通信網(wǎng)絡(luò),支持主播和多個(gè)觀眾之間的互動(dòng)質(zhì)量。同時(shí),為了保證合成后的音視頻實(shí)時(shí)傳輸?shù)狡渌^眾端,這里采用經(jīng)過(guò)改造的 UDP 協(xié)議傳輸:
1. 通過(guò) UDP 降低傳輸延遲。
2. 在 UDP 之上進(jìn)行傳輸控制,保證用戶互動(dòng)體驗(yàn) QoS。
在下一篇連載中,將詳細(xì)介紹編碼和封裝,敬請(qǐng)期待。
為了讓大家能夠?qū)⒓夹g(shù)理論快速應(yīng)用到實(shí)踐開發(fā)中,七牛云聯(lián)合慕課網(wǎng)特別制作了一期課程,專門針對(duì)移動(dòng)直播應(yīng)用開發(fā),供大家學(xué)習(xí)參考:http://www.imooc.com/learn/707。