FLV全称是Flash Video,是互联网上使用极为广泛的视频封装格式。像爱奇艺,优酷等这类视频网站,都使用FLV封装视频。本文主要介绍FLV文件的组成结构。虽然网络上现成的介绍FLV的帖子成百上千,但我还是觉得有必要自己也写一篇。一来自己写一遍可加强理解,二来网络上的帖子可能并不适合自己理解。最重要的是自己写的可随时修改,当发现内容有误或有新的理解时,可同步更新。特别强调,FLV文件结构中数值字段的字节序为大端。
一、总体结构及File Header结构
FLV由文件头(Flv Header)和文件体(Flv Body)组成。文件体又由一系列的Previous Tag Size & Tag对组成。见图1。Previous Tag Size表示前一Tag的数据大小。第1个Previous Tag Size值为0,第2个Previous Tag Size值为Tag#1的数据大小,第3个Previous Tag Size值为Tag#2的数据大小,依此类推。
File Header结构如下图1.1所示:
Signatrue:文件标识,总为“FLV”。
Version:版本号,目前为1。
Flags:最高5位保留,第1位表示是否存在视频,第2位保留必须为0,第3位表示是否存在音频。例如:文件中同时有音视频,则Flags值为00000101b,即Flags值为5。
HeaderSize:file header所占空间大小,版本1中总为9。
二、Tag结构
Tag由Tag Header及Tag Data组成。见图2。
Type:Tag的类型。包括0x8(音频)、0x9(视频)、0x12(script data),其它值保留。
DataSize:表示Tag Data段数据的大小。
Timestamp:表示Tag的时间戳。
Timestamp_ex:时间戳扩展字节,当Timestamp的3字节数值不够时使用。做为最高位字节。
StreamID:表示stream id,总是0。
三、音频TagData结构
Tag有3种类型,包括0x8(音频)、0x9(视频)、0x12(script data)。每种类型的TagData结构都不同。下图3为音频TagData结构。
音频参数中各字段的值及其意义如下表所示:
四、视频TagData结构
下图4为视频TagData结构。
视频参数中各字段的值及其意义如下表所示:
五、Script TagData结构
Script Tag通常被称为Metadata Tag,会放一些关于FLV视频和音频的元数据信息如:duration、width、height等。通常此类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。下图5为Script TagData结构。
第一个AMF包:
第1个字节表示AMF包类型,一般总是0x02,表示字符串。第2-3个字节为UI16类型值,标识字符串的长度,一般总是0x000A(“onMetaData”长度)。后面字节为具体的字符串,一般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。所以第一个AMF包总共占13字节。
第二个AMF包:
第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数,后面即为各数组元素的封装。数组元素为元素名称和值组成的对。上图5.1中“数组元素结构”部分是推测,已经确认适用于duration、width、height等常见元素,但并不确认适用于所有元素。常见的数组元素如下表所示。