FLV 结构分析

FLV是由The FLV header 和 The FLV File Body 组成.
一.The FLV header
Field             Type     Comment
Signature     UI8     Signature byte always 'F' (0x46)
Signature     UI8     Signature byte always 'L' (0x4C)
Signature     UI8     Signature byte always 'V' (0x56)
Version     UI8     File version (for example, 0x01 for FLV version 1)
TypeFlagsReserved     UB [5]     Shall be 0
TypeFlagsAudio     UB [1]     1 = Audio tags are present
TypeFlagsReserved     UB [1]     Shall be 0
TypeFlagsVideo     UB [1]     1 = Video tags are present
DataOffset     UI32     The length of this header in bytes

Signature: FLV 文件的前3个字节为固定的‘F’‘L’‘V’,用来标识这个文件是flv格式的.在做格式探测的时候,如果发现前3个字节为“FLV”,就认为它是flv文件.

Version: 第4个字节表示flv版本号.

Flags: 第5个字节中的第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)

DataOffset : 最后4个字节表示FLV header 长度.

二.The FLV File Body

文件体是由很多标签组成的,其结构见下表

标签0大小  4     恒为0
标签 1
标签1大小  4
标签 2
标签2大小  4
……
标签 N-1
标签N-1大小 4
标签 N
标签N大小  4
----------------------------
说明:
  1).注意标签大小是跟在对应的标签后面的,这一点与许多媒体文件的结构是不同的。
  2).注意标签大小不包括本身所占用的4字节。
  3).标签0的大小≡0,表示没有标签0。

三.标签结构
标签包括标签头和标签数据区两部分。不同类型的标签,其头结构是相同的,只是标签数据的结构各不相同。
   标签类型  1     目前只有3类
   数据区大小 3     标签数据区的大小
   时间戳   3
   扩展时间戳 1
   流ID    3     ≡0

  1).标签类型目前只有3类:8表示音频标签,9表示视频标签,18表示脚本标签。其它值被保留。
  2).时间戳表示该标签从什么时间开始播放,这是一个UI24类型((该类型为3字节的整型数据,VB中没有对应的数据类型)的值。时间戳的单位为ms。标签1的时间戳=0,脚本标签的时间戳也=0(实际上脚本标签一般就是标签1)。
  3).扩展时间戳是当时间戳的3字节24位不够用时,该字节作为最高位(注意是最高位)将时间戳扩展为32位值。
  4).数据区大小不包括标签头的11字节,也不包括表2中的标签大小项目本身占用的4字节,标签头之后紧接着就是标签数据区。
  5).标签大小=数据区大小+标签头长度。
1.音频标签数据区的结构
音频标签数据区的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。 第1个字节中,前4位表示音频数据的格式,第5-6位的数值表示采样率,第7位表示采样精度, 第8位表示音频类型
2.视频标签数据区的结构
视频标签数据区的第1个字节包含了视频数据的参数信息,从第2个字节开始为视频流数据。 第1个字节中,前4位的数值表示帧类型(关键帧、中间帧)后4位的数值表示视频编码ID
3.脚本标签数据区的结构
    脚本标签通常又被称为元数据标签(Metadata Tag),包含一些关于FLV视频和音频的参数信息,如持续时间(duration)、视频宽度和高度等。通常脚本标签紧跟在文件头后面作为第一个标签出现,并且一般只有一个。
  一般来说,脚本标签数据区的结构就包含两个AMF包。AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用。简单来说,AMF将不同类型的数据用统一的格式来描述。
  第一个AMF包封装字符串类型数据,用来装入一个"onMetaData"标志,这个标志与Adobe的一些API调用有关,在此不详述。
  第二个AMF包封装一个数组类型,这个数组中包含了一些媒体信息:例如视频的高、宽和编码ID、帧率;音频的信息如采样率、编码ID、样本大小、是否立体声,还有整个文件的大小等等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值