FLV封装格式剖析


一、FLV格式组成

FLV (Flash Video) 是由 Adobe 公司推出的一种流媒体格式,它是随着Flash MX的推出发展而来的视频格式。由于其封装后的音视频文件体积小、封装简单等特点,非常适合于互联网上使用。目前主流的视频网站基本都支持FLV。采用FLV格式封装的文件,一般文件后缀定义为.flv。

FLV封装格式是由一个文件头(header)和 文件体(Body)组成。其中Body又由“PreviousTagSize 和 Tag”模块组成。

【FLV封装格式 图1】
在这里插入图片描述

1、 FLV Header

【FLV Header 图2】
在这里插入图片描述
所有 FLV 格式文件都以 FLV Header 开头,FLV封装头,共占9个字节。

  • Signature:3个字节。FLV文件标识,固定为“F”,“L”,“V”(0x46,0x4C,0x56)

  • Version:1个字节。FLV 版本,例如,0x01 表示 FLV 版本 1

  • Typeflags:1个字节。前5个bit为保留位默认为0;第6 bit为音频存在标记位(1存在,0不存在);第7bit保留位默认为0;第8bit为视频存在标记位(1存在,0不存在)。

  • Dataoffset:4个字节。表示从Header起始位置到Body起始位置的字节数(即Header的大小),FLV版本1中为9。


2、PreviousTagSize
占4个字节,记录前面一个Tag的大小,用于逆向读取处理。FLV header后的第1个PerviousTagSize的值为0。


3、Tag
FLV数据,一般分为脚本(帧)数据类型、音频数据类型和视频数据。FLV数据以大端序进行存储,解析的时候需要注意。
每一个Tag由TagHeader和TagData组成。

【FLV Tag 图3】
在这里插入图片描述

参数说明:

  • Tagtype:1个字节。表示tag类型:音频(0x08)、视频(0x09)和scriptdata(0x12)等。
  • DataSize:3个字节。表示tag的data模块的大小。
  • Timestamp:3个字节。表示tag的时间戳,单位:ms。相对值,第一个tag的时间戳总是为0。
  • TimestampExtended:1个字节。表示时间戳的扩展字节,当24位数值不够时,以该字节位最高位将时间戳扩展为32位数值。
  • StreamID:3个字节。默认为0。
  • TagData:数据域数据,不同类型的tag的data部分的结构各不相同。

注意:

  • flv文件中Timestamp和TimestampExtended拼出来的是dts(解码时间,单位:ms);如果不存在B帧,dts=pts。
  • CompositionTime表示PTS相对DTS的偏移值(单位:ms),在每个视频tag的第14~16字节。
    显示时间(pts)=解码时间(tag的第5~8字节)+CompositionTime。


二、Tag Data结构

一个FLV文件,每种类型的tag都属于一个流,也就是一个flv文件最多只有一个音频流,一个视频流,不存在多个独立的音视频流在一个文件的情况。

【FLV TagType 图4】
在这里插入图片描述

前文中我们知道Tag Type包含三种类型:音频、视频和scriptdata等。下面我们对这些数据结构进行详细介绍。


1、script Tag Data结构(脚本类型、帧类型)
script Tag又称为MetaData Type,用于存放一些关于FLV视频和音频的元信息。比如:duration、width、height等。script Tag通常会作为FLV文件的第一个Tag,紧跟在File Header之后,并且只有一个。

我们使用mediainfo工具可以查看到script Tag Data结构如下:

【script Tag Data结构 图5】
在这里插入图片描述
第一个AMF包(红框):第一个字节表示AMF包类型,一般总是0x02,表示字符串。第2~3个字节位UI16类型值,表示字符串的长度,一般总是0x000A(onMetaData长度)。后面字节为具体的字符串,一般为“onMetaData”(0x6F 0x6E 0x4D 0x65 0x74 0x61 0x44 0x61 0x74 0x61)。

第二个AMF包(蓝框): 第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常用的数组元素如下图所示。

【script Tag Data AMF数组类型说明 图6】
在这里插入图片描述
说明:Lavf54.63.104即是 Libavformat version 54.63.104. 即是ffmpeg对于库的版本。

使用mediainfo工具查看到的flv信息对应如下:

【script Tag Data 数据示例 图7】
在这里插入图片描述


2、Audio Tag Data结构(音频类型)
第一个字节包含音频数据的参数信息,第二个字节开始为音频流数据。

1)音频数据参数
spec对于AAC而言,比较有用的字段是SoundFormat。

【Audio Tag Data 音频数据参数取值 图8】
在这里插入图片描述

2)音频流数据
解析该数据时,需要先判断该数据是音频的config信息,还是真正的音频数据。

【Audio Tag Data 音频数据 图9】
在这里插入图片描述

【AACAUDIODATA 图10】
在这里插入图片描述



3、video Tag Data结构(视频类型)
第一个字节包含视频数据的参数信息,第二个字节开始为视频流数据。

1)视频数据参数

【Video Tag Data 视频数据参数取值 图11】
在这里插入图片描述


2)视频流数据

【VideoTag Data 视频数据 图12】
在这里插入图片描述

【AVCVIDEOPACKET 图13】
在这里插入图片描述
说明:CompositionTime (单位:毫秒)
CompositionTime 每个视频tag(整个tag)的第14~16字节。
CompositionTime : 显示时间 = 解码时间(tag的第5-8字节,位置索引[4]-[7])+ CompositionTime。


三、FLV封装数据解析框架


【FLV封装数据解析框架 图14】
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值