FLV封装格式详解,通过脑图和表格多样化分解flv

FLV概述

在这里插入图片描述 FLV(Flash Video)是比较流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,很适合在网络上进行传输播放,目前主流的视频网站无一例外地使用了FLV格式,如bilibili优酷。另外近几年html5较火,直播盛行。而flv在易传输、易封装等方面占据优势,使其成为直播媒体流的首选之一。

FLV是流媒体封装格式,我们可以将其数据看为二进制字节流。总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag及Tag Size对组成。 如下图所示,基本的结构图。
在这里插入图片描述

FLV封装格式

FLV Header

FLV Header 共占9个字节,按照如下顺序组合成 FLV 头部信息。详细结构如下图所示。

Signature(3bytes)+Version(1byte)+Flags(1byte)+DataOffset(4bytes)

在这里插入图片描述
上图直观展示了 FLV Header 的结构信息,下面将逐个字段详细介绍。

在这里插入图片描述

FLV Body

FLV Body是由一系列连续PreviousTagSize + tag构成。详细组成可以先看如下树形图。

在这里插入图片描述
从上图可以看出:FLV Body= PreviousTagSize+ Script Tag+Audio Tag[0] + Video Tag[0]+PreviousTagSize + ……+Audio Tag[n]+Video Tag[n]

详细的解释清看如下章节。

PreviousTagSize

PreviousTagSize顾名思义,指的是前一个tag的size,因此一个flv文件的第一个PreviousTagSize 大小总是为0。固定4个字节。tag有三种,分别如下图:
在这里插入图片描述
FLV Body中,tag分为三类,如上图所示,其中Script Tag只在flv开头出现,一个flv文件中只出现一次。Audio TagVideo Tag是真正的音频和视频数据载体,在整个body中交替出现。以下将详细讲解每个tag的属性和注意事项。

Script Tag

每个Tag都是由Tag HeaderTag Data组成,如图所示,Tag结构图。
在这里插入图片描述

其中Tag Header结构都是一样的,用于区分每个Tag所携带的数据类型,如下结构图。

在这里插入图片描述
可以看出,TagType字段,标记三种不同类型,分别是audiovideoscript data。其中每个字段的详细介绍,见下面表格。
在这里插入图片描述

接着讲解Script Tag,它表示控制帧信息,存放关于FLV视频和音频的元数据,如:durationwidthheight等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个 。其结构如下图所示。
在这里插入图片描述
其中,Tag Header已经在上文中介绍过了,此处不再赘述,只介绍Tag Data,详细请看如下表格。

在这里插入图片描述

Video Tag

video tag :表示video数据,同样包括Tag HeaderTag Data数据,其中Tag Header同样在上文已经讲过,其中TagType=9,此处只讲Tag Data。其组成结构如下图所示。
在这里插入图片描述
上图可以看出,Video Tag Data结构非常简单,只有三个字段,如下表格清晰的列出了每个字段的解释。
在这里插入图片描述
上表清晰的总结了Tag Data的每个字段值,那么为什么要给Video Data标记红色呢?那肯定是有原因的。从上表可以看出,CodecID取值各不相同,其中CodecID=7时,表示AVCVideoPacket格式的数据,这种格式比较特殊,有自己专门的格式:

AVCVideoPacket 格式:|AVCPacketType(8)|CompostionTime(24)|Data|

数据格式详细解释如下图所示。 在这里插入图片描述
以上就是Video Tag组成属性的详细解释。下面开始看Sudio Tag的内容。

Audio Tag

audio tag:表示audio数据 ,其组成同样是Tag HeaderTag Data,同样Tag Header已经在上文做过讲述,其中TagType=8,此处只讲Tag Data部分。其组成结构如下图所示:
在这里插入图片描述
其中每个字段的解释,可以参考如下表格:

在这里插入图片描述
以上是audio Tag每个属性的详细总结,精确到字节、位,可以直接对着流程图解析。

写在结尾

从事音视频流媒体开发已经两年了,今天是第一天总结的第一篇像样点的流媒体相关的文章,之前本来是要输出的,因为俗事缠身,又因经常加班,公司内网不好输出文章,晚上回到家又比较晚,就一拖再拖,一直到今天了。

最近做一个直播项目,采用http-flv传输模式,正好用到了flv的解封装。因此才下定决心,将开发中的手稿总结成文。在我遇到的流媒体类型中,flv是最“和善”的一种,封装格式简单,传输效率较高。与http搭配,延时很小,做直播很适合。本文只是简单地总结了一下flv的格式定义等信息,并没有通过贴出相应的解封装代码,可能看起来比较空洞。因为项目还没做完,所以等项目结束了,会专门补发一篇flv解封装的文章,作为本文的“佐证”。

本文通过分解思维导图“树形结构”来展开阐述,完整的思维导图也同步上传到我的资源,有需要的可以免费下载。在博主开发中,遇到一款非常友善的工具“FlvAnalyzer”,快速的协助我完成了flv的转封装,但是不知道这款工具的开发者是哪位大神,在此先表示衷心的感谢。这款工具同样上传到我的资源中,免费给需要的同学使用。如果阅读本文发现有错误,请随时联系博主修改完善;如果本文对你有助,请点赞关注我,相互学习,共同进步!

发布了29 篇原创文章 · 获赞 340 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Marble_ccp/article/details/105670605
FLV
今日推荐