拋開flash,自己開發實現C++ RTMP直播流播放器
眾所周知,RTMP是以flash為客戶端播放器的直播協議,主要應用在B/S形式的場景中。本人研究並用C++開發實現了RTMP直播流協議的播放器,結合之前做的RTMP直播采集端,可以將RTMP協議完全擴展到C/S形式的應用場景中,這將對之后的通用、全平台的流媒體架構設計和實現,打下堅實的基礎。
開發的意義
RTMP直播協議,是Adobe公司推出的以flash播放器為客戶端的實時直播流協議,是一種應用非常廣泛的通信協議。而flash直播,也是到目前為止,web頁面上最成熟的直播技術。不過,因為flash主要是嵌入到web頁面中,因此,RTMP直播,通常也就局限在B/S形式的直播應用。
我之前陸續做了很多與RTMP直播協議相關的項目開發,都是采集發布端的,數據發往FMS等rtmp服務器之后,最終是通過flash來收看的。並不是考慮flash本身好或不好的問題,而是想把這個BS的技術直播協議,不借助Adobe Air平台,擴展到C/S場景中,這樣,用戶不僅可以在網頁上收看RTMP協議的直播流,還可以通過客戶端來收看,大大豐富了直播協議的靈活度。另外,實現了這一點,為RTMP直播協議的跨平台,以及跨移動平台(Android, iOS)的應用,也提供了可能。有很好的前景。
比如,通過實現不同平台上的rtmp播放器,來實現如下架構。
設計和流程
其實,實現RTMP直播流播放器,邏輯上和實現其他直播流協議播放器,是一致的,整體上程序可以分為三個部分
- RTMP直播數據下載與數據包分解
- 數據包中分離H.264和AAC數據,並解碼
- 視頻渲染和音頻播放
實現的模塊,以及主要流程,如下圖所示
目前為止,這個設計是為Windows PC端開發所做,將來會做進一步移植,這個情況下,主要是修改視頻渲染和音頻播放的實現。
細節與實現
1. RtmpDownloader
RtmpDownloader模塊非常重要,我這里是將librtmp作為底層的rtmp傳輸協議。在librtmp之上,除了接口調用,還需要進行數據包的解析,h.264視頻數據和aac音頻數據的分離,以及從中解析出重要的解碼信息,交給解碼器解碼,並初始化渲染器。整個的框架和流程如下圖
RtmpPlayer四個接口所代表的意義下面列了出來。這就是RTMP下載最需要獲取到的數據,以及解碼信息。
2. 渲染和播放
說到視頻渲染,這似乎是個坑,相信做播放器開發的朋友會有說不完的話,不過我在這里就簡單貼下我的主要渲染流程。Windows上視頻渲染可以選擇的方式有很多,比如Direct3D、DirectDraw、GDI,OpenGL等,這里選擇d3d的方式來渲染。
音頻播放可以選擇WAVE系列函數,或者DirectSound的接口等,這里我選擇使用WAVE接口,原因當然是比較簡單啦 :)
實際效果
播放一下從網上找到的深圳衛視rtmp直播流地址,畫面清晰,音視頻同步,效果還不錯 :)
配合之前做的RTMP采集推送端,可以完全脫離flash來實現基於RTMP協議的直播。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
haibindev.cnblogs.com,合作請聯系QQ。(轉載請注明作者和出處)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++