本文轉自 一隻視訊程式猿的移動直播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推流功能以及播放功能來看,金山雲提供的功能最為豐富。
- 百度雲提供的推流功能還比較簡單,離市面的要求有些距離。