当前位置:文档之家› FLV封装格式

FLV封装格式

FLV封装格式
FLV简介 (1)
总体及File Header结构 (1)
Tag结构 (2)
音频TagData结构 (2)
视频TagData结构 (3)
Script TagData结构 (4)
总结 (5)
FLV简介
FLV全称是Flash Video,是互联网上使用极为广泛的视频封装格式。

像爱奇艺,优酷等这类视频网站,都使用FLV封装视频。

本文主要介绍FLV文件的组成结构。

虽然网络上现成的介绍FLV 的帖子成百上千,但我还是觉得有必要自己也写一篇。

一来自己写一遍可加强理解,二来网络上的帖子可能并不适合自己理解。

最重要的是自己写的可随时修改,当发现内容有误或有新的理解时,可同步更新。

特别强调,FLV文件结构中数值字段的字节序为大端。

总体及File Header结构
FLV由文件头(Flv Header)和文件体(Flv Body)组成。

文件体又由一系列的Previous Tag Size& Tag对组成。

见图1。

PreviousTag 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等常见元素,但并不确认适用于所有元素。

常见的数组元素如下表所示。

总结
网络上有许多优秀的FLV分析工具,flvparse就是其中一个。

使用flvparse工具实际操作分析几个flv文件,验证本文所写是否有误,同时也能加强对FLV文件格式的理解。

相关主题