音视频基础:FLV格式详解

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文件体解析:

FLV的文件体部分是由一系列的Previous Tag Size + tag构成:
在这里插入图片描述
        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出现,而且只有一个。在这里插入图片描述
在这里插入图片描述

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类型值,表示数组元素的个数。
后面即为各数组元素的封装,数组元素为元素名称和值组成的对。
常见的数组元素如图所示:
在这里插入图片描述

Video tag 解析:

video tag是由tag Header + Tag Data组成:
在这里插入图片描述

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(视频数据);
在这里插入图片描述
    如果AVCPacketType=0x02,为空。

Audio tag 解析:

video tag是由tag Header + Tag Data组成:
在这里插入图片描述

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的文件头部出现一次。
在这里插入图片描述
        0x01 = AAC raw,AAC数据
在这里插入图片描述
    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协议整体结构示意图:

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值