1. 程式人生 > >拋開flash,自己開發實現C++ RTMP直播播放器

拋開flash,自己開發實現C++ RTMP直播播放器

  眾所周知,RTMP是以flash為客戶端播放器的直播協議,主要應用在B/S形式的場景中。本人研究並用C++開發實現了RTMP直播流協議的播放器(延遲極低,內網可以做到百毫秒,目前已經實現PC端和Android端),結合之前做的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協議的直播。

     

 

 


  合作請聯絡QQ。(轉載請註明作者和出處)