您的位置:首页 > 其它

rtmp协议数据包分析(2)

2017-06-27 00:13 344 查看
  此前已经分析过报头,接下类分析数据部分。
Rtmp包默认的最大长度为128字节,(或通过chunksize改变rtmp包最大长度), 当AMF数据超过128Byte的时候就可能有多个rtmp包组成,如果需要解码的rtmp包太长则被TCP协议分割成多个TCP包.那么解码的时候需要先将包含rtmp包的tcp封包合并, 再把合并的数据解码,解码后可得到amf格式的数据,将这些AMF数据取出来就可以对AMF数据解码了.
RTMP封包包括包头和AMF数据2部分,AMF数据里面可以是命令也可以是音视频数据。组成服务器和Flash客户端之间的所有数据都是用AMF格式的数据在传送,例如connect() publish()等命令. AMF数据由2部分组成: ObjType 加上 ObjValue。ObjType的大小为一个字节。ObjValue的大小不固定,和ObjType相关。
常用的ObjType类型和对应的ObjValue大小整理如下,详细的ObjType的数据在本文的最下面列出:
类型说明(ObjType)       数据  dataSize
CORE_String 0x02   2字节 (2字节的数据纪录了String的实际长度)
CORE_Object  0x03  0字节(开始嵌套0x00000009表示嵌套结束)
NULL    0x05 0字节 空字节无意义
CORE_NUMBER  0x00   8字节
CORE_Map  0x08      4字节(开始嵌套)
CORE_BOOLEAN  0x01     1字节
ObjValue不一定是一个固定的大小,他可以包含另外一个AMF数据,这另外一个AMF数据里面又有ObjType 加上 ObjValue,也就是AMF数据的嵌套关系
  AMF0数据的嵌套关系如下:
Object={ObjType + ObjValue}

CORE_BOOLEAN={Value(1 Byte)}

CORE_NUMBER={Value(8 Byte)}

CORE_String={StringLen(2 Byte) + StringValue(StringLen Byte)}

CORE_DATE={value(10 Byte)}

CORE_Array={ArrayLen(4 Byte) + Object}

CORE_Map={MapNum(4 Byte) + CORE_Object}

CORE_Object={CORE_String + Object}

看起来有些复杂,所以我这里图文并茂来详解,例如完成握手后,Flash向FMS发送的第一个RTMP数据,内容如下:



蓝色的表示包头,红色的表示ObjType,绿色的表示数据。上面一段数据由2个RTMP包组成,2个RTMP包头分别用蓝色表示,第一个蓝色的是12字节的包头,后面一个蓝色的C3是一个字节的包头,绿色部分是数据,红色的是AMF数据类型,整个RTMP解码过程如下

[2008-06-18 16:59:20] DecodeInvoke:

[2008-06-18 16:59:20] InvokeName:String:connect

[2008-06-18 16:59:20] InvokeID:Double:0

[2008-06-18 16:59:20] Map:MapNum:0

[2008-06-18 16:59:20] Params:{

[2008-06-18 16:59:20] Key:String:objectEncoding

[2008-06-18 16:59:20] Value:Double:0

[2008-06-18 16:59:20] Key:String:app

[2008-06-18 16:59:20] Value:String:mediaserver

[2008-06-18 16:59:20] Key:String:fpda

[2008-06-18 16:59:20] Value:Bool:0

[2008-06-18 16:59:20] Key:String:tcUrl

[2008-06-18 16:59:20] Value:String:rtmp://127.0.0.1/mediaserver

[2008-06-18 16:59:20] Key:String:audioCodecs

[2008-06-18 16:59:20] Value:Double:615

[2008-06-18 16:59:20] Key:String:videoCodecs

[2008-06-18 16:59:20] Value:Double:76

[2008-06-18 16:59:20] }End Params

[2008-06-18 16:59:20] InvokeParams:String:PUBLISHER

[2008-06-18 16:59:20] InvokeParams:String:streamRecode

FMS3中为了实现H.264数据的直播而增加了一个数据类型,这个类型的值为0x16,这个类型不在下表中,如果需要请参看http://www.cnweblog.com/fly2700/archive/2009/02/06/297957.html

详细的ObjType数据类型如下:,参考Red5

enum AMF

{

    /**

     * Boolean value marker constant

     */

    TYPE_BOOLEAN = 0x01,
    /**

     * String marker constant

     */

 TYPE_STRING = 0x02,
    /**

     * Object marker constant

     */

    TYPE_OBJECT = 0x03,
    /**

     * Movieclip marker constant

     */

    TYPE_MOVIECLIP = 0x04 ,
    /**

     * Null marker constant

     */

 TYPE_NULL = 0x05,
    /**

     * Undefined marker constant

     */

 TYPE_UNDEFINED = 0x06,
    /**

     * Object reference marker constant

     */

 TYPE_REFERENCE = 0x07,
    /**

     * Mixed array marker constant

     */

 TYPE_MIXED_ARRAY = 0x08,
    /**

     * End of object marker constant

     */

 TYPE_END_OF_OBJECT = 0x09,
    /**

     * Array marker constant

     */

 TYPE_ARRAY = 0x0A,
    /**

     * Date marker constant

     */

 TYPE_DATE = 0x0B,
    /**

     * Long string marker constant

     */

 TYPE_LONG_STRING = 0x0C,
    /**

     * Unsupported type marker constant

     */

 TYPE_UNSUPPORTED = 0x0D,
    /**

     * Recordset marker constant

     */

 TYPE_RECORDSET = 0x0E,
    /**

     * XML marker constant

     */

 TYPE_XML = 0x0F,
    /**

     * Class marker constant

     */

 TYPE_CLASS_OBJECT = 0x10,
    /**

     * Object marker constant (for AMF3)

     */

 TYPE_AMF3_OBJECT = 0x11,
    /**

     * true marker constant

     */

 VALUE_TRUE = 0x01,

    /**

     * false marker constant

     */

 VALUE_FALSE = 0x00

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: