上一篇文章我们就FLV文件格式做了一个分析,这篇文章,我们结合实际的FLV文件对照着FLV的结构来一一分析一遍。
我们用UltraEdit打开一个FLV文件,我们看到的内容大概是这样的:
其中选中的9个字节就是FLV header 我们通过最右边的字符表述可以很清楚的知道。
头三个字节 0x46 0x4C 0x56 正好是FLV三个字母的ASCII码的值。
接下来的一个字节 0x01 就是Version字段。对于FLV版本是1
第五个字节0x05 用二进制表达就是 ‘0101’b。也就是
TypeFlagsAudio = 1
TypeFlagsVideo= 1
表明这个文件包含音频流和视频流。
第六个字节但第九个字节为 0x00000009 大端模式,所以值就是9。与协议一致。就是FLV header结构的字节长度。
接下来的就是FLV File Body了,第一个四字节是PreviousTagSize0。我们看到是 0x00000000。因为在这个字段之前是没有TAG的,所以固定为0。
好了,现在FLV Header + PreviousTagSize0 = 13 Bytes。也就是从第十四个字节开始就会是我们的第一个FLV TAG了。
我们先来一张FLV TAG的结构图
我先取到前面十一个字节的内容
第一个字节的内容是0x12 我们转换为二进制就是 ‘0001 0010’。 看得到,前三个位是0。意味着Filter ==0;
也就是TagType == 0x12 表示成10进制就是 18 (script data)。就是说这是一个脚本Tag。
后面三个字节对应DataSize == 0x0002A9 。我们把它转换为十进制数是 681。注意DataSize的定义。是StreamID之后的数据长度。所以整个TAG的长度应该是681 + 11 = 692。从地址 0x0000000D 到 0x000002C0
图片中被选中的内容就是这个ScriptTAG的内容。
因为TagType == 18所以Data字段的内容就是 SCRIPTDATA
第一个域是Name。Name又是SCRIPTDATAVALUE类型
第一个字节Type。
Type == 0x02, String 类型
ScriptDataValue 是SCRIPTDATASTRING类型。
然后再接下来的两个字节是后面的String的长度。 StringLength == 0x000A , 10个字节。
StringData的内容是 0x6F 0x6E 0x4D 0x65 0x74 0x61 0x44 0x61 0x74 0x61 也就是 “onMetaData”。
再接下来一个字节又是Type。Type ==0x08 对应的数据类型是 SCRIPTDATAECMAARRAY