AMF 格式是 Adobe 推出的一个二进制数据格式
AMF0 :http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/amf/pdf/amf0-file-format-specification.pdf
AMF3 :http://download.macromedia.com/pub/labs/amf/amf3_spec_121207.pdf
rtmp流里分析帧类型18为AMF0类型,15为AMF3类型。
rtmp流里常用的AMF0格式有:
AMF_NUMBER 0x00
AMF_BOOLEAN 0x01
AMF_STRING 0x02
AMF_NULL 0x05
AMF_LONG_STRING 0x0C
AMF_OBJECT 0x03
AMF_OBJECT_END 0x09
解析流程:
一个字节为类型 :后面字节为数据内容
例子:
01 00
01 表示后面的值为bool , 00 为值 false
各个常用类型的解析
AMF_NUMBER :一个类型字节 + 八个数据字节(大编码)
00 41 1e 9a e4 00 00 00 00
00 表示 AMF_NUMBER
41 1e 9a e4 00 00 00 00 换算为 501433
AMF_BOOLEAN : 一个类型字节 + 一个数字字节
01 01
01 表示 AMF_BOOLEAN
01 为 true
AMF_STRING :一个类型字节 + 二个字节保存长度N (大编码) + N个数据字节
02 00 04 6d 70 34 32
02 表示 AMF_STRING
00 04 表示字符串长度为4
6d 70 34 32 换算成 “mp42”
AMF_NULL : 一个类型字节
05
05 表示 AMF_NULL 后面没有数据内容
AMF_LONG_STRING :一个类型字节 + 四个字节保存长度N(大编码) + N个数据字节
类似 AMF_STRING ,只是长度由4个字节组装
AMF_OBJECT : 一个类型字节 + N个组合字节[AMF_STRING + 一个类型字节 + 类型字节内容] + 长度为0的AMF_STRING + AMF_OBJECT_END类型字节
Name: level 为一个AMF_STRING类型,不带一个字节类型标示
String `status` 为一个AMF_STRING类型,带一个字节类型标示,也可以是带一个字节类型标示的AMF_BOOLEAN或者AMF_NUMBER
代码:
yuAMF.h
typedef enum
{
AMF_NUMBER = 0, AMF_BOOLEAN, AMF_STRING, AMF_OBJECT,
AMF_MOVIECLIP, /* reserved, not used */
AMF_NULL,
AMF_UNDEFINED,
AMF_REFERENCE,
AMF_ECMA_ARRAY,
AMF_OBJECT_END,
AMF_STRICT_ARRAY, AMF_DATE, AMF_LONG_STRING, AMF_UNSUPPORTED,
AMF_RECORDSET, /* reserved, not used */
AMF_XML_DOC, AMF_TYPED_OBJECT,
AMF_AVMPLUS, /* switch to AMF3 */
AMF_INVALID = 0xff
} AMFDataType;
typedef struct AVal
{
char *av_val;
int av_len;
} AVal;
class uyAMF {
public:
uyAMF(char* data , int len);
~uyAMF();
bool