转自:http://wenku.baidu.com/view/8246086e1eb91a37f1115c03.html
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 Body
FLV body就是由很多tag组成的。
FLV文件里面帧的实体就是tag了,每个tag都可以分为两部分,
第一部分包含是tag 类型信息,长度固定为15字节,分别是:
Previoustagsize(4bytes):前一个tag的长度,第一个tag就是0。00 00 00 00
tag类型(1byte)三类:8——音频tag;9——视频tag; 18——脚本tag, 12
数据区长度(3bytes):00 00 F6
时间戳(3bytes):单位毫秒,如果是脚本tag就是0,00 00 00
扩展时间戳(1byte):作为时间戳的高位,00
streamsID(3bytes):总是0(不知道干啥用):00 00 00
第二部分为tag data
Data Object类型标志(1Byte): 02
object name的长度(2Byte): 000A
Object name(10 Bytes) 6F 6E 4D 65 74 61 44 61 74 61(onMetaData)
第二个amf. data array的类型标志(1Byte): 08
数组的长度(4Bytes):0000000E
object name的长度(2Bytes) 000D
object name(0D Bytes)61 75 64 69 6F 64 61 74 61 72 61 74 65 (audiodatarate)
double类型数据标志(1Byte):00
double类型的数据值(8Bytes)40 4C 35 4D DA 20 43 55
object name的长度(2Bytes) 0009
object name(0D Bytes)66 72 61 6D 65 72 61 74 65 (framerate)
double类型数据标志(1Byte):00
double类型的数据值(8Bytes)40 39 00 00 00 00 00 00
If Type = 8,数据变量[ECMAArrayLength] 变量的结束标志是000009
tag data,也就是flv的数据(有音频,视频,脚本等三类数据),根据不同的tag类型就有不同的数据区,数据区的长度由第一部分的数据区长度字段定义
接下来就是下一个tag的内容,其开始的四个字节定义了上个tag的总长度,注意上个tag的总长度中不包括上个tag之前的4个描述再上一个tag的长度的4个字节。
FLV Tail(略)