北(bei)京2016年8月26日電(dian) /美通社(she)/ -- 隨著(zhu)互聯(lian)(lian)網(wang)用戶消費內容(rong)(rong)和交互方式的升(sheng)級(ji),支撐這些內容(rong)(rong)和交互方式的基礎設施也正在悄(qiao)悄(qiao)發生(sheng)變(bian)革。手機設備拍攝視(shi)頻能力和網(wang)絡的升(sheng)級(ji)催生(sheng)了(le)(le)大(da)家對(dui)視(shi)頻直播領域的關注(zhu),吸引了(le)(le)很多互聯(lian)(lian)網(wang)創業者或(huo)者成(cheng)熟企業進(jin)入該領域。
七牛(niu)云于(yu) 6 月底(di)發(fa)布了一個(ge)針對(dui)視(shi)頻(pin)直播的實時流網絡 LiveNet 和(he)完整的直播云解決方案,很多開發(fa)者(zhe)對(dui)這個(ge)網絡和(he)解決方案的細節(jie)和(he)使(shi)用場景非(fei)常感興趣。
結合七牛實時(shi)流網絡 LiveNet 和直(zhi)播云解決方案的(de)實踐,我們將用七篇文章(zhang),更(geng)系統化地介(jie)紹當下大熱的(de)視(shi)頻(pin)(pin)(pin)直(zhi)播各環節的(de)關鍵技(ji)(ji)術,幫助視(shi)頻(pin)(pin)(pin)直(zhi)播創(chuang)業者(zhe)們更(geng)全面、深入地了解視(shi)頻(pin)(pin)(pin)直(zhi)播技(ji)(ji)術,更(geng)好(hao)地技(ji)(ji)術選型。本(ben)篇我們將詳解處(chu)理環節的(de)技(ji)(ji)術問題,比如(ru)常見視(shi)頻(pin)(pin)(pin)處(chu)理功能如(ru)美(mei)顏、視(shi)頻(pin)(pin)(pin)水印、濾鏡、連麥等等。
視頻或者音頻完成(cheng)采集之后得到原(yuan)始數據,為了增強一些現場(chang)效果或者加(jia)上一些額(e)外的效果,我們一般會在(zai)將其編碼壓縮前進行處(chu)理(li),比如打(da)上時間(jian)戳或者公司 Logo 的水印,祛(qu)斑美顏和聲(sheng)音混淆等處(chu)理(li)。在(zai)主(zhu)播和觀(guan)(guan)眾(zhong)連(lian)麥場(chang)景中,主(zhu)播需要(yao)和某個或者多個觀(guan)(guan)眾(zhong)進行對(dui)話(hua),并將對(dui)話(hua)結果實(shi)時分享給其他(ta)所有觀(guan)(guan)眾(zhong),連(lian)麥的處(chu)理(li)也(ye)有部分工(gong)作在(zai)推流端完成(cheng)。
一、開放式設計
如上圖所示,處理環節中分為音頻和視頻處理,音頻處理中具體包含混音、降噪和聲音特效等處理,視頻處理中包含美顏、水印、以及各種自定義濾鏡等處理。對于七牛這樣的直播云服務來說,為了滿足所有客戶的需求,除了要提供這些“標準”處(chu)理功能(neng)之外(wai),我們還(huan)需要將該模塊設計成可自由(you)接入自定(ding)義處(chu)理功能(neng)的(de)方(fang)式。
二、常見視頻處理功能
1. 美顏(yan)
都說“80% 的主播沒有美顏根本沒法看”,美顏是直播產品中最常見的功能之一。最近準備在香港上市的美圖公司的主打產品就是美顏相機和美拍,有媒體戲稱其會沖擊化妝品行業,其實就是美顏的效果的功勞,讓美女主播們不化妝也可以自信的直播,而美顏相機的用戶則可以拍出“更好的自己”。
美顏的主要原理是通過“磨皮+美白”來達到整體美顏的效果。磨皮的技術術語是“去噪”,也(ye)即(ji)對圖像中(zhong)的(de)(de)噪點(dian)進(jin)(jin)行去(qu)(qu)(qu)除或者(zhe)模(mo)(mo)糊(hu)化(hua)處(chu)理,常(chang)見的(de)(de)去(qu)(qu)(qu)噪算法有均(jun)值(zhi)模(mo)(mo)糊(hu)、高斯模(mo)(mo)糊(hu)和中(zhong)值(zhi)濾波等。當然(ran), 由于(yu)臉部(bu)的(de)(de)每個部(bu)位不盡相同,臉上的(de)(de)雀斑(ban)可能呈現(xian)出眼(yan)睛(jing)黑點(dian)的(de)(de)樣子,對整張圖像進(jin)(jin)行“去(qu)(qu)(qu)噪”處(chu)理的(de)(de)時候不需(xu)要將(jiang)眼(yan)睛(jing)也(ye)去(qu)(qu)(qu)掉,因(yin)此(ci)這(zhe)個環(huan)節中(zhong)也(ye)涉及(ji)到(dao)人臉和皮膚檢測技術。
七牛直播云提供的 iOS 和 Android 推流 SDK 中內置了美顏功能,可以(yi)根據(ju)自己的(de)需要(yao)選擇開關美(mei)顏(yan)功能,并且能夠(gou)自由調節包括美(mei)顏(yan),美(mei)白,紅潤(run)等在內的(de)參數(shu)。其中 iOS 端(duan) SDK PLCameraStreamingKit 的(de)參數(shu)設置(zhi)如下:
1)按照(zhao)默認參數開啟或關閉美(mei)顏(yan):
-(void)setBeautifyModeOn:(BOOL)beautifyModeOn;
2)設置美顏程(cheng)度,范圍為 0 ~ 1:
-(void)setBeautify:(CGFloat)beautify;
3)設置美(mei)白程(cheng)度,范圍為 0 ~ 1
-(void)setWhiten:(CGFloat)whiten;
4)設(she)置紅潤(run)程度,范圍為(wei) 0 ~ 1
-(void)setRedden:(CGFloat)redden;
2. 視(shi)頻(pin)水印
水(shui)印(yin)是(shi)圖片和視(shi)(shi)頻內容中(zhong)常見的(de)功能之一,它可用于簡單(dan)是(shi)版權保(bao)護(hu),或者(zhe)進行廣告設(she)置。處于監管的(de)需(xu)求,國家相(xiang)關部門也規定視(shi)(shi)頻直播過程中(zhong)必須打(da)上水(shui)印(yin),同時直播的(de)視(shi)(shi)頻必須錄制存(cun)儲下來保(bao)存(cun)一定的(de)時間(jian),并在錄制的(de)視(shi)(shi)頻上打(da)上水(shui)印(yin)。
視(shi)頻水(shui)(shui)(shui)印(yin)包(bao)括播放器(qi)水(shui)(shui)(shui)印(yin)和視(shi)頻內(nei)(nei)嵌水(shui)(shui)(shui)印(yin)兩種方(fang)式可供(gong)選擇,對于(yu)播放器(qi)水(shui)(shui)(shui)印(yin)來說(shuo),如果沒(mei)有有效的(de)防盜措施,對于(yu)沒(mei)有播放鑒權的(de)推流,客(ke)戶(hu)端拿到直播流之后可以在任何一個(ge)不帶水(shui)(shui)(shui)印(yin)的(de)播放器(qi)里(li)面(mian)播放,因此也就失去了視(shi)頻保護的(de)能(neng)力。綜合(he)考慮(lv)云端錄制對于(yu)水(shui)(shui)(shui)印(yin)的(de)需求,我們一般(ban)會(hui)選擇“視(shi)頻內(nei)(nei)嵌水(shui)(shui)(shui)印(yin)”的(de)方(fang)式打水(shui)(shui)(shui)印(yin)。
七牛直播云提供的 iOS 和 Android 推流 SDK 中也內置了水印功能,可以根據自(zi)己的需要添(tian)加水(shui)(shui)印(yin)或移除(chu)水(shui)(shui)印(yin),并且能夠自(zi)由設置水(shui)(shui)印(yin)的大小和位置。其中 iOS 端(duan) SDK PLCameraStreamingKit 的參數設置如下:
1)添加水印
-(void)setWaterMarkWithImage:(UIImage *)wateMarkImage position:(CGPoint)position;
該(gai)方(fang)法將為直播流添加一(yi)個水(shui)印,水(shui)印的(de)大(da)小(xiao)由(you) wateMarkImage 的(de)大(da)小(xiao)決定(ding),位置(zhi)由(you) position 決定(ding),需要注意的(de)是這些值都是以(yi)采集數據(ju)的(de)像素點為單位的(de)。例如我們使用AVCaptureSessionPreset1280x720 進行采集,同時 wateMarkImage.size 為 (100, 100) 對(dui)應的(de)origin 為 (200, 300),那么(me)水(shui)印的(de)位置(zhi)將在大(da)小(xiao)為 1280x720 的(de)采集畫幅中位于 (200, 300) 的(de)位置(zhi),大(da)小(xiao)為 (100, 100)。
2)移除水印
-(void)clearWaterMark;
3. 濾鏡(jing)
除了上面提到的美(mei)顏和水印之(zhi)外,視頻中還(huan)有很多(duo)其它(ta)的處理效果也(ye)在這個環節完成。七牛直播云提供的 SDK 在開放(fang)性設計基(ji)礎之(zhi)上,通過數據(ju)源回調接口,可以支持(chi)各(ge)種自定(ding)義濾鏡(jing)的接入。
為了(le)實現豐富的(de)(de)濾(lv)鏡效果(guo),在 iOS 端(duan)可(ke)(ke)以(yi)考慮使(shi)用 GPUImage 這個(ge)庫,這是一個(ge)開源的(de)(de)基于(yu)GPU的(de)(de)圖(tu)片或視頻的(de)(de)處理框架,內置了(le)多(duo)達120多(duo)種常見的(de)(de)濾(lv)鏡效果(guo)。有(you)了(le)它,添加實時的(de)(de)濾(lv)鏡只需要簡單地添加幾(ji)行代(dai)碼,還可(ke)(ke)以(yi)基于(yu)這個(ge)庫自己寫算法實現更豐富端(duan)效果(guo)。GPUImage 地址:
除了(le) iOS 端(duan)之外,Android 也有 GPUImage 這個庫的(de)移植(zhi):
同(tong)時,Google 官方(fang)也開源了一個偉大的庫(ku),覆蓋了 Android 上面很多(duo)多(duo)媒體(ti)和圖(tu)形圖(tu)像相(xiang)關的處理:
4. 連麥
連麥(mai)是互(hu)動(dong)(dong)直播(bo)(bo)(bo)中常見的(de)需(xu)求,其流(liu)(liu)程(cheng)如上圖所示(shi)。主播(bo)(bo)(bo)和(he)部(bu)分觀(guan)(guan)(guan)眾(zhong)之間可(ke)以進(jin)行實(shi)時互(hu)動(dong)(dong),然(ran)后將(jiang)互(hu)動(dong)(dong)結果實(shi)時播(bo)(bo)(bo)放給其他(ta)觀(guan)(guan)(guan)眾(zhong)觀(guan)(guan)(guan)看(kan)。基于以上業(ye)務需(xu)求,我們很容易想到基于單向(xiang)直播(bo)(bo)(bo)原理,在(zai)(zai)主播(bo)(bo)(bo)端(duan)和(he)連麥(mai)觀(guan)(guan)(guan)眾(zhong)端(duan)進(jin)行雙(shuang)向(xiang)推(tui)(tui)流(liu)(liu)和(he)雙(shuang)向(xiang)播(bo)(bo)(bo)流(liu)(liu)的(de)方式(shi)互(hu)動(dong)(dong),然(ran)后在(zai)(zai)服務端(duan)將(jiang)兩路(lu)推(tui)(tui)流(liu)(liu)合(he)成一路(lu)推(tui)(tui)送給其他(ta)觀(guan)(guan)(guan)眾(zhong)。但 RTMP 帶(dai)來的(de)延遲決定了這(zhe)種方式(shi)無法做到用(yong)戶(hu)可(ke)接(jie)受的(de)互(hu)動(dong)(dong)直播(bo)(bo)(bo)。實(shi)際上,互(hu)動(dong)(dong)直播(bo)(bo)(bo)的(de)主要技術難點在(zai)(zai)于:
1)低延遲互(hu)(hu)動:保(bao)證(zheng)主播和(he)互(hu)(hu)動觀眾之間(jian)能夠實時(shi)互(hu)(hu)動,兩者(zhe)之間(jian)就像電(dian)話溝(gou)通,因此必須保(bao)證(zheng)兩者(zhe)能在秒級(ji)以內聽(ting)到(dao)對方(fang)的聲音,看到(dao)對方(fang)的視(shi)頻(pin);
2)音畫同步(bu):互動直播中(zhong)(zhong)對音畫同步(bu)的需求和單(dan)向直播中(zhong)(zhong)類似,只不過互動直播中(zhong)(zhong)的延(yan)遲(chi)要求更高,必須保證在音視頻秒級傳(chuan)輸情(qing)況下的秒級同步(bu)。
3)音視(shi)頻實時(shi)合(he)成:其(qi)他觀眾(zhong)需(xu)要(yao)實時(shi)觀看到對話結果,因(yin)此需(xu)要(yao)在客戶(hu)端或(huo)者服(fu)務(wu)端將畫面和聲音實時(shi)合(he)成,然(ran)后以低成本(ben)高品質(zhi)的方式傳(chuan)輸(shu)觀眾(zhong)端。
在(zai)視(shi)頻和(he)電話會(hui)議領(ling)域,目(mu)前(qian)比(bi)較(jiao)(jiao)成(cheng)熟的(de)(de)方(fang)案是使(shi)用(yong)(yong)思科(ke)或者 WebEx 的(de)(de)方(fang)案,但這些商(shang)用(yong)(yong)的(de)(de)方(fang)案一不開(kai)源,二比(bi)較(jiao)(jiao)封閉,三成(cheng)本比(bi)較(jiao)(jiao)高。對(dui)于互(hu)動人數比(bi)較(jiao)(jiao)少的(de)(de)互(hu)動直播,目(mu)前(qian)市場上比(bi)較(jiao)(jiao)成(cheng)熟的(de)(de)方(fang)案是使(shi)用(yong)(yong)基于 WebRTC 的(de)(de)實時通訊方(fang)案。
上圖是一個基于 WebRTC 協議實現多方實時通訊的示意圖,本地用戶(主播)和遠程用戶(連麥觀眾)之間的連接通過 RTCPeerConnection API 管理,這個 API 包裝了底層流管理和信令控制相關的細節。基于該方案可以輕松實現多人(14 人以下)的多方實時通(tong)信(xin)。
當然,在通信人數少的情況下,其復雜度相對簡單,如 2 人情況下。但人數增多至 4 人之后,其可選的網絡結構就增多了,可(ke)以每(mei)個點之(zhi)間形成(cheng)自組織網絡(luo)的方式通(tong)信,也可以以 1 人為中心形成(cheng)星型通(tong)信網絡(luo),還(huan)可以讓(rang)大(da)家都(dou)通(tong)過一個集中式的服務端進行通(tong)信。
作為(wei)一個高(gao)性能、可伸縮的直播(bo)(bo)基礎服務提(ti)供商,七牛直播(bo)(bo)云經過評(ping)估(gu)選(xuan)擇了以主播(bo)(bo)為(wei)中心(xin)形成星形通信(xin)網絡(luo),支(zhi)持主播(bo)(bo)和多個觀(guan)眾之(zhi)間的互動質量(liang)。同時,為(wei)了保證合成后的音視頻實時傳(chuan)輸到其他觀(guan)眾端(duan),這里采用經過改造的 UDP 協議傳(chuan)輸:
1. 通過 UDP 降低(di)傳輸延遲。
2. 在 UDP 之上進行傳輸控制,保證(zheng)用戶互動體(ti)驗 QoS。
在下一篇連載中,將詳細介紹編碼和封裝,敬請期待。
為了讓大(da)家(jia)能夠將技術理論(lun)快速應用到實踐開發(fa)中(zhong),七牛云(yun)聯合慕課網特別(bie)制作了一期課程,專門針對移動直播(bo)應用開發(fa),供(gong)大(da)家(jia)學習參考:。