一、引言
本文对FLV格式的FLV header进行简介,FLV文件的开头就是FLV header。
进行简介之前,请各位先从《音视频入门基础:FLV专题(1)——FLV官方文档下载》下载FLV的官方文档《video_file_format_spec_v10_1.pdf》和SWF的官方文档《swf-file-format-spec.pdf》。
《video_file_format_spec_v10_1.pdf》总共有89页,《swf-file-format-spec.pdf》总共有243页。本文下面所说的“页数”是指在pdf阅读器中显示的页数:
二、FLV的Simple data types
根据《video_file_format_spec_v10_1.pdf》第74页,FLV的Simple data types(简单数据类型)定义在SWF的官方文档中。Simple data types描述了FLV格式中的每个属性占用多少空间:
所以我们得翻阅SWF的官方文档《swf-file-format-spec.pdf》,该文档第15页到第20页描述了Simple data types(简单数据类型)。
第15页:
第18页:
其中:
SI8:有符号8位整数值。
SI16:有符号16位整数值。
SI32:32位带符号整数值。
SI8[n]:带符号的8位数组。n是数组元素的个数。
SI16[n]:带符号的16位数组。n是数组元素的个数。
UI8:无符号8位整数值。
UI16:无符号16位整数值。
UI32:无符号32位整数值。
UI8[n]:无符号的8位数组。n是数组元素的个数。
UI16[n]:无符号的16位数组。n是数组元素的个数。
UI24[n]:无符号的24位数组。n是数组元素的个数。
UI32[n]:无符号的32位数组。n是数组元素的个数。
UI64[n]:无符号的64位数组。n是数组元素的个数。
SB[nBits]:有符号的位值(nBits是用来存储值的位数)。
UB[nBits]:无符号的位值(nBits是用来存储值的位数)。
FB[nBits]:带符号的定点位值(nBits是用于存储值的位数)。
三、FLV header
FLV文件 = FLV header + tag1 + tag内容1 + tag2 + tag内容2 + ...+... + tagN + tag内容N。
根据《video_file_format_spec_v10_1.pdf》第74页,一个FLV文件应该以FLV header为开始。可以看出来FLV header中的属性加起来总共占9个字节(Signature占3个字节,Version占1个字节,TypeFlagsReserved+TypeFlagsAudio+TypeFlagsReserved+TypeFlagsVideo占1个字节,DataOffset占4个字节,加起来总共9字节),所以FLV header为9字节:
Signature:FLV header的前3个字节为Signature,为文件格式标识。对于FLV格式,固定为“FLV”(0x46 0x4C 0x56)。
Version:FLV header的第4个字节为Version,为格式版本。对于FLV格式,值必须为1。
FLV header的第5个字节比较特殊:
第5个字节的前5位(8位等于1个字节)是保留位(TypeFlagsReserved),值必须是0。
第6位为音频类型标志(TypeFlagsAudio),值为1表示FLV文件中含有音频,值为0表示不含音频。
第7位也是保留位,值必须是0。
第8位为视频类型标志(TypeFlagsVideo),值为1表示FLV文件中含有视频,值为0表示不含视频。
所以如果FLV header第5个字节的值为0x04(二进制的0b00000100)表示该FLV文件中仅含有音频不含视频;第5个字节的值为0x01(二进制的0b00000001)表示该FLV文件中仅含有视频不含音频;第5个字节的值为0x05(二进制的0b00000101)表示该FLV文件中既含视频也含音频。
DataOffset:FLV header的第6到第9个字节为DataOffset。为整个FLV header的长度,单位为字节。值固定为9。
四、FLV header实例分析
用notepad++打开《音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件》中生成的FLV文件,文件的开头(下图红框中的)就是FLV header。可以看到header为:0x46 0x4C 0x56 0x01 0x05 0x00 0x00 0x00 0x09:
由于该FLV header的第5个字节的值为0x05,所以能推测出来该FLV文件中既含视频也含音频。