http://blog.csdn.net/leixiaohua1020/article/details/17934487

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文件结构(详图)

注意:该文件结构图中的streamid有误,其应该占用3个字节(avio_skip(s->pb, 3); /* stream id, always 0 */)

下面详细介绍一下三种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

文件大小

 

FLV封装格式及分析器工具的更多相关文章

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

    ===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...

  2. 视音频数据处理入门:FLV封装格式解析

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  3. FLV 封装格式解析

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10662941.html FLV (Flash Video) 是由 Adobe 公司推出的 ...

  4. FLV封装格式分析

    FLV官方文档:https://github.com/jiayayao/DataSheet/tree/master/media%20format/flv 一.FLV格式 FLV包括文件头(FLV he ...

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

    =====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...

  6. FFmpeg封装格式处理

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506636.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...

  7. 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)

    ===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...

  8. 【多媒体封装格式详解】--- AAC ADTS格式分析

    ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式. 记得第一次做demux的时候,把AAC音频的ES流从FLV封装格式中抽出来送给硬件解码器时 ...

  9. FFmpeg封装格式处理3-复用例程

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506653.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...

随机推荐

  1. h2database源码浅析:事务、两阶段提交

    Transaction Isolation Transaction isolation is provided for all data manipulation language (DML) sta ...

  2. C++实现元组

    一般我们使用struct时需要在头文件中定义,例如 struct Example { int a; char b; ... }; 这样将数据打包好必须在程序运行之前将其定义好,如果有需求在程序运行时添 ...

  3. 常用AWK命令

    常用AWK命令 Awk is a programming language which allows easy manipulation of structured data and the gene ...

  4. C语言经典案例

    题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%:20万到40万 ...

  5. [Guava官方文档翻译] 4. 使用Guava Ordering排序 (Ordering Explained)

    本文地址:http://www.cnblogs.com/hamhog/p/3537233.html 示例 assertTrue(byLengthOrdering.reverse().isOrdered ...

  6. WebClient以POST方式发送Web请求

    本例使用WebClient以POST方式发送Web请求并下载一个文件,难点是postData的构造,发送Web请求时有的网站要求可能要求 Cookies前后一致.其中application/x-www ...

  7. 啊哈!算法:解密QQ号

    书中给出的算法有点浪费空间,可以使用循环队列进行改进,这样就不需要使用额外的空间,在原数组的基础上就可以完成解密,代码如下: #include <stdio.h> void decode( ...

  8. source和.命令的区别

    source FileName 作用:在当前bash环境下读取并执行FileName中的命令. 注:该命令通常用命令“.”来替代. 如:source .bash_rc 与 . .bash_rc 是等效 ...

  9. 腾讯视频嵌入手机端网站demo - 就像微信文章中一样一样的

    页面中的调用如下: <iframe id="video_iframe" class="video_iframe" src="TenVideoPl ...

  10. 请求与通配符 mime 映射相匹配。请求映射到静态文件处理程序。如果有不同的前提条件,请求将映射到另一个处理程序。

    打开IIS管理器,找到“处理程序映射”,在列表右击选择“添加脚本映射”即可.eg:*.aspx,将该类型的页面的处理程序映射为“%windir%\Microsoft.NET\Framework\v4. ...