美文网首页
flv文件格式介绍

flv文件格式介绍

作者: smallest_one | 来源:发表于2018-11-27 21:31 被阅读8次

    目录

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

    1. 概述

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

    2. flv文件主体结构

    flv包括Header和Body两部分:

    • Header:flv的类型、版本等信息。
    • Body: 数据区域。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. 开源的解析软件

    5. 参考阅读

    1. FLV and F4V File Format Specification (Version 10.1)

    相关文章

      网友评论

          本文标题:flv文件格式介绍

          本文链接:https://www.haomeiwen.com/subject/nxonqqtx.html