RTMP流媒體播放過程

本文描述了從打開一個RTMP流媒體到視音頻數據開始播放的全過程。

注意:RTMP中的邏輯結構

RTMP協議規定,播放一個流媒體有兩個前提步驟:第一步,建立一個網絡連接(NetConnection);第二步,建立一個網絡流(NetStream)。其中,網絡連接代表服務器端應用程序和客戶端之間基礎的連通關係。網絡流代表了發送多媒體數據的通道。服務器和客戶端之間只能建立一個網絡連接,但是基於該連接可以創建很多網絡流。他們的關係如圖所示:



1 簡要介紹

播放一個RTMP協議的流媒體需要經過以下幾個步驟:握手,建立連接,建立流,播放。RTMP連接都是以握手作爲開始的。建立連接階段用於建立客戶端與服務器之間的“網絡連接”;建立流階段用於建立客戶端與服務器之間的“網絡流”;播放階段用於傳輸視音頻數據。

2 握手(HandShake)

一個RTMP連接以握手開始,雙方分別發送大小固定的三個數據塊

a)        握手開始於客戶端發送C0、C1塊。服務器收到C0或C1後發送S0和S1。

b)        當客戶端收齊S0和S1後,開始發送C2。當服務器收齊C0和C1後,開始發送S2。

c)        當客戶端和服務器分別收到S2和C2後,握手完成。


握手

 

 

3建立網絡連接(NetConnection)

a)        客戶端發送命令消息中的“連接”(connect)到服務器,請求與一個服務應用實例建立連接。

b)        服務器接收到連接命令消息後,發送確認窗口大小(Window Acknowledgement Size)協議消息到客戶端,同時連接到連接命令中提到的應用程序。

c)        服務器發送設置帶寬()協議消息到客戶端。

d)        客戶端處理設置帶寬協議消息後,發送確認窗口大小(Window Acknowledgement Size)協議消息到服務器端。

e)        服務器發送用戶控制消息中的“流開始”(Stream Begin)消息到客戶端。

f)         服務器發送命令消息中的“結果”(_result),通知客戶端連接的狀態。


建立連接

4建立網絡流(NetStream)

a)      客戶端發送命令消息中的“創建流”(createStream)命令到服務器端。

b)      服務器端接收到“創建流”命令後,發送命令消息中的“結果”(_result),通知客戶端流的狀態。


建立流

 

5 播放(Play)

a)        客戶端發送命令消息中的“播放”(play)命令到服務器。

b)        接收到播放命令後,服務器發送設置塊大小(ChunkSize)協議消息。

c)        服務器發送用戶控制消息中的“streambegin”,告知客戶端流ID。

d)        播放命令成功的話,服務器發送命令消息中的“響應狀態” NetStream.Play.Start & NetStream.Play.reset,告知客戶端“播放”命令執行成功。

e)        在此之後服務器發送客戶端要播放的音頻和視頻數據。

播放流


RTMP協議規範(中文翻譯):http://download.csdn.net/detail/leixiaohua1020/6563059


****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

實現輸出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"獲取併發送的播放流程。

    

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

發佈了29 篇原創文章 · 獲贊 39 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章