RTMP协议介绍
Message
rtmp协议中的数据被称为message(消息)。一个message包含message head和message body。
Chunk
在网上传输的时候,如果一个message太大,那么它将会被分段传输。一个分段被称为chunk,chunk包含chunk head 和chunk body。
chunk的长度初始长度固定为128个字节,但是这个值可以在建立连接之后进行修改。
其中chunk的具体的格式如下:
basic header 、chunk Msg Header、 Extend TimeStamp共同组成了chunk header。
Chunk Basic Header
Basic Header长度为1~3字节,它包含:fmt,stream id。fmt决定了消息头的编码方式,该字段的长度依赖于stream id,因此basic header的长度是可变的。但是目前普通的basic header的长度一般是1字节。
一字节长度的basic header典型构成如下(其中fmt占2bit):
fmt=0,那么chunk Msg header长度是11
fmt=1,那么chunk Msg header长度是7
fmt=2,那么chunk Msg header长度是3
fmt=3,那么chunk Msg header长度是0
Chunk Msg header
Chunk Msg Header的长度可能为0,3,7,11字节。它包含了将要发送的Message的相关信息。它的长度由basic header得type字段决定。
11字节的Chunk Msg header
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 stream id:4bytes
message stream id的字节序是小端序,这个字段是为了解复用而设计的,RTMP文档上说的相当的模糊
7字节的Chunk Msg header
时间戳部分是相对时间,它的值是和上一个绝对时间之间的差值
3字节的Chunk Msg header
0字节的Chunk Msg header
这种类型的chunk从前一个chunk中得到信息,当一个单个消息拆成多个chunk时,这些chunk除了第一个以外,其他的都应该使用这种类型
Extend timeStamp
长度可能是0,4字节。它表示扩展的时间戳字段(在前面的Chunk Msg Header中还有一个叫时间戳的字段)。当时间戳字段等于0xffffff的时候,该字段才被发送,否则不发送。