rtmp協議封包 由乙個包頭和乙個包體組成,包頭可以是4種長度的任意一種:12, 8, 4, 1 byte(s).完整的rtmp包頭應該是12bytes,包含了時間戳,amfsize,amftype,streamid資訊, 8位元組的包頭只紀錄了時間戳,amfsize,amftype,其他位元組的包頭紀錄資訊依次類推 。包體最大長度預設為128位元組,通過chunksize可改變包體最大長度,通常當一段afm資料超過128位元組後,超過128的部分就放到了其他的rtmp封包中,包頭為乙個位元組.
完整的12位元組rtmp包頭每個位元組的含義: 用途
大小(byte)
含義head_type1包頭
timmer
3時間戳
amfsize
3資料大小
amftype
1資料型別
streamid
4流id
第乙個位元組head_type的前兩個bit決定了包頭的長度.它可以用掩碼0xc0進行"與"計算:
head_type的前兩個bit和長度對應關係:
bits
header length
0012 bytes
018 bytes
104 bytes
111 byte
前面說包頭有幾種長度,第乙個長度是12bytes,包含了全部的頭資訊,第乙個資料流也就是流的開始必須是這個長度。
第三種為4bytes,只有head_type和時間戳,缺少的對方認為與之前的一樣,實際應用中很難出現。
第四中就只有head_type乙個byte。如果一次資料超過了長度(預設是128bytes),就要分塊,第乙個塊是12bytes或者8bytes的,之後的塊就是1byte。因為分的n塊,每一塊的資訊都是一樣的,所以只需要告訴對方此次包的長度就行了。
head_type的後6個bit
叫做 chunk stream id (塊流 id)。後面6個bit和streamid決定了channelid。 streamid和channelid對應關係:streamid=(channelid-4)/5+1 參考red5
channelid
use02
ping 和byteread通道
03invoke通道 我們的connect() publish()和自字寫的netconnection.call() 資料都是在這個通道的
04audio和vidio通道
05 06 07
例如在rtmp包裡面經常看到的0xc2, 就表示一位元組的包頭,channel=2.
amfsize佔三個位元組,這個長度是amf長度,可超過rtmp包的最大長度128位元組。如果超過了128位元組,那麼由多個後續rtmp封包組合,每個後續rtmp封包的頭只佔乙個位元組。一般就是以0xc?開頭。
amfsize佔三個位元組,這個長度是amf長度,可超過rtmp包的最大長度128位元組。
amftype是包的型別
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-0x0e
unknown
0x0f
flex_stream_send
type_flex_stream_send
0x10
flex_shared_object
type_flex_shared_object
0x11
flex_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出來後新增的資料型別,這種型別資料中包含audiodata和videodata
五、streamid
例如當channelid為2、3、4時streamid都為1 當channelid為9的時候streamid為2
RTMP協議分析
用途 大小 byte 含義head type1包頭 timer 3時間戳 amfsize 3資料大小 amftype 1資料型別 streamid 4流id 一 head type 包頭型別 head type占用rtmp包的第乙個位元組,這個位元組裡面記錄了包的型別和包的channelid。hea...
RTMP協議分析
用途 大小 byte 含義head type1包頭 timer 3時間戳 amfsize 3資料大小 amftype 1資料型別 streamid 4流id 一 head type 包頭型別 head type占用rtmp包的第乙個位元組,這個位元組裡面記錄了包的型別和包的channelid。hea...
rtmp協議分析
最近需要做乙個rtmp伺服器,著手分析一下rtmp協議,開幹。rtmp握手 這個推薦一篇文章講解得比較透徹 rtmp協議中除了握手,其他的資料都是通過rtmp包傳送的。rmtp包完 有完整就當然有不完整了 整結構如下 以下內容參考了 用途大小 byte 含義head type1包頭 timer 3時...