衆所周知,RTMP是以flash爲客戶端播放器的直播協議,主要應用在B/S形式的場景中。本人研究並用C++開發實現了RTMP直播流協議的播放器,結合以前作的RTMP直播採集端,能夠將RTMP協議徹底擴展到C/S形式的應用場景中,這將對以後的通用、全平臺的流媒體架構設計和實現,打下堅實的基礎。web
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直播流播放器,邏輯上和實現其餘直播流協議播放器,是一致的,總體上程序能夠分爲三個部分函數
實現的模塊,以及主要流程,以下圖所示spa
目前爲止,這個設計是爲Windows PC端開發所作,未來會作進一步移植,這個狀況下,主要是修改視頻渲染和音頻播放的實現。架構設計
RtmpDownloader模塊很是重要,我這裏是將librtmp做爲底層的rtmp傳輸協議。在librtmp之上,除了接口調用,還須要進行數據包的解析,h.264視頻數據和aac音頻數據的分離,以及從中解析出重要的解碼信息,交給解碼器解碼,並初始化渲染器。整個的框架和流程以下圖設計
RtmpPlayer四個接口所表明的意義下面列了出來。這就是RTMP下載最須要獲取到的數據,以及解碼信息。3d
說到視頻渲染,這彷佛是個坑,相信作播放器開發的朋友會有說不完的話,不過我在這裏就簡單貼下個人主要渲染流程。Windows上視頻渲染能夠選擇的方式有不少,好比Direct3D、DirectDraw、GDI,OpenGL等,這裏選擇d3d的方式來渲染。視頻
音頻播放能夠選擇WAVE系列函數,或者DirectSound的接口等,這裏我選擇使用WAVE接口,緣由固然是比較簡單啦 :)
播放一下從網上找到的深圳衛視rtmp直播流地址,畫面清晰,音視頻同步,效果還不錯 :)
配合以前作的RTMP採集推送端,能夠徹底脫離flash來實現基於RTMP協議的直播。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
haibindev.cnblogs.com,合做請聯繫QQ。(轉載請註明做者和出處)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++