FLV格式

  1. 一、概述
  2. 二、FLV文件格式
  • FLV Header
  • FLV Body
    1. PreviousTagSize & Tag Header
    2. Tag Data
      1. Audio Tag Data
      2. Video Tag Data
      3. Script Tag Data
  • 一、概述

    FLV(Flash Video)是Adobe公司设计开发的一种流媒体格式。因为可以在Flash playe播放,浏览器插件也支持Flash player,所以是流行一时的主流流媒体格式。

    二、FLV文件格式

    格式为:FLV Header + FLV Body。其中FLV Body有一系列的Tag组成。
    github

    FLV Header

    格式如下:
    github

    • Signature:0X46,“F”
    • Signature:0X4C,“L”
    • Signature:0X56,“V”
    • Version:版本号,目前为0X01
    • TypeFlagsReserved:5bit,总是0
    • TypeFlagsAudio:1bit,是否存在音频,1表示存在
    • TypeFlagsReserved:1bit,总是0
    • TypeFlagsVideo:1bit,是否存在视频,1表示存在
    • DataOffset:4byte,从Flv Header到Flv Body开始的字节数,1版本下该值为9

    FLV Body

    该数据结构由一个个Tag和PreviousTagSize组成,PreviousTagSize字段,标记前面一个Tag的大小。

    PreviousTagSize & Tag Header

    github

    • PreviousTagSize:4byte,表示前一个Tag的长度。
    • Type:1byte,表示Tag类型,类型分为音频(0X08)视频(0X09)scripte data(0X12),其他类型值被保留。
    • DataSize:3byte,表示当前Tag Data内容的大小。
    • Timestamp:3byte,表示当前Tag的时间戳。
    • Timestamp Extended:1byte,表示时间戳的扩展自负,当24位Timestamp不够用的时候,该字节可以将时间戳扩展到32位。
    • StreamID:3字节,表示流id,总是0。
    • TagData:不同的类型结构不同。

    Tag Data

    一般一个FLV文件 = 一个头文件+一个script Tag+多个video/audio Tag

    Audio Tag Data

    github

    • SoundFormat:8bit,音频编码类型。
      • 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
      • 11:Speex
      • 14:MP3 8-Khz
      • 15:Device-specific sound
    • SoundRate:2bit,音频采样率。
      • 0:5.5kHz
      • 1:11kHz
      • 2:22kHz
      • 3:44kHz
    • SoundSize:1bit,音频采样精度。
      • 0:8bit
      • 1:16bit
    • SoundType:1bit,音频类型。
      • 0:sndMono
      • 1:sndStereo

    注意:如果SoundFormat的值为10,表示当前类型为AAC的情况。音频数据格式如下:
    github

    • AACPacketType:1byte,data值类型。
      • 0:AAC sequence header
      • 1:AAC data
    • Data:数据,根据type类型为AudioSpecificConfigRaw AAC frame data
    Video Tag Data

    github

    • FrameType:4bit,帧类型
      • 1:keyframe(关键帧)
      • 2:inter frame
      • 3:disposable inter frame
      • 4:generated keyframe
      • 5:video info/command frame
    • CodecID:4bit,编码类型
      • 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(H264)

    注意:如果CodecID的值为7,表示当前类型为H264。视频数据格式如下:
    github

    • AVCPacketType:8bit,包类型
      • 0:AVC sequence header
      • 1:AVC NALU
      • 2:AVC end of sequence
    • CompositionTime:24bit,时间值
      • Composition time offset:当前AVCPacketType必须为1
      • 0
    • Data:
      • AVCPacketType为0时:AVCDecoderConfigurationRecord
        • configurationVersion:8bit,
        • AVCProfileIndication:8bit,
        • profile_compatibility:8bit,
        • AVCLevelIndication:8bit,
        • lengthSizeMinusOne:8bit,
        • numOfSequenceParameterSets:8bit,SPS的个数
        • sequenceParameterSetLength:16bit,SPS的长度
        • sequenceParameterSetNALUnits:8bit[n],SPS数据
        • 多SPS重复格式:
        • numOfPictureParameterSets:8bit,PPS的格式
        • pictureParameterSetLength:8bit,PPS的长度
        • pictureParameterSetNALUnits:8bit[n],PPS的数据
        • 多PPS重复格式:
      • AVCPacketType为1时:One Or More NALUs
        • NALU len:32bit,NALU长度
        • NALU Data:8bit[n],NALU值
        • 多NALU重复格式:
      • AVCPacketType为2时:空
    Script Tag Data

    又被叫MetadataTag(控制帧),放入一些音视频的基本信息,如宽高等。通常该类型的Tag会放在Header后面的第一个类型,并且只出现一次。
    github

    • AMF1
      • AMF Type:1byte,类型,一般为0X02
        • AFM_DATA_TYPE_NUMBER:0X00
        • AFM_DATA_TYPE_BOOL:0X01
        • AFM_DATA_TYPE_STRING:0X02
        • AFM_DATA_TYPE_OBJECT:0X03
        • AFM_DATA_TYPE_NULL:0X05
        • AFM_DATA_TYPE_UNDEFINED:0X06
        • AFM_DATA_TYPE_REFERENCE:0X07
        • AFM_DATA_TYPE_MIXEDARRAY:0X08
        • AFM_DATA_TYPE_OBJECT_END:0X09
        • AFM_DATA_TYPE_ARRAY:0X0A
        • AFM_DATA_TYPE_DATE:0X0B
        • AFM_DATA_TYPE_LONG_STRING:0X0C
        • AFM_DATA_TYPE_UNSUPPORTED:0X0D
      • lenght:2byte,字符串长度,一般为**0X000A。
      • string:字符串,一般为onMetaData
    • AMF2
      • AMF Type:1byte,类型,一般为0X08
      • array length:4byte,数组元素个数
      • array:数组元素,格式为元素名长度(16bit) + 元素名称(8bit[n]) + 元素的值(double)
        • duration:时长
        • width:视频宽度
        • height:视频高度
        • videoDataRate:视频码率
        • frameRate:视频帧率
        • videoCodecId:视频编码方式
        • audioSampleRate:音频采样率
        • audioSampleSize:音频采样精度
        • stereo:是否立体声
        • audioCodecId:音频编码方式
        • fileSize:文件大小