flv文件结构---纪念大神雷霄骅,虽然你是90后

转自:http://www.greenxf.com/soft/33229.html

视音频编解码学习工程系列文章列表:

视音频编解码学习工程:H.264分析器

视音频编解码学习工程:AAC格式分析器

视音频编解码学习工程:FLV封装格式分析器

视音频编解码学习工程:TS封装格式分析器

视音频编解码学习工程:JPEG分析器

=====================================================

本文介绍一个自己的开源小项目:FLV封装格式分析器。FLV全称是Flash Video,是互联网上使用极为广泛的视频封装格式。像Youtube,优酷这类视频网站,都使用FLV封装视频。我这个项目规模不大,主要可以用来学习FLV封装格式结构。此外它还支持分离FLV中的视频流和音频流。使用VC 2010的MFC开发完成。在对FLV进行视音频分离的过程中,用到了一个Github开源小工程:flvparse。在此插一句:我发现Github上优秀的东西真的还是挺多的,许多零散的小工程,效果都很不错。这个flvparse做的就不错。

软件的exe以及源代码已经上传到了SourceForge上。和之前的H.264码流分析器一样,增加了一个英文界面,紧跟国际潮流~

项目地址:https://sourceforge.net/projects/flvformatanalysis/

CSDN下载地址(程序+源代码):http://download.csdn.net/detail/leixiaohua1020/6838805


更新记录==============================

1.1版(2014.7.8)

 * 更换了界面

 * 原工程支持Unicode编码

 * 支持中英文切换

CSDN源代码:http://download.csdn.net/detail/leixiaohua1020/7767613


新版(2016.1.1)

 * 精简了代码,使之更通俗易懂

 * 修改了少量界面UI

 * 修正了少量解析错误

 * 添加了对TagData首字节的解析

已经更新至SourceForge上


软件使用介绍

软件的使用相当简单。软件运行后,首先打开一个FLV文件。单击“开始”,可以解析出一系列Tag,列表显示在软件右侧。不同种类的Tag被标记成了不同的颜色。列表中包含了每个Tag的类型、大小、时间戳、StreamID、TagData首字节。软件的左侧,显示了FLV文件头信息。


此外软件做了一个英文界面,如下所示。


注:如果勾选上“输出视频”,“输出音频”的话,可以输出分离后的视频流和音频流。在这里要注意的是音频支持MP3格式,AAC格式貌似有点问题。


软件源代码简析

源代码方面和普通的MFC程序差不太多,懂得MFC的人应该很快就能看懂。唯一比较特殊的地方,就在于对开源项目flvparse进行了一些改动,在此就不细说了。注释方面还是很充分的。


FLV封装原理

FLV格式的封装原理,贴上来辅助学习之用。


FLV(Flash Video)是Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特点,使其很适合在互联网上进行应用。此外,FLV可以使用Flash Player进行播放,而Flash Player插件已经安装在全世界绝大部分浏览器上,这使得通过网页播放FLV视频十分容易。目前主流的视频网站如优酷网,土豆网,乐视网等网站无一例外地使用了FLV格式。FLV封装格式的文件后缀通常为“.flv”。

总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag组成。因此一个FLV文件是如图1结构。


图1.文件结构(简图)

其中,每个Tag前面还包含了Previous Tag Size字段,表示前面一个Tag的大小。Tag的类型可以是视频、音频和Script,每个Tag只能包含以上三种类型的数据中的一种。图2展示了FLV文件的详细结构。


图2.FLV文件结构(详图)

下面详细介绍一下三种Tag的Tag Data部分的结构。

(a)Audio Tag Data结构(音频Tag)

音频Tag开始的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。结构如图3所示。


图3.Audio Tag Data结构

第1个字节的前4位的数值表示了音频编码类型。如表1所示。

表1.音频编码类型

含义

0

 Linear PCM,platform endian

1

 ADPCM

2

 MP3

3

 Linear PCM,little endian

4

 Nellymoser 16-kHz mono

5

 Nellymoser 8-kHz mono

6

 Nellymoser

7

 G.711 A-law logarithmic PCM

8

 G.711 mu-law logarithmic PCM

9

 reserved

10

 AAC

14

 MP3 8-Khz

15

 Device-specific sound

第1个字节的第5-6位的数值表示音频采样率。如表2所示。

表2.音频采样率

含义

0

 5.5kHz

1

 11KHz

2

 22 kHz

3

 44 kHz

PS:从上表可以发现,FLV封装格式并不支持48KHz的采样率。

第1个字节的第7位表示音频采样精度。如表3所示。

表3.音频采样精度

含义

0

 8bits

1

 16bits

第1个字节的第8位表示音频类型。

表4. 音频类型

含义

0

 sndMono

1

 sndStereo

(b)Video Tag Data结构(视频Tag)

视频Tag也用开始的第1个字节包含视频数据的参数信息,从第2个字节为视频流数据。结构如图4所示。


图4.Video Tag Data结构

第1个字节的前4位的数值表示帧类型。如表5所示。

表5.帧类型

含义

1

 keyframe (for AVC,a seekable frame)

2

 inter frame (for AVC,a nonseekable frame)

3

 disposable inter frame (H.263 only)

4

 generated keyframe (reserved for server use)

5

 video info/command frame

第1个字节的后4位的数值表示视频编码类型。如表6所示。

表6.视频编码类型

含义

1

 JPEG (currently unused)

2

 Sorenson H.263

3

 Screen video

4

 On2 VP6

5

 On2 VP6 with alpha channel

6

 Screen video version 2

7

 AVC

(c)Script Tag Data结构(控制帧)

该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的元数据信息如:duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。结构如图5所示。


图5.Script 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类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如表7所示。

表7.常见MetaData

含义

duration

 时长

width

 视频宽度

height

 视频高度

videodatarate

 视频码率

framerate

 视频帧率

videocodecid

 视频编码方式

audiosamplerate

 音频采样率

audiosamplesize

 音频采样精度

stereo

 是否为立体声

audiocodecid

 音频编码方式

filesize

 文件大小

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【该资源在win7——64位系统下验证通过。win10系统试试用win7兼容方式打开】 解析flv二进制数据的小工具,tag header tag data等都分析出来了的 这个工具的主要功能是查看FLV文件结构,帮助我们理解FLV格式。另外,如果涉及到处理flv文件的开发,这个工具对于查看处理结果非常有帮助。因此我觉得有必要写一个使用说明,希望这个工具能够给大家提供帮助。 打开后的界面如下图所示。 先说一下界面布局:左上方是FLV文件结构树,右边是FLV文件的字节流数据;左侧结构树下面依次是结构树的信息等级选择、高速模式选择、文件分析用时及进度条等;下方是分析文件的地址显示以及文件选择按钮。下面详细介绍一下相关部分。 结构树及信息等级 FLV结构树是这个工具最重要的显示信息,用户可以直观的查看当前FLV文件结构FLVParse默认FLV文件结构树的形式为:File Header + Metadata Tag(1个) + Video or Audio Tags(按顺序)。 结构树的信息详细程度是按等级划分的,之所以要分等级,是为了区分显示信息的详细程度,因为不同程度的分析对于分析所用的时间影响是比较大的(主要在UI界面上),越详细的信息等级占用分析时间越长。一共有6个等级,按从简单到详细介绍如下。 only section position info —— 只有每个section的位置信息,如下图所示。其中每个section后的方括号里是位置信息(十六进制表示),每个“Pre Tag Size”后面的数字表示size的大小(十进制表示),Video&Audio Tag按照在文件中的顺序依次排序标号; file header info, metadata info —— 只有File Header + Metadata Tag的详细信息,如下图所示。其中File Header的详细结构信息会在子树中列出,并在每项后面标示该项的值;Metadata Tag类似,包含Tag Header和Tag Data两个子树,并且对应子项的详细信息也都列出; file header info, metadata info, tag position info —— 包含File Header + Metadata Tag的详细信息,Video&Audio Tags的位置信息,以及Pre Tag Size信息,如下图所示; file header info, metadata info, tag section position info —— 比上个等级多出Video&Audio Tags的Tag Header和Tag Data的位置信息,如下图所示; file header info, metadata info, tag header info —— 比上个等级多出Tag Header的详细子项信息,如下图所示; file header info, metadata info, tag info —— 比上个等级多出Tag Data的详细子项信息,如下图所示。 FLV字节流数据显示 右侧显示了FLV文件的数据,可以让用户方便地查询对应位置上的字节。每一行都以一个十六进制的位置开始,该位置为相对于文件开头的位置。每一行有十六个字节,每个字节按高4位和第4位显示2个十六进制的字符,用户可以滑动滚动条查看任意位置的字节。 当用户选中左边结构树中的某项时,右边数据会自动选中对应的数据区域(绿色),根据不同项的类型,选中的区域大小也会自动对应。 高速模式 这个选项是为了解决分析比较大的FLV文件时,用户等待时间过长的问题。 普通模式时,分析过程为阻塞模式,即主线程分析完毕后刷新界面,用户才可以继续操作。 高速模式时,为非阻塞模式,主线程分析一小部分后立即返回刷新界面,响应用户操作;另外一个线程会继续分析剩余大部分文件,直到分析完毕自动结束线程。因此高速模式时,用户会看到结构树的滚动条一直在滑动,这是因为后台分析线程在不断向结构树里添加子项。需要注意的是,当后台分析线程还没有结束,如果用户打开新的文件进行分析,有可能出现错误的分析结果。这个目前没有进行测试,我想应该是这样的。 这里需要提一下,其实真正分析文件的时间并不会特别长,即使几百兆的文件,几十秒内应该没有问题,时间主要消耗在MFC的树型控件CTreeCtrl上。为了开发效率,FLVParse使用了MFC控件,但是CTreeCtrl在结构比较复杂,子项比较多的时候,效率会出现比较大的下降。当子项超过10000的时候,再进行添加的时间大大变长,几乎到了无法忍受的程度,好在还算稳定,没有出现崩溃等现象。粗略估计,每次分析文件,花在更新UI界面上的时间要占总耗时的90%以上,而且对于越大的

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值