RTMP協議分析

2021-06-23 03:05:34 字數 2574 閱讀 9784

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時...