FLV封装格式及分析器工具
http://blog.csdn.net/leixiaohua1020/article/details/17934487
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封装格式及分析器工具的更多相关文章
- 视音频编解码学习工程:FLV封装格式分析器
===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...
- 视音频数据处理入门:FLV封装格式解析
===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...
- FLV 封装格式解析
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10662941.html FLV (Flash Video) 是由 Adobe 公司推出的 ...
- FLV封装格式分析
FLV官方文档:https://github.com/jiayayao/DataSheet/tree/master/media%20format/flv 一.FLV格式 FLV包括文件头(FLV he ...
- 视音频编解码学习工程:TS封装格式分析器
=====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...
- FFmpeg封装格式处理
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506636.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...
- 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)
===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...
- 【多媒体封装格式详解】--- AAC ADTS格式分析
ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式. 记得第一次做demux的时候,把AAC音频的ES流从FLV封装格式中抽出来送给硬件解码器时 ...
- FFmpeg封装格式处理3-复用例程
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506653.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...
随机推荐
- TFS2013 安装出现TF400102错误解决
我是参照:http://www.cnblogs.com/zhibincai/archive/2013/11/25/3442285.html 进行安装的windows 2012 + sql 2012 S ...
- lookup:ID列
对lookup列对应的ID列的引用的写法 if (item["NavType_x003a_ID"].ToString() == type["ID"].ToStr ...
- onActivityResult调用不到的问题
有可能是调用时机不对,请转移到: http://www.cnblogs.com/shaweng/p/3875825.html 还有可能是Activity的launchmode导致的 使用 androi ...
- C# IO操作(一)Path类的常用方法
1.Path类,查看编译器可知,这个类是个静态的工具类,需要注意的是,这个类是对字符串的操作,与文件无关. 1)ChangeExtension()方法,修改文件的后缀(调用这个方法,如果给第二个参数制 ...
- Sytem 表空间很大
SYSTEM表空间使用率达到了99%, 经查出,是审计表AUD$占用绝大部分的空间. -- 占用表空间system对象大小排名 SELECT * MB FROM DBA_SEGMENTS WHERE ...
- 一 JavaScript应用开发实践指南
渐进增强模型 总述: 结构层(Structure),表现层(presentation)与行为层(behavior). HTML,CSS,JavaScript. 只有HTML 的情况下也可以显示内容,C ...
- SQL日期操作及只获取日期的方法
datepart()函数的使用 * datepart()函数可以方便的取到时期中的各个部分*如日期:2006-07--02 18:15:36.513* ...
- 理解css 中的position五个属性
在实际开发页面布局时,运用position,对定位的块级元素的嵌套的效果总是不太理解,这里做了几个测试 一般的在w3c中我们可以很容易的获取定义: static : 默认值.没有定位,元素出现在正常的 ...
- OpenJudge 2756 二叉树
1.链接地址: http://bailian.openjudge.cn/practice/2756/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 如 上图所示,由正整数1 ...
- VS2005调试时无法找到调试信息解决方法
调试C++程序的时候出现,无法找到.exe的调试信息,或者调试信息不匹配.未使用调试信息生成二进制文件.解决方法:打开菜单项目->项目属性页: 1.选择配置属性->链接器->调试-& ...