FLV封装格式解析

FLV简介

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

 FLV组成

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

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

Tag一样是有 Tag Header的

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

⼤端序    ⼤端序        ⼤端序        ⼤端序       ⼤端序        ⼤端序        ⼤端序          ⼤端序

为了防止你们出错 我必须多说很多遍 ⼤端序

 

当你解析一个FLV封装格式的文件的时候 解析流程如下

 

 FLV header解析

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

FLV头占9个字节,⽤来标识⽂件为FLV类型,以及后续存储的⾳视频流⼀个FLV⽂件,每种 类型的tag都属于⼀个流,也就是⼀个flv⽂件最多只有⼀个⾳频流,⼀个视频流,不存在多个 独⽴的⾳视频流在⼀个⽂件的情况。

 

 

 FLV Body Previous Tag Size解析 

 FLV Header之后,就是FLV File Body。FLV File Body是由⼀连串的Previous Tag Size + tags构成。 Previous Tag Size占4个字节。注意是大端序 所以

00 00 01 7F 计算出大小等于0x0000017F=383(十进制)

 

 FLV Tag解析

 每⼀个Tag也是由两部分组成:tag header和tag data。Tag Header⾥存放的是当前tag的类 型、数据区(tag data)的⻓度等信息。

 tag header

 tag header⼀般占11个字节的内存空间。FLV tag结构如下:

 注意:

1. flv⽂件中Timestamp和TimestampExtended拼出来的是dts。也就是解码时间。 Timestamp和TimestampExtended拼出来dts单位为ms。(如果不存在B帧,当然dts等于 pts)

2. CompositionTime 表示PTS相对于DTS的偏移值, 在每个视频tag的第14~16字节。 显示时间(pts) = 解码时间(tag的第5~8字节) + CompositionTime CompositionTime的单位也是ms

 Tag Data 解析

⼀般可以分为3种类型:脚本(帧)数据类型、⾳频数据类型、视频数据

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

 接下来我们重点说说这三种类型的数据信息

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

 该类型Tag⼜被称为MetaData Tag,存放⼀些关于FLV视频和⾳频的元信息,⽐如:duration、width、 height等。通常该类型Tag会作为FLV⽂件的第⼀个tag,并且只有⼀个,跟在File Header后。该类型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类型值,表 示数组元素的个数。后⾯即为各数组元素的封装,数组元素为元素名称和值组成的对。常⻅的数组元素如 下表所示。 

Audio Tag Data结构(⾳频类型) 

 ⾳频Tag Data区域开始的:

第⼀个字节包含了⾳频数据的参数信息

 第⼆个字节开始为⾳频流数据。

(这两个字节属于tag的data部分,不是header部分)

 第⼀个字节为⾳频的信息

 

 If the SoundFormat indicates AAC, the SoundType should be set to 1 (stereo) and the SoundRate should be set to 3 (44 kHz). However, this does not mean that AAC audio in FLV is always stereo, 44 kHz data. Instead, the Flash Player ignores these values and extracts the channel and sample rate data is encoded in the AAC bitstream.

啥意思呢 就是说 采样率 采样进度 音频省道等等参数意义不大 还是要等到解析AAC数据的时候才能知道

 第⼆个字节开始为⾳频数据(需要判断该数据是真正的⾳频数据,还是⾳频config信息)。

 也就是到底是

 这两个东西中的哪一个

接下来的FLV解析 请看我的FLV封装格式解析2 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀神李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值