天天看點

RTSP播放器開發填坑之道

好多開發者提到,在目前開源播放器如此泛濫的情況下,為什麼還需要做自研架構的RTSP播放器,自研和開源播放器,到底好在哪些方面?以下大概聊聊我們的一點經驗,感興趣的,可以關注 github:

1. 低延遲:大多數RTSP的播放都面向直播場景,如果延遲過大,嚴重影響體驗,是以,低延遲是衡量一個好的RTSP播放器非常重要的名額,目前大牛直播SDK的RTSP直播播放延遲比開源播放器更優異(大牛直播SDK延遲在1秒左右,開源播放器如VLC,延遲相對比較大),而且長時間運作下,大牛直播SDK播放端不會造成延遲累積,開源或第三方播放器,長時間運作,容易産生延遲累積;

2. 音視訊同步處理:大多點傳播放器為了追求低延遲,甚至不做音視訊同步,拿到audio video直接播放,導緻a/v不同步,還有就是時間戳亂跳等各種問題,大牛直播SDK提供的播放器,具備好的時間戳同步和異常時間戳矯正機制;

備注:如果是超低延遲模式下,可以0 buffer,不做音視訊同步:

3. 支援多執行個體:大牛直播SDK提供的RTSP直播播放SDK支援在裝置性能允許的情況下,支援多執行個體播放RTSP流資料,大多開源播放器對多執行個體支援不太友好;

4. 支援buffer time設定:在一些有網絡抖動的場景,播放器需要支援buffer time設定,一般來說,以毫秒計,開源播放器對此支援不夠友好;

5. 實時靜音:比如,多視窗播放RTSP流,如果每個audio都播放出來,體驗非常不好,是以實時靜音功能非常必要,開源播放器不具備實時靜音功能;

6. 視訊view旋轉:好多攝像頭由于安裝限制,導緻圖像倒置,是以一個好的RTSP播放器應該支援如視訊view實時旋轉(0° 90° 180° 270°)、水準反轉、垂直反轉,開源或第三方播放器不具備此功能;

7. 支援解碼後audio/video資料輸出:大牛直播SDK接觸到好多開發者,希望能在播放的同時,擷取到YUV或RGB資料,進行人臉比對等算法分析,開源播放器不具備此功能;

8. 實時快照:感興趣或重要的畫面,實時截取下來非常必要,一般播放器不具備快照能力,開源播放器不具備此功能;

9. 網絡抖動處理(如斷網重連):穩定的網絡處理機制、支援如斷網重連等,開源播放器對網絡異常處理支援較差;

10. 長期運作穩定性:大牛直播SDK提供的RTSP直播播放SDK适用于長時間運作,開源播放器對長時間運作穩定性支援較差;

11. 實時下載下傳速度回報:大牛直播SDK提供音視訊流實時下載下傳回調,并可設定回調時間間隔,確定實時下載下傳速度回報,以此來監聽網絡狀态,開源播放器不具備此能力;

12. 異常狀态處理、Event狀态回調:如播放的過程中斷網,大牛直播SDK提供的播放器可實時回調相關狀态,確定上層子產品感覺處理,開源播放器對此支援不好;

13. 設定視訊填充模式(等比例顯示):好多情況下,有些場景需要全view鋪滿播放,有些為了防止視訊拉伸,可以設定成等比例縮放顯示;

14. D3D檢測:一般來說市面上的大多Windows都支援D3D,有些小衆化的,隻支援GDI模式繪制,是以為了更好的相容性,這個接口非常必要;

15. 實時音量調節:實時音量調節特别是在多路播放的場景下,如大屏窗體環境下,通過更細粒度的音量調節,實作更好的播放體驗;

16. 隻播放關鍵幀:特别是大屏多執行個體場景播放的時候,盡管我們已經CPU占用非常低了,如果隻是檢視大概的監控情景,實作更多路的播放,隻播放關鍵幀是個非常好的功能點,如果需要原始幀播放,可以實時調節即可;

17. 特定機型硬解碼:特定機型硬解碼,也主要是用于多路播放場景下,通過硬解碼,實作更低的CPU占用目的;

18. TCP-UDP設定:考慮到部分伺服器或硬體裝置或網絡環境對TCP、UDP某一個支援的比較好,我們加了設定接口;

19. TCP-UDP自動切換:這個是更細力度的接口,比如預設設定了TCP模式,TCP模式下收不到資料,逾時後,自動切換到UDP模式嘗試,一般開源播放器不具備此功能;

20. 逾時時間設定:比如10-12秒收不到資料,自動重連,一般開源播放器支援不好。

基于上述因素,想做好一個RTSP或者RTMP播放器,需要考慮的點實在太多了,特别是細節問題,開源的表面看省了前80%的經曆,但是因為大多開源播放器系統比較龐大,适用于點播播放,卻對直播播放支援很差,如果要做細粒度的控制和bug修複,剩餘20%的經曆,可能會耗費研發人員更大的精力,不過換句話說,對技術人員成長還是非常有利的。