http://baike.baidu.com/link?url=FHhUxVEwgD69JaZrVxpwFSPE_ci_Riw-ESX3tl4gI9BmXKCqV_rcH5QVb2hVr1xt097xIiLOdd43gKpACzOH-_服務器
RTMP協議是一個互聯網TCP/IP五層體系結構中應用層的協議。RTMP協議中基本的數據單元稱爲消息(Message)。當RTMP協議在互聯網中傳輸數據的時候,消息會被拆分紅更小的單元,稱爲消息塊(Chunk)。網絡
1 消息 編碼
消息是RTMP協議中基本的數據單元。不一樣種類的消息包含不一樣的Message Type ID,表明不一樣的功能。RTMP協議中一共規定了十多種消息類型,分別發揮着不一樣的做用。例如,Message Type ID在1-7的消息用於協議控制,這些消息通常是RTMP協議自身管理要使用的消息,用戶通常狀況下無需操做其中的數據。Message Type ID爲8,9的消息分別用於傳輸音頻和視頻數據。Message Type ID爲15-20的消息用於發送AMF編碼的命令,負責用戶與服務器之間的交互,好比播放,暫停等等。消息首部(Message Header)有四部分組成:標誌消息類型的Message Type ID,標誌消息長度的Payload Length,標識時間戳的Timestamp,標識消息所屬媒體流的Stream ID。消息的報文結構以下圖所示。
url
2 消息塊
在網絡上傳輸數據時,消息須要被拆分紅較小的數據塊,才適合在相應的網絡環境上傳輸。RTMP協議中規定,消息在網絡上傳輸時被拆分紅消息塊(Chunk)。消息塊首部(Chunk Header)有三部分組成:用於標識本塊的Chunk Basic Header,用於標識本塊負載所屬消息的Chunk Message Header,以及當時間戳溢出時纔出現的Extended Timestamp。消息塊的報文結構以下圖所示。
spa
3 消息分塊 .net
在消息被分割成幾個消息塊的過程當中,消息負載部分(Message Body)被分割成大小固定的數據塊(默認是128字節,最後一個數據塊能夠小於該固定長度),並在其首部加上消息塊首部(Chunk Header),就組成了相應的消息塊。消息分塊過程以下圖所示,一個大小爲307字節的消息被分割成128字節的消息塊(除了最後一個)。
3d
RTMP傳輸媒體數據的過程當中,發送端首先把媒體數據封裝成消息,而後把消息分割成消息塊,最後將分割後的消息塊經過TCP協議發送出去。接收端在經過TCP協議收到數據後,首先把消息塊從新組合成消息,而後經過對消息進行解封裝處理就能夠恢復出媒體數據。
2.1 Chunk Basic Header [1-3字節]
HeaderType+ChannelID組成,其中ChannelID的大小決定了整個Chunk Basic Header的大小
2.1.1 orm
這個字段編碼了消息塊流的 視頻
ID blog
和消息塊的類型,消息塊類型決定了消息包頭的編碼格式,長度徹底
取決於可變長的消息塊流
HeaderType(fmt):決定了Chunk Message Header的編碼方式和大小,在第一個字節的高兩位
Bits Chunk Message Header Length
00 12 bytes
01 8 bytes
10 4 bytes
11 1 byte
2.1.2 ChannelID:
ChannelID 用途
02 Ping 和ByteRead通道
03 Invoke通道 咱們的connect() publish()和自字寫的NetConnection.Call() 數據都是在這個通道的
04 Audio和Vidio通道
05 06 07 服務器保留,經觀察FMS2用這些Channel也用來發送音頻或視頻數據
2.2 Chunk Message Header
以最大fmt =00 length(Chunk Message Header) == 12 爲例
Chunk Message Header的結構是:timestamp,message_length,message_type,msg_stream_id
其中message_type是一個枚舉變量:
type爲1,2,3,5,6的時候是協議控制消息
type爲4的時候表示 User Control Messages [Event_type + Event_Data] Event_type有Stream Begin,Stream End...
type爲8,音頻數據
type爲9,視頻數據
type爲18 元數據消息[AMF0]
type爲20 命令消息 Command Message(RPC Message)
These messages are sent to perform some operations like connect, createStream, publish, play, pause on the peer.
命令消息主要分紅兩種NetConnection和NetStream。
connect,call,close,createStream命令能夠在NetConnection中發送。
coonect(name,TranscationID,Command Object pair)
play,publish,seek,pause等命令能夠在NetStream中發送。
2.3 Ext Time Stamp
2.4數據
3 RTMP流媒體播放過程
RTMP 協議規定,播放一個流媒體有兩個前提步驟:第一步,創建一個網絡鏈接(NetConnection);第二步,創建一個網絡流(NetStream)。其 中,網絡鏈接表明服務器端應用程序和客戶端之間基礎的連通關係。網絡流表明了發送多媒體數據的通道。服務器和客戶端之間只能創建一個網絡鏈接,可是基於該 鏈接能夠建立不少網絡流。
播放一個RTMP協議的流媒體須要通過如下幾個步驟:握手,創建鏈接,創建流,播放。RTMP鏈接都是以握手做爲開始的。創建鏈接階段用於創建客戶端與服務器之間的「網絡鏈接」;創建流階段用於創建客戶端與服務器之間的「網絡流」;播放階段用於傳輸視音頻數據。
參考:http://blog.csdn.net/leixiaohua1020/article/category/1362941
RTMP協議中文版
http://wenku.baidu.com/link?url=Lc4gR-FLeCkHCMM1NL-FcAUtKFTRaFn0tcdoqcid6Dtvu_Q2wlSQ-GMY711Ptc_TdeG2KU0E9e-aHddFVZJSMwt2CujY2p7AdHg8Vr15HuG
RTMP協議英文版
http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf
開源項目 RTMP Dump
http://rtmpdump.mplayerhq.hu/