介绍
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包
第一个 AMF 包:
第 1 个字节 (0x02) 表示这是一个字符串类型的 AMF 包。
第 2-3 个字节 (0x000A) 表示字符串的长度,这里是 10,对应 "onMetaData"。
后面 10 个字节 (0x6F,0x6E,0x4D,0x65,0x74,0x61,0x44,0x61,0x74,0x61) 就是字符串 "onMetaData"。
第二个 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解复用操作