FLV格式分析
Posted alen_xie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FLV格式分析相关的知识,希望对你有一定的参考价值。
Overview
Flash Video(简称FLV),是一种流行的网络格式。目前国内外大部分视频分享网站都是采用的这种格式.
FLV(Flash Video)是Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特点,使其很适合在互联网上进行应用。此外,FLV可以使用Flash Player进行播放,而Flash Player插件已经安装在全世界绝大部分浏览器上,这使得通过网页播放FLV视频十分容易。目前主流的视频网站如优酷网,土豆网,乐视网等网站无一例外地使用了FLV格式。FLV封装格式的文件后缀通常为“.flv”。
File Structure
从整个文件上开看,FLV是由文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag组成。因此一个FLV文件是如图1结构。
图1.文件结构(简图)
其中,每个Tag前面还包含了Previous Tag Size字段,表示前面一个Tag的大小。Tag的类型可以是视频、音频和Script,每个Tag只能包含以上三种类型的数据中的一种。图2展示了FLV文件的详细结构。
图2.FLV文件结构(详图)
下面详细介绍一下三种Tag的Tag Data部分的结构。
1.The FLV header
Field | Type | Comment |
Signature | UI8 | Signature byte always 'F' (0x46) |
Signature | UI8 | Signature byte always 'L' (0x4C) |
Signature | UI8 | Signature byte always 'V' (0x56) |
Version | UI8 | File version (for example, 0x01 for FLV version 1) |
TypeFlagsReserved | UB [5] | Shall be 0 |
TypeFlagsAudio | UB [1] | 1 = Audio tags are present |
TypeFlagsReserved | UB [1] | Shall be 0 |
TypeFlagsVideo | UB [1] | 1 = Video tags are present |
DataOffset | UI32 | The length of this header in bytes |
Signature: FLV 文件的前3个字节为固定的‘F’‘L’‘V’,用来标识这个文件是flv格式的.在做格式探测的时候,
如果发现前3个字节为“FLV”,就认为它是flv文件.
Version: 第4个字节表示flv版本号.
Flags: 第5个字节中的第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)
DataOffset : 最后4个字节表示FLV header 长度.
下面详细介绍一下三种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 | 文件大小 |
根据上面的提示,分析如之前的类型,这边暂时不提供了。可以与下面MediaInfo工具比较发现,是一样的。
previousTagSize为前一个Tag的长度。也就是Tag Header+Tag date=previousTagSize
这次主要分析一下flv格式,方便以后使用。在此也非常感谢摘录这二位博主的帮助文档,在次由衷的标识敬佩。
参考文档地址1:http://blog.csdn.net/leixiaohua1020/article/details/17934487
参考文档地址2:http://blog.csdn.net/tx3344/article/details/7349019
以上是关于FLV格式分析的主要内容,如果未能解决你的问题,请参考以下文章