RTMP協議封包 參考Red5

2021-08-30 22:51:07 字數 3034 閱讀 4832

rtmp協議封包分析 參考red5

2023年03月20日 星期五 18:57

原創

rtmp協議封包 參考red5

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

第乙個位元組head_type的前兩個bit決定了包頭的長度.它可以用掩碼0xc0進行"與"計算:

head_type的前兩個bit和長度對應關係:

bits

header length

0012 bytes

018 bytes

104 bytes

111 byte

head_type的後面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

二、timmer

三、amfsize

amfsize佔三個位元組,這個長度是amf長度,可超過rtmp包的最大長度128位元組。如果超過了128位元組,那麼由多個後續rtmp封包組合,每個後續rtmp封包的頭只佔乙個位元組。一般就是以0xc?開頭。

四、amftype

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封包的資料

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 ,,,

資料依次解析的含義

03表示12位元組頭,channelid=3

000000表示timmer=0

000102表示amfsize=18

14表示amftype=invoke 方法呼叫

00 00 00 00 表示streamid = 0

//到此,12位元組rtmp頭結束下面的是amf資料分析,具體的amf0資料格式請參考

02表示string

0007表示string長度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資料開始

red5研究日記

想到乙個red5應用 手機鈴聲diy 接下來,就是如何一步步研究red5應用了 肉山的red5研究日記 一 安裝篇 肉山的red5研究日記 二 hello,world 肉山的red5研究日記 三 聊天室研究 肉山的red5研究日記 四 聊天室開發 demo放出!肉山的red5研究日記 五 小結以及對...

red5學習日誌二

這篇直接真槍實戰,搭建乙個流 伺服器,其實這些內容網上都可以搜到,我這裡只是記錄一下,以備忘。如下圖 如查不可以,連服務也啟不了的話,請檢查red5 home環境變數有沒有設定 我在執行red5.bat的時候,報了乙個關於 usestringcache的錯,我把這項從bat裡面刪除了 如果可行,ok...

Red5的集群方式

本來一直想總結下關於red5伺服器的知識。各種原因耽擱了,最近比較清閒,所以會陸續總結一些相關知識。今天呢,先說說red5的集群吧,自帶的集群 邊源方式。red5本身自帶集群的,在0.9.1版本的時候,可以配置邊源伺服器,配置的步驟也不算繁瑣。但是有乙個缺點是預設的伺服器,支援單邊多源,但是多個源之...