flv文件格式二

flv文件主要由两部分组成:header和body。

1.header

header部分记录了flv的类型、版本等信息,是flv的开头,一般都差不多,占9bytes。具体格式如下:

文件类型3 bytes“FLV”
版本1 byte一般为0×01
流信息1 byte倒数第一位是1表示有视频,倒数第三位是1表示有音频,倒数第二、四位必须为0
header长度4 bytes整个header的长度,一般为9;大于9表示下面还有扩展信息

2.body

body部分由一个个Tag组成,每个Tag的下面有一块4bytes的空间,用来记录这个tag的长度,这个后置用于逆向读取处理,他们的关系如下图:

2.1.Tag

每个Tag由也是由两部分组成的:Tag Header和Tag Data。Tag Header里存放的是当前Tag的类型、数据区(Tag Data)长度等信息,具体如下:

名称长度介绍
Tag类型1 bytes8:音频
9:视频
18:脚本
其他:保留
数据区长度3 bytes在数据区的长度
时间戳3 bytes整数,单位是毫秒。对于脚本型的tag总是0
时间戳扩展1 bytes将时间戳扩展为4bytes,代表高8位。很少用到
StreamsID3 bytes总是0
数据区(data)由数据区长度决定数据实体

2.2.Tag Data

数据区根据Tag类型的不同可分为三种,音频数据、视频数据和脚本数据。

2.2.1.音频数据

第一个byte是音频的信息,格式如下。

名称长度介绍
音频格式4 bits0 = Linear PCM, platform endian
1 = ADPCM
2 = MP3
3 = Linear PCM, little endian
4 = Nellymoser 16-kHz mono
5 = Nellymoser 8-kHz mono
6 = Nellymoser
7 = G.711 A-law logarithmic PCM
8 = G.711 mu-law logarithmic PCM
9 = reserved
10 = AAC
11 = Speex
14 = MP3 8-Khz
15 = Device-specific sound
采样率2 bits0 = 5.5-kHz
1 = 11-kHz
2 = 22-kHz
3 = 44-kHz
对于AAC总是3
采样的长度1 bit0 = snd8Bit
1 = snd16Bit
压缩过的音频都是16bit
音频类型1 bit0 = sndMono
1 = sndStereo
对于AAC总是1

第2byte开始就是音频流数据了。

2.2.2.视频数据

和音频数据一样,第一个byte是视频信息,格式如下:

名称长度介绍
帧类型4 bits1: keyframe (for AVC, a seekable frame)
2: inter frame (for AVC, a non-seekable frame)
3: disposable inter frame (H.263 only)
4: generated keyframe (reserved for server use only)
5: video info/command frame
编码ID4 bits1: JPEG (currently unused)
2: Sorenson H.263
3: Screen video
4: On2 VP6
5: On2 VP6 with alpha channel
6: Screen video version 2
7: AVC
2.2.3脚本数据

脚本Tag一般只有一个,是flv的第一个Tag,用于存放flv的信息,比如duration、audiodatarate、creator、width等。

首先介绍下脚本的数据类型。所有数据都是以数据类型+(数据长度)+数据的格式出现的,数据类型占1byte,数据长度看数据类型是否存在,后面才是数据。
其中数据类型的种类有:

  • 0 = Number type
  • 1 = Boolean type
  • 2 = String type
  • 3 = Object type
  • 4 = MovieClip type
  • 5 = Null type
  • 6 = Undefined type
  • 7 = Reference type
  • 8 = ECMA array type
  • 10 = Strict array type
  • 11 = Date type
  • 12 = Long string type

如果类型为String,后面的2bytes为字符串的长度(Long String是4bytes),再后面才是字符串数据;如果是Number类型,后面的8bytes为Double类型的数据;Boolean类型,后面1byte为Bool类型。

知道了这些后再来看看flv中的脚本,一般开头是0×02,表示String类型,后面的2bytes为字符串长度,一般是0x000a(“onMetaData”的长度),再后面就是字符串“onMetaData”。好像flv格式的文件都有onMetaData标记,在运行ActionScript的时候会用到它。后面跟的是0×08,表示ECMA Array类型,这个和Map比较相似,一个键跟着一个值。键都是String类型的,所以开头的0×02被省略了,直接跟着的是字符串的长度,然后是字符串,再是值的类型,也就是上面介绍的那些了。

该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的参数信息,如duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。

一般来说,该Tag Data结构包含两个AMF包。AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。具体说明如下,大家可以参照图片上的数据进行理解。 第一个AMF包:

第1个字节表示AMF包类型,一般总是0x02,表示字符串,其他值表示意义请查阅文档。 第2-3个字节为UI16类型值,表示字符串的长度,一般总是0x000A(“onMetaData”长度)。 后面字节为字符串数据,一般总为“onMetaData”。 第二个AMF包:

第1个字节表示AMF包类型,一般总是0x08,表示数组。 第2-5个字节为UI32类型值,表示数组元素的个数。

后面即为各数组元素的封装,数组元素为元素名称和值组成的对。表示方法如下: 第1-2个字节表示元素名称的长度,假设为L。 后面跟着为长度为L的字符串。 第L+3个字节表示元素值的类型。

后面跟着为对应值,占用字节数取决于值的类型。

FLV研究 - mu_huilin - 坐看云起
这是一个flv data tag的具体内容,下面是针对其结构数据的分析:
0x12  data tag的类型标志.
000152  data tag的长度
000000  时间戳
00  时间戳扩展
000000  流id
0x02  data object的类型标志
000A  object name的长度
6F6E4D65746144617461  object name(onMetaData)
08  第二个amf. data array的类型标志
0000000E 数组的长度
000D  object name的长度
617564696F6461746172617465 object name(audiodatarate)
00  double类型数据标志(?)
404C354DDA204355 double类型的数据值(?)
...
...
0005 object name的长度
7769647468 object name(width flv视频的宽度)
00  double类型数据标志
4086800000000000 double类型的数据值
000009   data tag的结束标志.
0000015D data tag的tag size


3.总结

flv的格式还是比较简单的,header部分很简洁,body部分都是由一个个tag,tag的话也就三种,脚本tag一般只有一个的,我想这也是flv能成为在线视频格式的原因吧。只要了解了格式,我们就可以写个程序来解析flv文件了,这也是我下一步要做的。

转自:http://wuyuans.com/2012/08/flv-format/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值