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