
FLV文件格式分析.doc
6页FLV是一个二进制文件,由文件头(FLV header)和很多tag组成tag又可以分成三类:audio,video,script,分别代表音频流,视频流,脚本流(关键字或者文件信息之类)FLV Header一般比较简单,包括文件类型之类的全局信息,如图:文件类型3bytes总是FLV(0x46 0x4C 0x56),否则...版本1byte一般是0x01,表示FLV version 1流信息1byte倒数第一bit是1表示有视频,倒数第三bit是1表示有音频,其他都应该是0(有些软件如flvtool2可能造成倒数第四bit是1,不过也没发现有什么不对)header长度4bytes整个文件头的长度,一般是9(3+1+1+4),有时候后面还有些别的信息,就不是9了FLV BodyFLV body就是由很多tag组成的FLV文件里面帧的实体就是tag了每个tag都可以分为两部分,第一部分包含是tag 类型信息,长度固定为15字节,如图:第二部分为tag data,也就是flv的数据(有音频,视频,脚本等三类数据),根据不同的tag类型就有不同的数据区,数据区的长度由第一部分的数据区长度字段定义,如图:previoustagsize4bytes前一个tag的长度,第一个tag就是0tag类型1byte三类:8 -- 音频tag 9 -- 视频tag 18 -- 脚本tag 数据区长度3bytes时间戳3bytes单位毫秒,如果是脚本tag就是0扩展时间戳1byte作为时间戳的高位streamsID3bytes总是0(不知道干啥用)数据区接下来就是下一个tag的内容,其开始的四个字节定义了上个tag的总长度,注意上个tag的总长度中不包括上个tag之前的4个描述再上一个tag的长度的4个字节,如图:接下来说一下文件尾,在文件尾的最后有四个字节是定义最后一个tag的长度的,如图:这里我门可以算一下,是00 00 00 DD是221,最后一个tag的长度是221,如图:下面是不同类型的tag数据区的内容体Audio tag 数据区audio信息1byte前四位bits表示音频格式:0 -- 未压缩 1 -- ADPCM 2 -- MP3 5 -- Nellymoser 8kHz momo 6 -- Nellymoser 下面两位bits表示samplerate:0 -- 5.5kHz 1 -- 11kHz 2 -- 22kHz 3 -- 44kHz 下面一位bit表示每个采样的长度:0 -- snd8Bit 1 -- snd16Bit 下面一位bit表示类型:0 -- sndMomo 1 -- sndStereo audio数据区不定video tag 数据区video信息1byte前四位bits表示类型:1 -- keyframe 2 -- inner frame 3 -- disposable inner frame (H.263 only) 后四位bits表示编码器id:2 -- Seronson H.263 3 -- Screen video 4 -- On2 VP6 5 -- On2 VP6 without channel 6 -- Screen video version 2 video数据区不定script tag 数据区Tag Data结构包含两个AMF包。
AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值第一个AMF包: AMF包类型1byte0x02字符串长度2byte0x000A字符串值-onMetaData 第1个字节表示AMF包类型,一般总是0x02,表示字符串,其他值表示意义请查阅文档 第2-3个字节为UI16类型值,表示字符串的长度,一般总是0x000A(“onMetaData”长度) 后面字节为字符串数据,一般总为“onMetaData” 第二个AMF包: AMF包类型1byte0x08数组元素个数4byte属性1属性2…SCRIPTDATAOBJECTEND3byte0x 00 00 09每个属性:属性名数据长度2byte属性名数据属性值类型1byte0 : double 1:Boolean属性值的数据长度有属性值决定double为8第1个字节表示AMF包类型,一般总是0x08,表示数组。
第2-5个字节为UI32类型值,表示数组元素的个数 后面即为各数组元素的封装,数组元素为元素名称和值组成的对表示方法如下: 第1-2个字节表示元素名称的长度,假设为L 后面跟着为长度为L的字符串 第L+3个字节表示元素值的类型 后面跟着为对应值,占用字节数取决于值的类型#include "stdio.h" int main() { union DOUBLE { double number; __int64 data; }; DOUBLE num; num.data = 0x4060A8F5C28F5C29; printf("%lf\n",num.number); getchar(); return 0; }。
