文件头由9bytes组成前3个bytes是文件类型,总是“FLV”,也就是(0x460x4C0x56)。第4btye是版本号,目前一般是0x01。第5byte是流的信息,倒数第一bit是1表示有视频(0x01),倒数第三bit是1表示有音频(0x4),有视频又有音频就是0x01|0x04(0x05),其他都应该是0。最后4bytes表示FLV头的长度,3+1+1+4=9。FLVheader后面就是FLVbody,FLVbody由若干个tag组成。每一个tag第一部分是tagheader,tagheader长度为11bytes,但是每个tagheader前面有4bytes记录着上一个tag的长度,此待会儿再说。tagheader的第1个byte为记录着tag的类型,音频(0x8),视频(0x9),脚本(0x12);第2到4bytes是数据区的长度,也就是tagdata的长度;再后面3个bytes是时间戳,单位是毫秒,类型为0x12则时间戳为0,时间戳控制着文件播放的速度,可以根据音视频的帧率类设置;时间戳后面一个byte是扩展时间戳,时间戳不够长的时候用;最后3bytes是streamID,但是总为0,再后面就是数据区了(tagdata),也即是h264的裸流,tagheader长度为1+3+3+1+3=11。0x12前面的00000000就是刚刚说的记录着上一个tag的长度的4bytes,这里因为前面没有tag,所以为0。tagdata如果是音频数据,第一个byte记录audio信息:前4bits表示音频格式(全部格式请看官方文档):·0--未压缩·1--ADPCM·2--MP3·4--Nellymoser16-kHzmono·5--Nellymoser8-kHzmono·10--AAC下面两个bits表示samplerate:·0--·1--11kHz·2--22kHz·3--44kHz下面1bit表示采样长度:·0--snd8Bit·1--snd16Bit下面1bit表示类型:·0--sndMomo·1--sndStereo之后是数据。如果是视频数据,第一个byte记录video信息:前4bits表示类型:·1--keyframe·2--innerframe·3--disposableinnerframe()·4--generatedkeyframe后4bits表示解码器ID:·2--·3--screenvideo·4--On2VP6·5--On2VP6withalphachannel·6--Screenvideoversion2·7--AVC()之后是数据。如果是AAC和AVC的音视频,则在放入数据前有一个音频和视频的配置信息需要写入前两个tag,等会再说。之前说每个tag前面会有一个记录上个tag长度的4个bytes(previoustagsize),整个的flv文件其实是:FLVheader+previoustagsize0+tag1+previoustagsize1+tag2+previoustagsize2+...+tagN+previoustagsizeN。第一个previoustagsize因为前面没有tag,所以为0,其他的总是记录着前面一个tag长度(tagdatasize+tagheadersize)。如果tagdata是脚本数据,ScriptTagData,该类型Tag又通常被称为Metadata(元数据)Tag,会放一些关于FLV视频和音频的参数信息,如duration、width、height等。通常该类型Tag会跟在FileHeader后面作为第一个Tag出现,而且只有一个。一般来说,该TagData结构包含两个AMF包。AMF(ActionMessageFormat)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。具体说明如下,大家可以参照图片上的数据进行理解。第一个AMF包:第1个字节表示AMF包类型,一般总是0x02,表示字符串,其他值表示意义请查阅文档。第2-3个字节为UI16类型值,表示字符串的长度,一般总是0x000A(“onMetaData”长度)。后面字节为字符串数据,一般总为“onMetaData”。第二个AMF包:第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后面即为各数组元素的封
FLV二进制文件格式 来自淘豆网m.daumloan.com转载请标明出处.