RTMP header解析
来源:互联网 发布:快速凸包算法 编辑:程序博客网 时间:2024/06/06 10:59
+-------------+----------------+-------------------+--------------+
| Basic header|Chunk Msg Header|Extended Time Stamp| Chunk Data |
+-------------+----------------+-------------------+--------------+
(图1.包头header 构成)
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|fmt| cs id |
+-+-+-+-+-+-+-+-+
Figure 6 Chunk basic header 1
(图2. Basic header构成)
Baisc header 是1-3个字节,第一个字节的高2位表示包头的格式,低6位表示chunk stream ID
1)chunk stream ID决定了Basic header的字节数,首先查看低六位的取值:
- 3及以上的则Basic header为一个字节
- 0为两个字节,chunk stream id = 64 + 第二个字节值 (64-319)
- 1为三个字节,chunk stream id = 第三字节*256 + 第二字节 + 64(64–65599)
- 2为一个字节,Value 2 indicates its low-level protocol message
chunk stream id 含义
2: low level
3: high level like connect,createStream
4: control stream
5: video
6: audio
8: control stream
2)fmt取值决定了整个包头header的长度(以下表现的长度均不包含Basic header的长度)
两位的fmt取值为 0~3,分别代表的意义如下:
case 0:chunk Msg Header长度为11;
case 1:chunk Msg Header长度为7;
case 2:chunk Msg Header长度为3;
case 3:chunk Msg Header长度为0;
我们以11个字节的完整包头来解释Chunk Msg Header,如图所示
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ timestamp + message length + message type id + message stream id +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Timestamp:3bytes
对于type 0的chunk,绝对时间戳在这里表示,如果时间戳值大于等于0xffffff(16777215),该值必须是0xffffff,且时间戳扩展字段必须发送,其他情况没有要求。
message length:3bytes
Message的长度,注意这里的长度并不是跟随chunk head其后的chunk data(Payload)的长度,而是前文提到的一条信令或者一帧视频数据或音频数据的长度。前文提到过信令或者媒体数据都称之为Message,一条Message可以分为一条或者多条chunk。
message type id:1byte
Message的类型ID,具体的值将在后文专门来讨论。
message stream id:4bytes
message stream id的字节序是小端序,这个字段是为了解复用而设计的,RTMP文档上说的相当的模糊,
message stream ID可以使任意值,不同的消息流复用成相同的chunk stream,基于它们的ID能够解复用。于chunk stream 是相关的,这个字段是一个不透明的值没有整明白什么意思,我的理解就是用来标识和服务器连接的flash端的序号。
长度是7 bytes 的chunk head,该类型不包含stream ID,该chunk的streamID和前一个chunk的stream ID是相同的,变长的消息,例如视频流格式,在第一个新的chunk以后使用这种类型,注意其中时间戳部分是相对时间,为何上一个绝对时间之间的差值 如图所示:
++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ timestamp delta + message length + message type id +
++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 bytes的chunk head,该类型既不包含stream ID也不包含消息长度,这种类型用于stream ID和前一个chunk相同,且有固定长度的信息,例如音频流格式,在第一个新的chunk以后使用该类型。如图所示:
++++++++++++++++++++
+ timestamp delta +
++++++++++++++++++++
0 bytes的chunk head,这种类型的chunk从前一个chunk得到值信息,当一个单个消息拆成多个chunk时,这些chunk除了第一个以外,其他的都应该使用这种类型,
chunk的长度:
chunk的长度初始长度固定为128个字节,但是这个值并不是不可变的,在客户端和服务端建立连接以后,客户端和服务端都可以通过发送信令的方式来通知对端修改chunk的长度,理论上来说可以修改chunk的最长长度为65536。这里chunk的长度是指chunk的数据部分的长度,即chunk data(payload)的长度,如果一条Message的数据长度超过了chunk的长度,就必须把Message分割成多条chunk,即如果一条视频类型Message长度为2000个byte,chunk长度为1500,则该Message将会分割成两条chunk,第一条的chunk data长度为1500,第二条的chunk data长度为500。当然这两条chunk的chunk head肯定是不同的,其中第二条chunk的chunk head就是0字节的
- Message Type ID:
0×01 Chunk Size changes the chunk size for packets0×02 Unknown anyone know this one? 0×03 Bytes Read send every x bytes read by both sides0×04 Ping ping is a stream control message, has subtypes0×05 Server BW the servers downstream bw0×06 Client BW the clients upstream bw 0×07 Unknown anyone know this one? 0×08 Audio Data packet containing audio 0×09 Video Data packet containing video data0x0A - 0×11 Unknown anyone know? 0×12 Notify an invoke which does not expect a reply0×13 Shared Object has subtypes 0×14 Invoke like remoting call, used for stream actions too.
转载地址 http://www.cnblogs.com/MonkChen/archive/2011/08/17/2141709.html
- RTMP header解析
- RTMP header解析
- RTMP AAC sequence header
- 流媒体协议RTMP解析
- IP Header 解析
- 解析PHP的header()
- header函数解析
- header("Location:/")解析
- gz文件Header 解析
- RTP Header解析
- HTTP Header解析
- RTMP视频流格式解析
- RTMP流媒体播放流程解析
- 解析网页的request header
- FCGI协议的header解析
- 流媒体-RTMP交互过程及协议解析
- RTMP H5 直播流技术解析
- RTMP
- List 转JSON
- 小白学c++之网络编程
- Oracle SQL基本语法
- cas认证服务器(一)
- 阿撒大苏打撒大岁大撒旦
- RTMP header解析
- Android工具:Lint的使用
- 第十一周上机项目二(2)
- 阿撒打算打算打算的
- 频繁分配释放内存导致的性能问题的分析
- 公式显示
- 开学选神器,WiFi软件领衔主演
- ViBe算法 中文分析(转载)
- 第十一周项目6-回文&素数(三)