flv文件格式介绍

2018-11-27  本文已影响8人  smallest_one

目录

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

1. 概述

flv(Flash Video)是Adobe设计的一个免费开放的音视频格式。

2. flv文件主体结构

flv包括Header和Body两部分:

使用的是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字节意义如下:

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种类型组成:

结构如下:

-------------------------
|       Tag Header      |
-------------------------
|       Tag  Data       |
-------------------------
 
                -------------------------
                |       Tag Header      |
                -------------------------
                 /                    \
--------------------------------------------------------
| 08 | 00 | 00 | 18 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
--------------------------------------------------------

3.1 Tag Header

由11字节组成:

3.2 Audio Tag Data

Audio Tag Data开始的第1个字节包含了音频数据的参数信息,第2个字节开始为音频流数据:

第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个字节:

表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. 开源的解析软件

5. 参考阅读

  1. FLV and F4V File Format Specification (Version 10.1)
上一篇下一篇

猜你喜欢

热点阅读