RTMP学习笔记(四)AMF0数据类型说明

244 阅读3分钟

欢迎关注公众号:冒泡的肥皂

image.png

1、简介

AMF(Action Message Format),即操作消息格式,是一种序列化二进制的数据格式。主要用于数据交互和远程过程调用。

2.数据格式

2.1AMF0数据类型
// AMF0数据类型;
    AMF_NUMBER = 0x00,             // 数字(double);
    AMF_BOOLEAN = 0x01,            // 布尔;
    AMF_STRING = 0x02,             // 字符串;
    AMF_OBJECT = 0x03,             // 对象;
    AMF_MOVIECLIP = 0x04,          // 保留,未使用;
    AMF_NULL = 0x05,               // null;
    AMF_UNDEFINED = 0x06,          // 未定义;
    AMF_REFERENCE = 0x07,          // 引用;
    AMF_ECMA_ARRAY = 0x08,         // 数组;
    AMF_OBJECT_END = 0x09,         // 对象结束;
    AMF_STRICT_ARRAY = 0x0a,       // 严格的数组;
    AMF_DATE = 0x0b,               // 日期;
    AMF_LONG_STRING = 0x0c,        // 长字符串;
    AMF_UNSUPPORTED = 0x0d,        // 未支持;
    AMF_RECORDSET = 0x0e,          // 保留,未使用;
    AMF_XML_DOC = 0x0f,            // xml文档;
    AMF_TYPED_OBJECT = 0x10,       // 有类型的对象;
    AMF_AVMPLUS = 0x11,            // 需要扩展到AMF3;
    AMF_INVALID = 0xff             // 无效的;
2.2AMF3数据类型
    AMF3_UNDEFINED = 0x00,         // 未定义;
    AMF3_NULL = 0x01,              // null;
    AMF3_FALSE = 0x02,             // false;
    AMF3_TRUE = 0x03,              // true;
    AMF3_INTEGER = 0x04,           // 数字int;
    AMF3_DOUBLE = 0x05,            // double;
    AMF3_STRING = 0x06,            // 字符串;
    AMF3_XML_DOC = 0x07,           // xml文档;
    AMF3_DATE = 0x08,              // 日期;
    AMF3_ARRAY = 0x09,             // 数组;
    AMF3_OBJECT = 0x0a,            // 对象;
    AMF3_XML = 0x0b,               // xml;
    AMF3_BYTE_ARRAY = 0x0c         // 字节数组;
    AMF3_DICTIONARY = 0x11

3.AMF0数据解析 错误后续会补充更新

AMF定义中,首先使用一个字节来表示数据类型,可选的核心数据类型如上表。 在数据类型后面紧跟着的就是对应类型数据的长度,每一种类型长度字段所占用的字节数可能也不尽相同。有些没有长度类型的数据类型规定有默认长度。

3.1 Number=0x00
这里指的是double类型,数据用8字节表示
比如十六进制00 40 10 00 00 00 00 00 00
00 类型 后面的是大小端的原因 实际为 10 40
3.2 BOOLEAN = 0x01
Boolean 数据使用1字节表示,使用00表示false,使用01表示true。比如十六进制01 01就表示true
3.3 STRING = 0x02
String所占用的空间有1个类型标识字节和2个表示字符串UTF8长度的字节加上字符串UTF8格式的内容组成。
比如十六进制03 00 08 73 68 61 6E 67 67 75 61表示的就是字符串,
         该字符串长8字节,
         字符串内容为73 68 61 6E 67 67 75 61,对应的就是“shanggua”。
3.4 OBJECT = 0x03
ObjectMap<String, Object>,内容由UTF8字符串作为Key,其他AMF类型作为Value,
该对象由3个字节:00 00 09来表示结束
3.5 MOVIECLIP = 0x04 未使用
3.6 MOVIECLIP = 0x05 NULL 占一个字节
3.7 MOVIECLIP = 0x06 未定义 占一个字节
3.8 REFERENCE = 0x07 不知道
3.9 ECMA_ARRAY = 0x08
同3 定义了大小 4字节大小(可能有错
3.10 END = 0x09
3.11 ARRAY = 0x0a
首先使用32位整数定义了ArralyList的长度,然后是密集的跟着ArrayList中的对象
3.12 DATE = 0x0b
Date在类型标识符0x0B后使用double来表示从1970/1/1到表示的时间所经过的毫秒数,然后再跟一个ushort16位无符号整数表示时
3.13 STRING = 0x0c
不过和2对应的String不同的是这里使用32位整数来表示字符串的UTF8长度,而String使用的是16位。
3.14 UNSUPPORTED = 0x0d
如果一个类型不能被序列化或者不支持可以用这个标记
3.15 RECORDSET = 0x0e
不支持,将来可能用 没有将来了
3.16 XML_DOC = 0x0f
XML是使用类型标识符0x0F后直接跟LongString类型的字符串表示
3.17 TYPED_OBJECT = 0x10
如果强类型对象为其类注册了别名,则类型名称也将序列化。类型化对象被视为复杂类型,可以通过引用发送重复实例
3.18 AVMPLUS = 0x11 扩展未AMF3
3.19 INVALID = 0xff 无效

AMF0说明文档