RTMP协议中的AMF数据

转自https://blog.****.net/yeyumin89/article/details/7932585

这里有一个连接,amf0和amf3的库,我下了看了下,还是自己写吧,哎。http://wooce.iteye.com/blog/1396278

参考crtmpserver的代码写的,其中有amf.h文件。

 

 

AMF数据第一个byte为此数据的类型,类型有:

Number 0×00 double类型
Boolean 0×01 bool类型
String 0×02 string类型
Object 0×03 object类型
MovieClip 0×04 Not available in Remoting
Null 0×05 null类型,空
Undefined 0×06  
Reference 0×07  
MixedArray 0×08  
EndOfObject 0×09 See Object ,表示object结束
Array 0x0a  
Date 0x0b  
LongString 0x0c  
Unsupported 0x0d  
Recordset 0x0e Remoting, server-to-client only
XML 0x0f  
TypedObject (Class instance) 0×10  
AMF3 data 0×11

Sent by Flash player 9+

 

对应的枚举就是:

public enum DataType{

Number = 00,// 0

Boolean = 01,// 1

String = 02,// 2

UntypedObject = 03,// 3

MovieClip = 04,// 4

Null = 05,// 5

Undefined = 06,// 6

ReferencedObject = 07,// 7

MixedArray = 08,// 8

End = 09,// 9

Array = 10,// 10

Date = 11,// 11

LongString = 12,// 12

TypeAsObject = 13,// 13

Recordset = 14,// 14

Xml = 15,// 15

TypedObject = 16,// 16

AMF3data = 17// 17

}

 

 

rtmp协议中数据都是大端的,所以在放数据前都要将数据转成大端的形式。

 

number类型其实就是double,占8bytes。比如:00 00 00 00 00 00 00 00,第一个byte为amf类型,其后8bytes为double值0.0。

RTMP协议中的AMF数据

 

 

boolean就是布尔类型,占用1byte。比如:01 00,第一个byte为amf类型,其后1byte是值,false。

 

 

string就是字符类型,一个byte的amf类型,两个bytes的字符长度,和N个bytes的数据。比如:02 00 02 33 22,第一个byte为amf类型,其后两个bytes为长度,注意这里的00 02是大端模式,33 22是字符数据。

RTMP协议中的AMF数据

 

 

null是空,只有一个byte,0x05。

 

 

object类型要复杂点,第一个byte是03表示object,其后跟的是N个(key+value)。最后以00 00 09表示object结束。

RTMP协议中的AMF数据

key是一个字符串组成:2bytes的长度,N bytes的数据,就是表示value的作用,相当于value的名字。

value可以使amf任意一种类型,包括object。格式和单独的amf type一样,如果是object的话,相当于在里面再嵌套一个object。

RTMP协议中的AMF数据

level(key)后面的status就是value,此value是string类型,所以格式是上面提到的string类型(0x02)。

 

 

ECMA_ARRAY(0x08)实际上和object差不多,只是在0x08类型后面多了4个bytes的记录总共多少items的东西,目测全部填00也可以,也是以00 00 09结束。

 

 

0x11类型是amf3的类型,amf3实际上外层是封了一层amf0,为了与amf0兼容,我没有用,没有研究过。