一隻視訊程式猿的移動直播SDK初體驗
原文地址http://science.china.com.cn/2016-06/06/content_8816359.htm
今早老闆召開站會,“移動直播這麼火,市面上有一百多個APP,小斌,你下週交個原型APP瞅瞅!”
小弟心中一萬匹草泥馬奔過,這玩意兒哪兒是幾天就能弄出來的?問候歸問候,我們還是趕緊調研吧,端午還約了妹子游泳呢。
一、 方案選項
作為公司音視訊大神,對流媒體基本概念還是OK的。我們首先看看市面上火熱的某客、某椒APP怎麼工作的。主播端推流使用RTMP推向流媒體源站,伺服器內部通過RTMP協議多級拉流至邊緣CDN節點,播放端從邊緣CDN節點獲取直播內容,大致如下圖:
其中上行RTMP推流很普遍了,很多遊戲直播都使用obs推RTMP流。
在整個過程中,涉及很多流媒體的基本概念,先說說GOP。
GOP即Group of picture(影象組),指兩個I幀之間的距離。即幾秒有一個關鍵幀。分析線上主流的移動直播APP,大都在2、3秒之間。
一般的雲服務公司都會提供多種協議的拉流方式,優缺點如下:
l HLS協議,移動h5瀏覽器支援較好,但是延遲較大。移動端播放前需要產生三個分片,每個分片至少得是一個GOP。一個GOP即使是2秒,也意味著這個環節耗費了6秒的延時。
l RTMP協議,需要訪問1935埠,支援雙向互動,實時性很好,PC flash原生支援。
l HTTP-FLV,不支援雙向互動,實時性和RTMP協議一致。
基於以下幾點理由,小弟準備採用HTTP-FLV作為拉流協議:
-
國內網路情況的惡劣程度,並不是每個網路防火牆都允許1935包通過。
-
RTMP協議和HTTP-FLV,實際傳輸的內容都是相同的FLV,實時性也一樣。
-
RTMP協議握手方式比HTTP複雜。
確定好了拉流協議,再看看推流側依賴的引數。
l FPS,每秒編碼傳輸的視訊幀數;
l 位元速率,每秒編碼傳輸的音視訊位元數;
l GOP,關鍵幀間隔;
l 解析度。
在相同位元速率的情況下,FPS和解析度越大,視訊的影象質量越差。為了平衡主播上行頻寬、使用者觀看下行頻寬和影象質量的關係,需要很好處理這幾個值。
二、 SDK下載
首先,Android/iOS系統上,並不包含RTMP推流元件,這塊需要自己開發。系統自帶的播放器也不支援flv檔案的播放。小弟只能去阿里雲、騰訊雲、百度雲、金山雲等大牛雲服務公司找解決方案了。把每個帳號都註冊一遍,大致情形如下。
其中,騰訊雲ILVB實名認證後需要人工稽核5個工作日,反正至今沒有看到SDK。
更令人震驚的是,雖然阿里雲提供多媒體雲服務,但是至今尚未提供移動直播SDK。
總體來說,開放較好的是金山雲,SDK放到了github上,每次change log都很清楚,幾乎每週都有更新。 騰訊雲就有些猶抱琵琶半遮面,給SDK試用都不痛快。
三、 SDK功能對比
拿到SDK,首先對比一下相關功能。其中騰訊雲LVB直播只提供了播放SDK,還僅只支援HLS播放,這個方案首先撲街。ILVB互動直播未拿到SDK,暫且不表。這樣一來,可供選擇的大型雲服務商的方案就剩下金山雲和百度雲。
移動直播SDK涉及的功能比較多,我先解釋一下幾個基本功能點:
l 推流編碼,涉及軟體編碼和硬解編碼。相同位元速率,軟編影象質量更清晰,但是耗電更高;
l 網路自適應,當網路抖動時根據網路情況調整傳送速率;
l 美顏,對主播影象進行美白、液化、磨皮等處理;
l 混音,當主播聊天時,可以把背景音樂混到音視訊裡面;
l 播放視訊旋轉,可以根據視訊寬高,決定橫屏還是豎屏播放;
l 直播重載入,當播放狀況不佳時,重新拉流播放。
為了對比其他方案,做了幾張表格。
Android推流功能列表如下:
從表中可以看到,
-
百度雲介面還很粗糙,連移動直播必選的美顏功能都不支援,首先淘汰。
-
小弟想有噪聲抑制功能,但是這些SDK都沒有支援,不過令人欣喜的是,金山雲支援自定義音訊資料處理,可以把自己的噪聲抑制程式碼掛載進去。
-
相比而已,金山雲的介面較開放。其中金山雲SDK支援的功能更豐富些,能滿足當前移動直播的要求。
iOS推流功能列表如下:
-
從表中可以看出,iOS推流功能豐富程度普遍較高,這和市面上主播大量使用iPhone推流有密切關係。
-
從特色功能來看,只有金山雲支援畫中畫和美聲功能。
-
自定義濾鏡和原始資料處理,體現了SDK的開放程度,這方面百度雲是嚴重失分的。
-
在細節功能上,對聲音和美顏的處理,體現了當前SDK對移動直播市場的重視程度。
Android播放功能列表如下:
iOS播放功能列表如下:
播放端關注點和推流端還有些不一樣,播放側除了考慮功能豐富以外,還需要考慮穩定性、功耗、包大小、開播速度等,靜態對比可以作為參考。金山雲支援直播重載入,能有效降低播放卡頓率。
總結一下,通過試用大型雲服務商的移動直播SDK,得出以下結論:
-
能完全執行起來的是金山雲、百度雲提供的SDK。騰訊雲、阿里雲尚未提供真正可用的移動直播SDK。
-
從Android/iOS推流功能以及播放功能來看,金山雲提供的功能最為豐富。
-
百度雲提供的推流功能還比較簡單,離市面的要求有些距離。
最後,小斌想說的是:幸好有了靠譜的視訊雲服務公司,一週做出一款移動直播產品才不是夢,才不會耽誤端午約妹子游泳喲。
如果覺得我的文字對你有所幫助的話,歡迎關注我的公眾號:
我的群歡迎大家進來探討各種技術與非技術的話題,有興趣的朋友們加我私人微信huannan88,我拉你進群交(♂)流(♀)。