1. 程式人生 > >實現直接輸出h264直播流的rtmp伺服器

實現直接輸出h264直播流的rtmp伺服器

RTMP(Real Time Messaging Protocol)是常見的流媒體協議,用來傳輸音視訊資料,結合flash,廣泛用於直播、點播、聊天等應用,以及pc、移動、嵌入式等平臺,是做流媒體開發經常會接觸到的協議。我之前曾經寫過一篇文章“RTMP協議傳送H.264編碼及AAC編碼的音視訊直播”,介紹過如何在自己的程式裡使用rtmp協議,不過那篇文章講的主要是如何實現一個rtmp直播的釋出端,主要側重在“採集-編碼-rtmp釋出”這樣的流程。這篇文章的主要內容是和大家分享下,做一個簡單的、直接輸出H.264直播流的rtmp server,需要實現哪些功能和步驟。 

常見的rtmp伺服器

  有很多知名的rtmp server,其中既有商業程式也有開源程式,簡單列舉如下:

  開源專案

    

 

  商業程式

    

  當然,還有一些其他的開源、商業rtmp伺服器(如ffserver),我就不一一列舉了。我並沒有一一嘗試,不過,從它們的宣告來看,一般來說,商業rtmp程式要比開源程式支援更多的協議以及更多的平臺,至於哪個更好,這就不好說了。我比較推薦的是crtmpserver,高效能,號稱可以支援“thousands of simultaneous connections

”,而且它的開發社群目前很活躍。不過缺點是,程式碼量有點龐大,而且在不斷增加當中。

  rtmp伺服器的功能比較複雜,要完整實現比較困難,如果你需要的是一個完整功能的rtmp server,那就可以從它們之中選擇一個,如果你的需求和我一樣,只是一個簡單的、輸出H.264直播流的rtmp server,那就需要自己來設計和實現。

rtmp server與播放器的互動

  我們需要實現的是:支援flash播放協議、輸出H.264直播流的rtmp server,那麼首先,我們必須瞭解rtmp伺服器和flash播放器客戶端之間是怎樣的一個互動流程。通過閱讀《rtmp specification 1.0》就可以瞭解,我這裡把它歸納總結一下。

    

  基本上一個rtmp server實現了以上6點互動協議,就可以支援flash的播放,順利的輸出h.264視訊流。

設計與實現

  知道了互動過程,我們就可以來設計和實現自己的Rtmp伺服器了。由於RTMP協議是基於TCP協議的,所以rtmp server本質上就是一個TCP伺服器,它的邏輯結構基本上和普通的TCP伺服器是類似的。

  事實上,librtmp已經提供了基本的rtmp報文的讀取和傳送,可以在librtmp的基礎上進行開發,來實現各種rtmp協議的組包和傳送,從裝置、檔案或網路中獲取到視訊資料,封裝成Rtmp資料報文,發給flash播放器,完成播放。

  我在另一篇文章“RTMP協議傳送H.264編碼及AAC編碼的音視訊”中,已經詳細介紹瞭如何編譯和使用librtmp,感興趣的可以去看一下。那篇文章中談的是rtmp協議視訊釋出端,和釋出端相同的是,rtmp server向flash播放器傳送的視訊資料流,也是需要首先發送"AVC sequence header",這其中包含的是重要的編碼資訊,沒有的話,flash播放器將無法解碼。下面的程式碼即是rtmp server收到播放請求之後,從"H264Reader"獲取併發送的播放流程。

    

 


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


題外話:發現了很多部落格用了我製作的RtmpServer和Client的互動流程圖,以及現有Rtmp伺服器的總結表格。你用我的圖片沒問題,本身寫部落格就是為了分享和交流知識的,但是能否請你們尊重一下作者的勞動成果,標註一下出處!