flv文件格式介绍

目录

  1. 概述
  2. flv文件主体结构
  3. Tag介绍
  4. 开源的解析软件
  5. 参考阅读

参考

  • [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

你可能感兴趣的:(flv文件格式介绍)