flv文件格式介绍

目录

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

参考

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

image.png
image.png
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单元的长度,单位是字节。
image.png

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

image.png
含义
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
image.png

SCRIPTDATAOBJECTPROPERTY

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • FLV封装格式 FLV(Flash Video)是Adobe公司推出的一种流媒体格式,由于其封装后的音视频文件体积...
    _zzbb阅读 7,685评论 3 11
  • 在如何看待哔哩哔哩的开源 HTML5 播放器内核 flv.js?中,flv.js作者有这样一段回复:一些人问我为什...
    合肥黑阅读 2,388评论 1 4
  • FLV是一个二进制文件,简单来说,其是由一个文件头(FLV header)和很多tag组成(FLV body)。 ...
    zjjcc阅读 3,022评论 1 3
  • 简介 FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其...
    第八区阅读 21,593评论 22 33
  • 译者注:这里面的内容主要是分析mp4/3gp文件的层级结构,详细的介绍了各种不同的box的结构等,网上有一些参考资...
    HaloMartin阅读 2,574评论 0 2