flv格式分析与解复用

介绍

        FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、 封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV 格式封装的⽂件后缀为.flv。

        FLV封装格式是由⼀个⽂件头(file header)和 ⽂件体(file Body)组成。其中,FLV body由⼀ 对对的(Previous Tag Size字段 + tag)组成。Previous Tag Size字段 排列在Tag之前,占⽤4 个字节。Previous Tag Size记录了前⾯⼀个Tag的⼤⼩,⽤于逆向读取处理。FLV header后 的第⼀个Pervious Tag Size的值为0。

Tag⼀般可以分为3种类型:脚本(帧)数据类型、⾳频数据类型、视频数据。FLV数据以⼤端序 进⾏存储,在解析时需要注意。⼀个标准FLV⽂件结构如下图

FLV⽂件的详细内容结构如下图:

音视频存在索引下标是5 7  

整体的解析框架

 详细剖析

注:在下⾯的数据type中,UI表示⽆符号整形,后⾯跟的数字表示其⻓度是多少位。⽐如 UI8,表示⽆符号整形,⻓度⼀个字节。UI24是三个字节,UI[8*n]表示多个字节。UB表示位 域,UB5表示⼀个字节的5位。可以参考c中的位域结构体。

FLV header

FLV头占9个字节,⽤来标识⽂件为FLV类型,以及后续存储的⾳视频流。
⼀个FLV⽂件,每种类型的tag都属于⼀个流,也就是⼀个flv⽂件最多只有⼀个⾳频流,⼀个视频流,不存在多个独⽴的⾳视频流在⼀个⽂件的情况。
    
FLV头的结构如下:
签名 UI8 'F'(0x46)
签名 UI8 'L'(0x4C)
签名 UI8 'V'(0x56)

版本 UI8 FLV的版本。0x01表示FLV版本为1


typeflags:
    保留字段 UB5 前五位都为0
    ⾳频流标识 UB1 是否存在⾳频流
    保留字段 UB1 为0
    视频流标识 UB1 是否存在视频流

dataOffset  ⽂件头⼤⼩  UI32 
FLV版本1时填写9,表明的是FLV头的⼤⼩,为后期的FLV版本扩展使⽤。包括这四个字节。数据的起始位置就是从⽂件开头偏移这么多的⼤⼩。

FLV Body

FLV Heade之后是FLV File Body。(一般15字节)
FLV File Body =N*(PreviousTagSize + tags)构成。

 

解析一组body 

tag n: 

 flv文件分析示例

小结:

data1不同类型处理

视频帧类型 Video Tag Data

 

Frame Type (4 bits)
标识当前帧的类型,可以是关键帧(Keyframe, 值为 1)或非关键帧(非值为 1)。
Codec ID (4 bits)
标识视频编码的类型,如 H.264(7)、VP6(4)、Sorenson H.263(2)等。

对于非 H.264 编码:视频编码数据根据不同的编码格式,这里包含实际的视频编码数据。


对于 H.264 编码:
AVCPacketType (8 bits) :当前数据包的类型,可以是 0(AVCDecoderConfigurationRecord)、1(NALU)或2(empty)。
CompositionTime (24 bits, signed integer):视频帧的显示时间偏移,单位为毫秒。

注意:显示时间 = 解码时间(tag的第5~8字节(tag.timestamp),位置索引[4]~[7])+ CompositionTime

NALU 数据
如果 AVCPacketType 为 1,则这里包含一个或多个 NALU(Network Abstraction Layer Unit)。


总结:
非 H.264 编码: 1 byte (Frame Type + Codec ID) + 视频编码数据长度


H.264 编码: 1 byte (Frame Type + Codec ID) + 1 byte (AVCPacketType) +3 bytes (CompositionTime) + data2数据长度(nalu)

音频帧类型Audio Tag Data结构

音频参数提取格式:

字段名称                                 字节数        描述
audioObjectType                    5 bits        AAC 音频编码类型
samplingFrequencyIndex       4 bits        采样率索引
channelConfiguration              4 bits        声道数
frameLengthFlag                     1 bit    帧长度标志
dependsOnCoreCoder            1 bit    是否依赖核心编码器
extensionFlag                          1 bit    扩展标志

adts首部学习:

AAC分析_aac syncword 帧长-CSDN博客

脚本帧类型

Script data脚本数据就是描述视频或⾳频的信息的数据,如宽度、⾼度、时间等等,⼀个⽂ 件中通常只有⼀个元数据,⾳频tag和视频tag就是⾳视频信息了,采样、声道、频率,编码等 信息。

Script Tag Data结构(脚本类型、帧类型)

该类型Tag⼜被称为MetaDataTag,存放⼀些关于FLV视频和⾳频的元信息,⽐如:duration、width、 height等。通常该类型Tag会作为FLV⽂件的第⼀个tag,并且只有⼀个,跟在File Header后。

AMF包
  1. 第一个 AMF 包:

    • 第 1 个字节 (0x02) 表示这是一个字符串类型的 AMF 包。

    • 第 2-3 个字节 (0x000A) 表示字符串的长度,这里是 10,对应 "onMetaData"。

    • 后面 10 个字节 (0x6F,0x6E,0x4D,0x65,0x74,0x61,0x44,0x61,0x74,0x61) 就是字符串 "onMetaData"。

  2. 第二个 AMF 包:

    • 第 1 个字节 (0x08) 表示这是一个数组类型的 AMF 包。

    • 第 2-5 个字节 (某个 UI32 值) 表示数组中元素的个数。

    • 后面就是这个数组的各个元素,每个元素是一个包含名称和值的对。常见的数组元素包括视频编码信息、音频编码信息、持续时间等。

小结:

  • 第一个 AMF 包起到一个引导作用,告诉我们接下来的数据是 FLV 文件的元数据。

  • 第二个 AMF 包才是真正的元数据容器,存储了文件的各种属性信息。

 flv文件分析amf包

 提取amf包

脚本格式分析:

信息举例

000003D  width (16 bytes)
000003D   StringLength:                         5 (0x0005)
000003F   StringData:                           width
0000044   Type:                                 0 (0x00) - DOUBLE
0000045   Value:                                1920.000

 参考表单位:k/bps:

 

 总结

详细解析flv的数据格式以及如何对aac和avc解复用操作

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值