FLV封装格式学习

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等常见元素,但并不确认适用于所有元素。常见的数组元素如下表所示。



六、总结

网络上有许多优秀的FLV分析工具,flvparse就是其中一个。使用flvparse工具实际操作分析几个flv文件,验证本文所写是否有误,同时也能加强对FLV文件格式的理解。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值