内部结构
FLV(Flash Video)是Adobe公司推出的一种媒体封装格式,适合流媒体传输。优点是封装简单,文件体积小。后缀为.flv。总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag及Tag Size对组成。
1. FLV Header
– 内部结构图
– 关键栏位
- SigNature:开头三个字节,固定为 FLV 的ascii码(0x46 0x4c 0x56)
- Version:表示FLV的版本号,比如FLV版本1,则该栏位是0x01
- FlagsAudio:1表示有audio tag,0表示没有
- FlagsVideo:1表示有video tag,0表示没有
- DataOffset:表示FLV header的大小,单位为字节。对于FLV版本1,固定是9,也就是header总共9字节,有效字节有5个。
2. FLV file body
- 由一系列tag和previousTagSize组成(如图: FLV结构图);
- Tag的大小 = 11(tag header) + n(tag body),其中previousTagSize为4字节。
- PreviousTagSize0总是0;其它PreviousTagSizeN的值表示TagN的大小,用于逆向读取处理(因为flv没有同步字节)。
FLV tag
- 由tag header 和 tag body组成,tag header固定为11字节。如下图:
1. 类型
FLV tag分为3种类型:
- Video Tag:存放视频相关数据
- Audio Tag:存放音频相关数据
- Script Tag:存放音视频元数据(metadata),一般会是第一个tag,紧跟着FLV header,有且只有一个。
2. FLV tag header
对于FLV版本1,tag header固定为11字节。
– 内部结构图
– 关键栏位
- TagType:
tag类型,1字节tag类型 含义 0x8 该tag为audio tag 0x9 该tag为video tag 0x12 该tag为script tag 其它 保留 - DataSize:
tag body的大小,3字节(不包含tag header的11字节),所以整个tag大小 = DataSize + 11。 - TimeStamp:
与第一个tag的时间戳差值,单位为毫秒,3字节。对于视频来说,就是DTS,单位为ms。
第一个audio和video tag的Timestamp分别为0,亦表示解码顺序。 - TimeStampExtended:
时间戳的扩展字段,当Timestamp栏位不够用时,会启用这字段,表示最高八位。 - StreamID:
总是0。
3. Audio Tag Body
音频tag第一个字节包含音频数据的参数信息(固定的),从第二个字节开始为音频流数据。