FLV格式概述:

FLV(Flash Video)是Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特点,使其很适合在互联网上进行应用。此外,FLV可以使用Flash Player进行播放,而Flash Player插件已经安装在全世界绝大部分浏览器上,这使得通过网页播放FLV视频十分容易。

FLV结构:

FLV文件        : 文件头(File Header)+文件体(File Body)
FLV文件头    : 9Byte
FLV文件体    : Previous Tag Size + Tag

FLV文件头解析:

文件头由一下几部分组成:

Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 Byte)

Signature 占3个字节

        固定FLV三个字符作为标示。一般发现前三个字符为FLV时就认为他是flv文件。

Version 占1个字节

        标示FLV的版本号。这里我们看到是1

Flags 占1个字节

        内容标示。第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)。截图看到是0x05,也就是00000101,代表既有视频,也有音频。

DataOffset 占4个字节

        表示FLV的header长度。这里可以看到固定是9。

flv视频流存储成文件 java_flv视频流存储成文件 java


flv视频流存储成文件 java_rtmp_02

FLV文件体解析:

FLV的文件体部分是由一系列的Previous Tag Size + tag构成:

flv视频流存储成文件 java_flv_03


        Previous Tag Size固定4个字节,表示前一个tag的size

        tag 分三种类型,scripts、video、audio

scripts tag 解析:

scripts tag是由tag Header + Tag Data组成:

该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的元数据信息如:duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。

flv视频流存储成文件 java_flv视频流存储成文件 java_04


flv视频流存储成文件 java_h.264_05

tag Header:

TagType: 18 (1 byte)
    TagType 代表含义如下:
        8: audio
        9 : video
        18 : script data
DataSize: 293 (3 bytes)
    tag Data大小
    tag Header大小 = Previous Tag Size - DataSize
TimeStamp: 0 (3 bytes)
    时间戳
TimestampExtended: 0 (1 byte)
    扩展时间戳
StreamId: 0 (3 bytes)
    流ID

tag Data:

第一个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类型值,表示数组元素的个数。

后面即为各数组元素的封装,数组元素为元素名称和值组成的对。

常见的数组元素如图所示:

flv视频流存储成文件 java_ide_06

Video tag 解析:

video tag是由tag Header + Tag Data组成:

flv视频流存储成文件 java_ide_07

tag Header:

TagType: 9 (1 byte)
    TagType 代表含义如下:
        8: audio
        9 : video
        18 : script data
DataSize: 50 (3 bytes)
    tag Data大小
    tag Header大小 = Previous Tag Size - DataSize
TimeStamp: 0 (3 bytes)
    时间戳
TimestampExtended: 0 (1 byte)
    扩展时间戳
StreamId: 0 (3 bytes)
    流ID

tag Data:

FrameType: 1 (4 bits)

    FrameType 代表含义如下:

        1 : 关键帧(for AVC, a seekableframe)

        2 : 帧间参考帧(for AVC, a non -seekable frame)

        3 : disposable inter frame(H.263only)

        4 : generated keyframe(reserved forserver use only)

        5 : video info / command frame

CodecID: 7 (4 bits)

    CodecID 代表含义如下:

        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

AVCPacketType: 0 (1 byte)

    AVCPacketType 代表含义如下:

        AVCPacketType=0x00,为AVCSequence Header;

        AVCPacketType=0x01,为AVC NALU;

        AVCPacketType=0x02,为AVC end ofsequence

CompositionTime Offset: 0 (3 bytes)

    相对时间戳,如果AVCPacketType=0x01,为相对时间戳,其它均为0

data部分

    如果AVCPacketType=0x00,为AVCDecorderConfigurationRecord(包含了参数信息,例如profile、PPS、SPS等);

    如果AVCPacketType=0x01,为NALUs(视频数据);

flv视频流存储成文件 java_h.264_08


    如果AVCPacketType=0x02,为空。

Audio tag 解析:

video tag是由tag Header + Tag Data组成:

flv视频流存储成文件 java_h.264_09

tag Header:

TagType: 8 (1 byte)
    TagType 代表含义如下:
        8: audio
        9 : video
        18 : script data
DataSize: 7 (3 bytes)
    tag Data大小
    tag Header大小 = Previous Tag Size - DataSize
TimeStamp: 0 (3 bytes)
    时间戳
TimestampExtended: 0 (1 byte)
    扩展时间戳
StreamId: 0 (3 bytes)
    流ID

tag Data:

SoundFormat: 10 (4 bits)

    SoundFormat 代表含义如下:

        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

        11 = Speex

        14 = MP3 8 - Khz

        15 = Device - specific sound

SoundRate: 3 (2 bits)

    SoundRate 代表含义如下:

        0 = 5.5-kHz

        1 = 11 - kHz

        2 = 22 - kHz

        3 = 44 - kHz

SoundSize: 1 (1 bit)

    SoundSize 代表含义如下:

        0 = snd8Bit

        1 = snd16Bit

SoundType: 1 (1 bit)

    SoundType 代表含义如下:

        0 = sndMono

        1 = sndStereo

AACAUDIODATA:包含AACPacketType + Data(AudioSpecificConfig)

    AACPacketType: 0

        0x00 = AAC sequence header,类似h.264的sps,pps,在FLV的文件头部出现一次。

flv视频流存储成文件 java_ide_10


        0x01 = AAC raw,AAC数据

flv视频流存储成文件 java_flv_11


    audioObjectType: 2 (5bits)

        audioObjectType代表含义如下:

            AAC Main 0x01

            AAC LC 0x02

            AAC SSR 0x03

            …

    samplingFrequencyIndex: 4 (4bits)

        samplingFrequencyIndex代表含义如下:

            0x00 96000

            0x01 88200

            0x02 64000

            0x03 48000

            0x04 44100

            0x05 32000

            0x06 24000

            0x07 22050

            0x08 16000

            0x09 12000

            0x0A 11025

            0x0B 8000

            0x0C reserved

            0x0D reserved

            0x0E reserved

            0x0F escape value

    channelConfiguration: 2 (4bits)

        channelConfiguration代表含义如下:

            0x00 - defined in audioDecderSpecificConfig

            0x01 单声道(center front speaker)

            0x02 双声道(left, right front speakers)

            0x03 三声道(center, left, right front speakers)

            0x04 四声道(center, left, right front speakers, rear surround speakers)

            0x05 五声道(center, left, right front speakers, left surround, right surround rear speakers)

            …

    AOT Specific Config : 56 E5 00(不太清除是什么作用)

FLV协议整体结构示意图:

flv视频流存储成文件 java_ide_12