目录
- 概述
- flv文件主体结构
- Tag介绍
- 开源的解析软件
- 参考阅读
参考
- [1] FLV and F4V File Format Specification (Version 10.1)
- [2] 叶余/FLV 封装格式解析
- [3] FFmpeg/FFmpeg/blob/master/libavformat/flvdec.c
1. 概述
flv(Flash Video)是Adobe设计的一个免费开放的音视频格式。
2. flv文件主体结构
flv包括Header和Body两部分:
- Header:flv的类型、版本等信息。
- Body: 数据区域。细分成很多的Tag。
使用的是Big-endian字节序。
2.1 Header信息
Header总共由9个字节组成,构成如下:
----------------------------------------------
字节序 | 46 | 4c | 56 | 01 | 05 | 00 | 00 | 00 | 09 |
----------------------------------------------
字符序 F L V 1 / \ 9
---------------------------------
bit序 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
---------------------------------
1/0 1/0
音频位 视频位
Header的9字节意义如下:
- 第1-3字节:signature, 文件类型。FLV的文件标志为固定的“FLV"。
- 第4字节:version,版本。固定为0x01。
- 第5字节:flags,此字节当前用到的只有第6,8两个bit位,分别标志当前文件是否存在音频,视频。参见上面bit序,即是第5字节的内容。
- 第6-9字节:header size,整个header的长度,此4字节共同组成一个无符号32位整数,当前版本固定为9。
2.2 BODY
Body是由Tag Size(4字节)和Tag组成,其结构如下:
-------------------------
| Previous Tag Size |
-------------------------
| Tag |
-------------------------
| Previous Tag Size |
-------------------------
| Tag |
-------------------------
| Previous Tag Size |
-------------------------
| Tag |
-------------------------
| Previous Tag Size |
-------------------------
Previous Tag Size:前一个Tag的大小,无符号32位整型。第一个Previous Tag Size是紧接着Header的,因此,其值也是固定为0。
3. Tag介绍
Tag分为Tag Header和Tag Data两部分。
Tag Data不止一种,当前版本共有3种类型组成:
- 音频(audio)
- 视频(video)
- 脚本数据(script data):关于FLV视频和音频的一些参数信息(亦称为Metadata Tag),通常该Tag会在Header后面作为第一个Tag出现,并且一个文件仅有一个Script Data Tag。
结构如下:
-------------------------
| Tag Header |
-------------------------
| Tag Data |
-------------------------
-------------------------
| Tag Header |
-------------------------
/ \
--------------------------------------------------------
| 08 | 00 | 00 | 18 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
--------------------------------------------------------
3.1 Tag Header
由11个字节组成:
- 第1字节:type,Tag的类型。音频(0x08),视频(0x09),Script Data(0x12),除此之外,其他值非法。
- 第2-4字节:tag data size。一个无符号24位整型数值(UI24),表示当前Tag Data的大小。
- 第5-7字节:Timestamp。UI24,当前Tag的时间戳(单位为ms),第一个Tag的时间戳总为0;
- 第8字节:Timestamp_ex,时间戳的扩展字节,当前24位不够用时,该字节作为最高位,将时间戳扩展为32位无符号整数。
- 第9-11字节:stream id。UI24类型,表示Stream ID,总是0。
3.2 Audio Tag Data
Audio Tag Data开始的第1个字节包含了音频数据的参数信息,第2个字节开始为音频流数据:
第1字节:
- UB[4],前4位标识音频数据的格式,如:0x2表示的是MP3数据,字典表见表1。
- UB[2],第5,6位bit表示采样率,见表2。
- UB[1],采样精度, 0为8bits, 1为16bits。
- UB[1],音频类型,mono=0, stereo=1
表1.音频编码类型
值 | 含义 |
---|---|
0 | 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 |
14 | MP3 8-Khz |
15 | Device-specific sound |
表2.音频采样率
值 | 含义 |
---|---|
0 | 5.5kHz |
1 | 11KHz |
2 | 22 kHz |
3 | 44 kHz |
3.3 Video Tag Data
第1个字节包含的是视频参数信息,第2字节开始为视频流数据。
第1个字节:
- UB[4],前4位标识帧类型。见表3帧类型。
- UB[4],后4位标识视频编码类型。见表4视频编码类型。
表3.帧类型
值 | 含义 |
---|---|
1 | keyframe (for AVC,a seekable frame) |
2 | inter frame (for AVC,a nonseekable frame) |
3 | disposable inter frame (H.263 only) |
4 | generated keyframe (reserved for server use) |
5 | video info/command frame |
表4.视频编码类型
值 | 含义 |
---|---|
1 | 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 |
3.4 Script Tag Data
该类型Tag又通常被称为Metadata Tag,会放一些视频和音频的元数据信息如:duration、width、height、audiodatarate等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。
介绍下脚本的数据类型。所有数据都是以
数据类型+(数据长度)+数据的格式
出现的,数据类型占1byte,数据长度看数据类型是否存在,后面才是数据。数据类型见表5。
一个数据包示例如下:
-------------------------------------------------
| AMF1("onMetaData") | AMF2("wight, height...")|
-------------------------------------------------
第一个AMF包:
第1个字节表示AMF包类型,一般总是0x02,表示字符串。第2-3个字节为UI16类型值,标识字符串的长度,一般总是0x000A(“onMetaData”长度)。后面字节为具体的字符串,一般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。
第二个AMF包:
第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如表6所示。
表5.数据类型
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
表6.常见MetaData
值 | 含义 |
---|---|
duration | 时长 |
width | 视频宽度 |
height | 视频高度 |
videodatarate | 视频码率 |
framerate | 视频帧率 |
videocodecid | 视频编码方式 |
audiosamplerate | 音频采样率 |
audiosamplesize | 音频采样精度 |
stereo | 是否为立体声 |
audiocodecid | 音频编码方式 |
filesize | 文件大小 |
4. 开源的解析软件
- riverlight/FlvParser
- FlvAnalyzer