日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

RTMP協(xié)議分析 一、RTMP包頭

 shaobin0604@163.com 2012-01-10
原創(chuàng)
RTMP協(xié)議 封包 參考Red5
RTMP協(xié)議封包 由一個(gè)包頭和一個(gè)包體組成,包頭可以是4種長(zhǎng)度的任意一種:12, 8, 4,  1 byte(s).完整的RTMP包頭應(yīng)該是12bytes,包含了時(shí)間戳,Head_Type,AMFSize,AMFType,StreamID信 息, 8字節(jié)的包頭只紀(jì)錄了時(shí)間戳,Head_Type,AMFSize,AMFType, 4個(gè)字節(jié)的包頭記錄了時(shí)間戳,Head_Type。1個(gè)字節(jié)的包頭只記錄了Head_Type 。包體最大長(zhǎng)度默認(rèn)為128字節(jié),通過(guò)chunkSize 可改變包體最大長(zhǎng)度,通常當(dāng)一段AFM數(shù)據(jù)超過(guò)128字節(jié)后,超過(guò)128的部分就放到了其他的RTMP封包中,包頭為一個(gè)字節(jié).
完整的RTMP包頭有12字節(jié),由下面5個(gè)部分組成:
用途大小(Byte)含義
Head_Type1包頭
TIMER3時(shí)間戳
AMFSize3數(shù)據(jù)大小
AMFType1數(shù)據(jù)類型
StreamID4流ID

一、Head_Type - 包頭類型
Head_Type占用RTMP包的第一個(gè)字節(jié),這個(gè)字節(jié)里面記錄了包的類型和包的ChannelID。Head_Type字節(jié)的前兩個(gè)Bit決定了包頭的長(zhǎng)度.它可以用掩碼0xC0進(jìn)行"與"計(jì)算:
Head_Type的前兩個(gè)Bit和長(zhǎng)度對(duì)應(yīng)關(guān)系:
Bits Header Length
00 12 bytes
01 8 bytes
10 4 bytes
11 1 byte

Head_Type的后面6個(gè)Bit和StreamID決定了ChannelID。  StreamID和ChannelID對(duì)應(yīng)關(guān)系:StreamID=(ChannelID-4)/5+1 參考red5
ChannelID用途
02Ping 和ByteRead通道
03Invoke通道 我們的connect() publish()和自字寫(xiě)的NetConnection.Call() 數(shù)據(jù)都是在這個(gè)通道的
04Audio和Vidio通道
05 06 07服務(wù)器保留,經(jīng)觀察FMS2用這些Channel也用來(lái)發(fā)送音頻或視頻數(shù)據(jù)

例如在rtmp包的數(shù)據(jù)中里面,發(fā)現(xiàn)被插入了一個(gè)0xC2,這個(gè)就是一字節(jié)的包頭,并且channelID=2.

二、TiMMER - 時(shí)間戳

時(shí) 間戳占用RTMP包頭的第2、3、4 三個(gè)字節(jié)。RTMP時(shí)間戳可分為絕對(duì)時(shí)間戳和相對(duì)時(shí)間戳,紀(jì)錄的是音視頻的時(shí)間信息。相對(duì)時(shí)間戳指的是二個(gè)RTMP包之間的時(shí)間間隔,單位毫秒。而絕對(duì)時(shí) 間戳指的是當(dāng)前封包發(fā)送的時(shí)刻,單位也是毫秒。對(duì)于音視頻的播放,時(shí)間戳非常關(guān)鍵,因?yàn)橐粢曨l的播放同步是由時(shí)間戳來(lái)控制的,如果你的視頻出現(xiàn)卡頓,音視 頻不同步,延時(shí)越來(lái)越大,很可能就是你的時(shí)間戳不準(zhǔn)導(dǎo)致的。
fms對(duì)于同一個(gè)流,發(fā)布(publish)的時(shí)間戳和播放(play)的時(shí)間戳是有區(qū)別的
publish時(shí)間戳,采用相對(duì)時(shí)間戳,時(shí)間戳值等于當(dāng)前媒體包的絕對(duì)時(shí)間戳與上個(gè)媒體包的絕對(duì)時(shí)間戳之間的差距,也就是說(shuō)音視頻時(shí)間戳在一個(gè)時(shí)間軸上面.單位毫秒。
play時(shí)間戳,也是相對(duì)時(shí)間戳,時(shí)間戳值等于當(dāng)前媒體包的絕對(duì)時(shí)間戳與上個(gè)同類型媒體包的絕對(duì)時(shí)間戳之間的差距, 注意這里跟上面不同的是強(qiáng)調(diào)“同類型的媒體包”。也就是說(shuō)音視頻時(shí)間戳分別采用單獨(dú)的時(shí)間軸,單位毫秒。
flv格式文件時(shí)間戳,絕對(duì)時(shí)間戳,時(shí)間戳長(zhǎng)度3個(gè)字節(jié)。超過(guò)0xFFFFFF后時(shí)間戳值等于TimeStamp & 0xFFFFFF。
flv格式文件影片總時(shí)間長(zhǎng)度保存在onMetaData的duration屬性里面,長(zhǎng)度為8個(gè)字節(jié),是一個(gè)double類型。


三、AMFSize - 數(shù)據(jù)大小
AMFSize 占三個(gè)字節(jié),這個(gè)長(zhǎng)度是AMF長(zhǎng)度,可超過(guò)RTMP包的最大長(zhǎng)度128字節(jié)。如果超過(guò)了128字節(jié),那么由多個(gè)后續(xù)RTMP封包組合,每個(gè)后續(xù)RTMP封 包的頭只占一個(gè)字節(jié)。一般就是以0xC?開(kāi)頭。1個(gè)字節(jié)的包頭表示這個(gè)包的時(shí)間戳、數(shù)據(jù)大小、數(shù)據(jù)類型、流ID都和上一個(gè)相同ChannelID的 RTMP包完全一樣。

四、AMFType - 數(shù)據(jù)類型
AMFType是RTMP包里面的數(shù)據(jù)的類型,占用1個(gè)字節(jié)。例如音頻包的類型為8,視頻包的類型為9。下面列出的是常用的數(shù)據(jù)類型:

0×01 Chunk Size changes the chunk size for packets
0×02 Unknown
0×03 Bytes Read send every x bytes read by both sides
0×04 Ping ping is a stream control message, has subtypes
0×05 Server BW the servers downstream bw
0×06 Client BW the clients upstream bw
0×07 Unknown
0×08 Audio Data packet containing audio
0×09 Video Data packet containing video data
0x0A-0x0EUnknown  
0x0FFLEX_STREAM_SENDTYPE_FLEX_STREAM_SEND
0x10FLEX_SHARED_OBJECT TYPE_FLEX_SHARED_OBJECT
0x11FLEX_MESSAGE  TYPE_FLEX_MESSAGE 
0×12 Notify an invoke which does not expect a reply
0×13 Shared Object has subtypes
0×14 Invoke like remoting call, used for stream actions too.
0×16 StreamData 這是FMS3出來(lái)后新增的數(shù)據(jù)類型,這種類型數(shù)據(jù)中包含AudioData和VideoData


五、StreamID - 流ID
占 用RTMP包頭的最后4個(gè)字節(jié),是一個(gè)big-endian的int型數(shù)據(jù)。我們x86 計(jì)算機(jī)內(nèi)存中數(shù)據(jù)存放都是小尾數(shù)模式:little-endian,而網(wǎng)絡(luò)數(shù)據(jù)流一般都是大尾數(shù)模式:big-endian。 StreamID是音視頻 流的唯一ID, 一路流如果既有音頻包又有視頻包,那么這路流音頻包的StreamID和他視頻包的StreamID相同,但ChannelID不同。
ChannelID 和StreamID之間的計(jì)算公式:StreamID=(ChannelID-4)/5+1  參考red5。如果這個(gè)封包既不是音頻包,也不是視頻包,那么他的StreamID=0.
例如當(dāng)音視頻包ChannelID為2、3、4時(shí)StreamID都為1 當(dāng)音視頻包ChannelID為9的時(shí)候StreamID為2

六、封包分析
例如有一個(gè)RTMP封包的數(shù)據(jù)0300 00 00 00 01 02 1400 00 00 00 0200 07 63 6F 6E 6E 65 63 74 003F F0 00 00 00 00 00 00 08 ,,,
數(shù)據(jù)依次解析的含義
03表示12字節(jié)頭,channelid=3
000000表示時(shí)間戳 Timer=0
000102表示AMFSize=18
14表示AMFType=Invoke 方法調(diào)用
 00 00 00 00 表示StreamID = 0
//到此,12字節(jié)RTMP頭結(jié)束下面的是AMF數(shù)據(jù)分析,具體的AMF0數(shù)據(jù)格式請(qǐng)參考 RTMP協(xié)議 二、AMF數(shù)據(jù)
02表示String
0007表示String長(zhǎng)度7
63 6F 6E 6E 65 63 74 是String的Ascall值"connect"
00表示Double
3F F0 00 00 00 00 00 00 表示double的0.0
08表示Map數(shù)據(jù)開(kāi)始
下面是我用c++實(shí)現(xiàn)的完整的rtmp客戶端程序下載
RTMP協(xié)議分析 二、AMF數(shù)據(jù)http://www./fly2700/archive/2008/04/09/281432.html
程序下載http://www./fly2700/archive/2008/04/02/280641.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多