一。什麼是rtmp協議服務器
RTMP協議就是Real Time Messaging Protocol,實時消息傳輸協議, 是Adobe公司爲Flash播放器和服務器之間音、視頻及數據傳輸開發的實時消息傳送協議。協議中,視頻必須是H264編碼,音頻必須是AAC或MP3編碼,且多以flv格式封包。如今的視頻直播多數是基於該協議。網絡
RTMP協議是TCP/IP體系結構的應用層協議,它的基本數據單元是消息message,在互聯網中傳輸數據的時候消息被拆分爲更小的消息塊chunk,介紹下面三種消息,消息分塊和消息塊;編碼
1.消息url
消息的報文結構以下圖:.net
消息的報文由這五部分組成:消息類型id,消息長度,時間戳,和標示流媒體類型以及消息體五個部分組成orm
消息類型id爲1-7的時候表示協議控制,通常都是RTMP協議自身管理的協議消息,用戶都不須要對這部分進行操做。當message type id爲8 和 9的時候表示的是傳輸的是音頻和視頻流,15-20表示的是消息用於發送AMF編碼的命令,負責用戶與服務器之間的交互,好比播放,暫停等等。視頻
2.消息分塊(對1中消息體的分割)blog
消息分塊就是對1中消息體的分塊,媒體傳輸的時候會把消息體分割成默認爲128字節的消息塊,固然最後一個消息分塊能夠是小於128字節。ci
消息分塊的過程以下圖開發
3.消息塊
爲了能夠在網絡上能夠傳輸數據,通常都會將數據劃分小塊,消息塊chunk,這裏消息塊分爲消息頭(chunk header)和塊數據(chunk data),
chunk header分爲了:用於標識本塊的Chunk Basic Header,用於標識本塊負載所屬消息的Chunk Message Header,以及當時間戳溢出時纔出現的Extended Timestamp
RTMP傳輸媒體數據的過程當中,發送端首先把媒體數據封裝成消息,而後把消息分割成消息塊,最後將分割後的消息塊經過TCP協議發送出去。接收端在經過TCP協議收到數據後,首先把消息塊從新組合成消息,而後經過對消息進行解封裝處理就能夠恢復出媒體數據。
2.1 Chunk Basic Header [1-3字節]
HeaderType+ChannelID組成,其中ChannelID的大小決定了整個Chunk Basic Header的大小
2.1.1
這個字段編碼了消息塊流的
ID
和消息塊的類型,消息塊類型決定了消息包頭的編碼格式,長度徹底
取決於可變長的消息塊流
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數據
4.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/