拋開flash,本身開發實現C++ RTMP直播流播放器

拋開flash,本身開發實現C++ RTMP直播流播放器

  衆所周知,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直播流播放器,邏輯上和實現其餘直播流協議播放器,是一致的,總體上程序能夠分爲三個部分函數

  • RTMP直播數據下載與數據包分解
  • 數據包中分離H.264和AAC數據,並解碼
  • 視頻渲染和音頻播放

  實現的模塊,以及主要流程,以下圖所示spa

  

  目前爲止,這個設計是爲Windows PC端開發所作,未來會作進一步移植,這個狀況下,主要是修改視頻渲染和音頻播放的實現。架構設計

細節與實現

1. RtmpDownloader

   RtmpDownloader模塊很是重要,我這裏是將librtmp做爲底層的rtmp傳輸協議。在librtmp之上,除了接口調用,還須要進行數據包的解析,h.264視頻數據和aac音頻數據的分離,以及從中解析出重要的解碼信息,交給解碼器解碼,並初始化渲染器。整個的框架和流程以下圖設計

  

 

  RtmpPlayer四個接口所表明的意義下面列了出來。這就是RTMP下載最須要獲取到的數據,以及解碼信息。3d

  

2. 渲染和播放

   說到視頻渲染,這彷佛是個坑,相信作播放器開發的朋友會有說不完的話,不過我在這裏就簡單貼下個人主要渲染流程。Windows上視頻渲染能夠選擇的方式有不少,好比Direct3D、DirectDraw、GDI,OpenGL等,這裏選擇d3d的方式來渲染。視頻

  音頻播放能夠選擇WAVE系列函數,或者DirectSound的接口等,這裏我選擇使用WAVE接口,緣由固然是比較簡單啦 :)

  

  

實際效果

  播放一下從網上找到的深圳衛視rtmp直播流地址,畫面清晰,音視頻同步,效果還不錯 :)

  

  配合以前作的RTMP採集推送端,能夠徹底脫離flash來實現基於RTMP協議的直播。

     

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  haibindev.cnblogs.com,合做請聯繫QQ。(轉載請註明做者和出處)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

相關文章
相關標籤/搜索