最近在用纯java写一个flv的播放器,涉及到flv的解析,我需要解读flv scripttag里面的数据,正常的width,height,duration,这些都可以用一些工具看到,比如flvparse。除此之外,为了实现seek,我还需要解读这里面的关键帧列表,但是这个我就找不到工具了,也不知道解读方法。后来了解到,这是amf格式的数据,于是我从GitHub上找了一个amf解析器的demo。最终用amf0格式成功解读出了关键帧列表。
然后我发现了一个问题,amf格式好像有两个,amf0和amf3,我找的代码只支持amf0,那么我应不应该支持amf3呢,amf0和amf3的区别又是什么呢。
后来经过查料
NOTE: With the introduction of AMF 3 in Flash Player 9, a special type marker was added to AMF 0 to signal a switch to AMF 3 serialization. This allows NetConnection requests to start out in AMF 0 and switch to AMF 3 on the first complex type to take advantage of the more the efficient encoding of AMF 3.
这个意思是说现在主要还是在用amf0,网络传输中,amf3是加在amf0流中的一种格式,原来amf0用0x00表示double,用0x01表示bool型,amf3出现后,amf0中的0x11就表示接下来会有一个amf3格式的数据块。
完整的对照表如下:
AMF0:
#define AMF_NUMBER 0x00 // 浮点数
#define AMF_BOOLEAN 0x01 // 布尔型
#define AMF_STRING 0x02 // 字符串
#define AMF_BEGIN_OBJECT 0x03 // 对象,开始
#define AMF_NULL 0x05 // null
#define AMF_UNDEFINED 0x06
#define AMF_REFERENCE 0x07
#define AMF_MIXED_ARRAY 0x08
#define AMF_END_OBJECT 0x09 // 对象,结束
#define AMF_BEGIN_TYPED_OBJECT 0x10
#define AMF_STRICT_ARRAY 0x0A
#define AMF_DATE 0x0B // 日期
#define AMF_LONG_STRING 0x0C // 字符串
#define AMF_UNSUPPORTED 0x0D
#define AMF_AVMPLUS_OBJECT 0x11 //AMF3
#define AMF_END 0xFF
AMF3:
#define AMF3_UNDEFINED 0x00
#define AMF3_NULL 0x01
#define AMF3_FALSE 0x02
#define AMF3_TRUE 0x03
#define AMF3_INTEGER 0x04
#define AMF3_NUMBER 0x05
#define AMF3_STRING 0x06
#define AMF3_DATE 0x08
#define AMF3_ARRAY 0x09
#define AMF3_OBJECT 0x0A
#define AMF3_BYTEARRAY 0x0C
#define AMF3_DICTIONARY 0x11
所以假如我解析的flv中没有amf3,我大可以继续用amf0去解析。