目录
- 概述
- flv文件主体结构
- Tag介绍
- 开源的解析软件
- 参考阅读
参考
- [1] FLV and F4V File Format Specification (Version 10.1)
- [2] enhanced-rtmp-v1
- [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
aligned(8) class AVCDecoderConfigurationRecord {
unsigned int(8) configurationVersion = 1;
unsigned int(8) AVCProfileIndication;
unsigned int(8) profile_compatibility;
unsigned int(8) AVCLevelIndication;
bit(6) reserved = ‘111111’ b;
unsigned int(2) lengthSizeMinusOne;
bit(3) reserved = ‘111’ b;
unsigned int(5) numOfSequenceParameterSets;
for (i = 0; i < numOfSequenceParameterSets; i++) {
unsigned int(16) sequenceParameterSetLength;
bit(8 * sequenceParameterSetLength) sequenceParameterSetNALUnit;
}
unsigned int(8) numOfPictureParameterSets;
for (i = 0; i < numOfPictureParameterSets; i++) {
unsigned int(16) pictureParameterSetLength;
bit(8 * pictureParameterSetLength) pictureParameterSetNALUnit;
}
if (profile_idc == 100 || profile_idc == 110 ||
profile_idc == 122 || profile_idc == 144) {
bit(6) reserved = ‘111111’ b;
unsigned int(2) chroma_format;
bit(5) reserved = ‘11111’ b;
unsigned int(3) bit_depth_luma_minus8;
bit(5) reserved = ‘11111’ b;
unsigned int(3) bit_depth_chroma_minus8;
unsigned int(8) numOfSequenceParameterSetExt;
for (i = 0; i < numOfSequenceParameterSetExt; i++) {
unsigned int(16) sequenceParameterSetExtLength;
bit(8 * sequenceParameterSetExtLength) sequenceParameterSetExtNALUnit;
}
}
}
参阅ISO 14496-15,5.2.4.1关于AVCDecoderConfigurationRecord的描述,它所包含的信息与MP4/FLV文件中的avcC box所存储的信息相同。
- AVCProfileIndication: ISO/IEC 14496-10中定义的profile。
- profile_compatibility:是一个字节,其定义与序列参数集(SPS)中profile_IDC和level_IDC之间出现的字节,如ISO/IEC 14496-10所定义。
- AVCLevelIndication:ISO/IEC 14496-10中定义的level。
- lengthSizeMinusOne:表示NALUnitLength字段长度减去1。
- numOfSequenceParameterSets:表示SPS的数量,这些SPS被用作解码AVC基本参数的初始SPS集。
用于解码AVC基本流。 - sequenceParameterSetLength表示SPS NAL单元的长度(字节),定义在 iso/iec 14496-10中定义的SPS NAL单元的字节长度。
- sequenceParameterSetNALUnit:包含一个SPS NAL单元,如ISO/IEC 14496-10所规定。SPSs
应按参数集标识符的升序出现,允许有空隙。 - numOfPictureParameterSets:表示图片参数集(PPS)的数量,它被用作 作为解码AVC基本流的初始PPS集。
- pictureParameterSetLength:表示PPS NAL单元的长度,单位是字节。
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. SCRIPTDATAVALUE
数据类型
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 | 视频码率,单位kb/s |
framerate | 视频帧率 |
videocodecid | 视频编码方式 |
audiodatarate | 音频码率,单位kb/s |
audiosamplerate | 音频采样率 |
audiosamplesize | 音频采样位数 |
stereo | 是否为立体声 |
audiocodecid | 音频编码方式 |
filesize | 文件大小 |
这里获取的一个文件的MetaData信息的示例
{
"onMetaData": {
"duration": 10.28,
"width": 1920,
"height": 1080,
"videodatarate": 2848.724609375,
"framerate": 25,
"videocodecid": 7,
"audiodatarate": 310.58203125,
"audiosamplerate": 48000,
"audiosamplesize": 16,
"stereo": true,
"audiocodecid": 10,
"description": "Codec by Bilibili XCode Worker v4.8.74(fixed_gap:False)",
"metadatacreator": "Version 1.9",
"canSeekToEnd": "true",
"videosize": "101547695",
"audiosize": "11213431",
"lastkeyframetimestamp": "278",
"lastkeyframelocation": "112842848",
"encoder": "Lavf59.17.103",
"filesize": 3708718
}
}
4. flv解析软件
5. 附录
5.1 AMF数据类型格式
ECMA array type
ECMA数组是一个关联数组,格式如下。
- ECMAArrayLength为数组的长度,占用4字节。
- Variables为属性的数组,一个属性由字符串的属性名和值组成。
- ScriptDataObjectEnd为
0x009
SCRIPTDATAOBJECTPROPERTY