FLV文件格式——实例分析
2017-06-27 09:18
351 查看
http://blog.csdn.net/tianyue168/article/details/5994962
版权声明:本文为博主原创文章,未经博主允许不得转载。
一 .FLV文件头
FLV文件开始处是一个FLV头。
FLV头(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] Must be 0
TypeFlagsAudio UB[1] Audio tags are present
TypeFlagsReserved UB[1] Must be 0
TypeFlagsVideo UB[1] Video tags are present
DataOffset UI32 Offset in bytes from start of file to start of body (that is, size of header)
--------------------------------
根据上边了解到FLV文件头按字节顺序格式为
====================================
项目 长度(字节) 说明
Signature 3 格式签名规定为 "FLV"这三个字母。
Version 1 版本 FLV文件的版本 ,目前所知0x01代表flv ver 1
TypeFlags 1 文件的标志位说明信息,包括四部分后边详细说明
DataOffset 4 文件内容的起始地点(同样是FLV头大小)
====================================
TypeFlags标志位是一字节,
其中最高5位保留,必须为0(官方文件这么说的),
第3位为TypeFlagsAudio,应该表示是否包括音频(后边写的文字也都是我自己的理解,
一般不会再加上应该、可能、也许之类的字眼了)。
第2位保留,必为0。
第1位为TypeFlagsVideo ,表示有视频。
FLV header介绍完了。
============================================
============================================
FLV文件体的基本结构情况的说明。
由许多Tag组成,Tag我称为标签段。每个标签段之间有一个4字节,表示上一个标签段的尺寸。
--------------------------------
0x00000000, 4字节总为0表示这是第一个tag的前边,表示没有第0个tag,第0个tag的尺寸总为0
tag1
tag1 size ,4字节 --注 包括前一个tag的头部分 (一般为Tag中的DataSize + 11 个字节)
tag2
tag2 size ,4字节
tag3
tag3 size
...
...
...
tagn-1
tagn-1 szie
tagn
tagn size
----------------------------
其中每个tag段包括一个11字节长的头。
====================================
项目 长度(字节) 说明
TagType 1 TAG段的类型,下边有细说明。
DataSize 3 数据的尺寸,表示段内不包括此头的数据部分长度。
Timestamp 3 时间戳,
TimestampExtended 1 文件内容的起始地点(同样是FLV头大小)
StreamID 3 总为0
====================================
----
TagType 主要3种
8表示音频段。
9表示视频段。
18表示脚本段。
其它的表示为保留。
----
======================
二。 Audio Tag 数据区
Audio tag 数据区
audio信息 1byte
前四位bits表示音频格式:
* 0 -- 未压缩
* 1 -- ADPCM
* 2 -- MP3
* 5 -- Nellymoser 8kHz momo
* 6 -- Nellymoser
* 7 --G.711 A-law logarithmic PCM
* 8 --G.711 mu-law logarithmic PCM
* 9 -- reserved
* 10 --AAC
* 11 --Speex
* 14--MP3 8-kHz
* 15 --Device -specific sound
下面两位bits表示samplerate:
* 0 -- 5.5kHz
* 1 -- 11kHz
* 2 -- 22kHz
* 3 -- 44kHz
下面一位bit表示每个采样的长度:
* 0 -- snd8Bit
* 1 -- snd16Bit
下面一位bit表示类型:
* 0 -- sndMomo
* 1 -- sndStereo
audio数据区
不定
三。video Tag 数据区
video信息 1byte
前四位bits表示类型:
* 1 -- keyframe
* 2 -- inner frame
* 3 -- disposable inner frame (H.263 only)
后四位bits表示编码器id:
* 2 -- Seronson H.263
* 3 -- Screen video
* 4 -- On2 VP6
* 5 -- On2 VP6 without channel
* 6 -- Screen video version 2
* 7 -- AVC
video数据区 不定
四。script Tag 数据区
有些FLV合并器,合并文件时只是单纯的把文件的各tag连到一起,并没有修改MetaData内
的相关信息,有些播放器确是根据MetaData内的相关信息计算总播放时长的,这就导致这些
播放器无法播放由那些FLV合并器合并的文件,所以。
data tag数据组成:
//*************************************
object由名字和数据组成:
object名字类型开始标志 0x02
object结束 0x02/000009
//*************************************
MetaData里有许多相关媒体流的的信息,包括:
■ duration: 时长总秒数。
■ width: 视频宽度
■ height: 视频高度
■ videodatarate: 视频位率千位每秒
...
其它一些相关信息。
这里我关心的只有duration: 时长总秒数,这个数据需要在合并完成后进行修改。
onMetaData在脚本段中,通常一个flv只有一个脚本段,是文件的第一个段,当然这只是通常来说
因为官方文档中没有这个规定。
这里谈一下脚本段。
SCRIPTDATAVALUE
这里按数据的不同类型,有不同的数据结构。
具体指。
数据类型1个字节。
数据类型为: 2 :指 String type(SCRIPTDATASTRING)
这里说明如果发现数据类型为2,我就知道后边接了一个串类型(String type)数据。
String type包括。
项目 长度 说明
StringLength 2 串的长度(字节数)
StringData n 串的内容,长度由StringLength指出。
数据类型为: 8:指 ECMA array type(SCRIPTDATAVARIABLE[ECMAArrayLength])
这里说明如果发现数据类型为8,我就知道后边接了一个ECMA数组(ECMA array type)数据。
ECMA array type包括。
项目 长度 说明
Objects 4 数组中包括的对象数目。
数组对象成员* 这里指其它的数据信息,具体数据分别解析。
End 3 数组的结束标志总为9
数组内容包括:
数组对象1
数组对象2
...
数组对象n (n由Objects 数组中包括的对象数目决定)
其中每个数组对象:
项目 长度 说明
StringLength 2 对象的名称长度。
StringData n 对象名称,长度由StringLength指出。
objecttype 1 对象的数据类型。
数据 * 据体内容按不同类型分别处理。
数据值 If Type = 0, DOUBLE(8个字节的double数据)
If Type = 1, UI8
If Type = 2, 2字节长度的字符串
If Type = 3, object数据
If Type = 4, SCRIPTDATASTRING 定义MovieClip的路径
If Type = 7, UI16
If Type = 8,数据变量[ECMAArrayLength] 变量的结束标志是000009
If Type = 10,数据变量
If Type = 11,日期类型
If Type = 12,4字节长度的字符串
数据结束 If Type = 3,object数据结束标志 Object 和array 的结束标志
If Type = 10,array数据结束标志
日期类型是由下面组成:
------------------------
时间值 DateTime类型由8个字节的毫秒从Jan 1, 1970 UTC开始
时间偏移 本地的时区和标准时间的分钟的偏移
=========================================
通常读到文件的duration经验类型只有
0 = Number type DOUBLE 8
1 = Boolean type bool 1
2 = String type 上边已经说明,字节不固定
8 = ECMA array type
所以重点理解了这几个类型,其它类型就先不看了,因为暂时还不需要。
![](http://hi.csdn.net/attachment/201011/8/0_1289203901uKpz.gif)
这是一个flv data tag的具体内容,下面是针对其结构数据的分析:
0x12 data tag的类型标志.
000152 data tag的长度
000000 时间戳
00 时间戳扩展
000000 流id
0x02 data object的类型标志
000A object name的长度
6F6E4D65746144617461 object name(onMetaData)
08 第二个amf. data array的类型标志
0000000E 数组的长度
000D object name的长度
617564696F6461746172617465 object name(audiodatarate)
00 double类型数据标志
404C354DDA204355 double类型的数据值
...
...
0005 object name的长度
7769647468 object name(width flv视频的宽度)
00 double类型数据标志
4086800000000000 double类型的数据值
000009 data tag的结束标志.
0000015D data tag的tag size
顶
0
踩
0
上一篇位图
与 矢量图
下一篇视频格式和音频格式介绍
版权声明:本文为博主原创文章,未经博主允许不得转载。
一 .FLV文件头
FLV文件开始处是一个FLV头。
FLV头(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] Must be 0
TypeFlagsAudio UB[1] Audio tags are present
TypeFlagsReserved UB[1] Must be 0
TypeFlagsVideo UB[1] Video tags are present
DataOffset UI32 Offset in bytes from start of file to start of body (that is, size of header)
--------------------------------
根据上边了解到FLV文件头按字节顺序格式为
====================================
项目 长度(字节) 说明
Signature 3 格式签名规定为 "FLV"这三个字母。
Version 1 版本 FLV文件的版本 ,目前所知0x01代表flv ver 1
TypeFlags 1 文件的标志位说明信息,包括四部分后边详细说明
DataOffset 4 文件内容的起始地点(同样是FLV头大小)
====================================
TypeFlags标志位是一字节,
其中最高5位保留,必须为0(官方文件这么说的),
第3位为TypeFlagsAudio,应该表示是否包括音频(后边写的文字也都是我自己的理解,
一般不会再加上应该、可能、也许之类的字眼了)。
第2位保留,必为0。
第1位为TypeFlagsVideo ,表示有视频。
FLV header介绍完了。
============================================
============================================
FLV文件体的基本结构情况的说明。
由许多Tag组成,Tag我称为标签段。每个标签段之间有一个4字节,表示上一个标签段的尺寸。
--------------------------------
0x00000000, 4字节总为0表示这是第一个tag的前边,表示没有第0个tag,第0个tag的尺寸总为0
tag1
tag1 size ,4字节 --注 包括前一个tag的头部分 (一般为Tag中的DataSize + 11 个字节)
tag2
tag2 size ,4字节
tag3
tag3 size
...
...
...
tagn-1
tagn-1 szie
tagn
tagn size
----------------------------
其中每个tag段包括一个11字节长的头。
====================================
项目 长度(字节) 说明
TagType 1 TAG段的类型,下边有细说明。
DataSize 3 数据的尺寸,表示段内不包括此头的数据部分长度。
Timestamp 3 时间戳,
TimestampExtended 1 文件内容的起始地点(同样是FLV头大小)
StreamID 3 总为0
====================================
----
TagType 主要3种
8表示音频段。
9表示视频段。
18表示脚本段。
其它的表示为保留。
----
======================
二。 Audio Tag 数据区
Audio tag 数据区
audio信息 1byte
前四位bits表示音频格式:
* 0 -- 未压缩
* 1 -- ADPCM
* 2 -- MP3
* 5 -- Nellymoser 8kHz momo
* 6 -- Nellymoser
* 7 --G.711 A-law logarithmic PCM
* 8 --G.711 mu-law logarithmic PCM
* 9 -- reserved
* 10 --AAC
* 11 --Speex
* 14--MP3 8-kHz
* 15 --Device -specific sound
下面两位bits表示samplerate:
* 0 -- 5.5kHz
* 1 -- 11kHz
* 2 -- 22kHz
* 3 -- 44kHz
下面一位bit表示每个采样的长度:
* 0 -- snd8Bit
* 1 -- snd16Bit
下面一位bit表示类型:
* 0 -- sndMomo
* 1 -- sndStereo
audio数据区
不定
三。video Tag 数据区
video信息 1byte
前四位bits表示类型:
* 1 -- keyframe
* 2 -- inner frame
* 3 -- disposable inner frame (H.263 only)
后四位bits表示编码器id:
* 2 -- Seronson H.263
* 3 -- Screen video
* 4 -- On2 VP6
* 5 -- On2 VP6 without channel
* 6 -- Screen video version 2
* 7 -- AVC
video数据区 不定
四。script Tag 数据区
有些FLV合并器,合并文件时只是单纯的把文件的各tag连到一起,并没有修改MetaData内
的相关信息,有些播放器确是根据MetaData内的相关信息计算总播放时长的,这就导致这些
播放器无法播放由那些FLV合并器合并的文件,所以。
data tag数据组成:
//*************************************
object由名字和数据组成:
object名字类型开始标志 0x02
object结束 0x02/000009
//*************************************
MetaData里有许多相关媒体流的的信息,包括:
■ duration: 时长总秒数。
■ width: 视频宽度
■ height: 视频高度
■ videodatarate: 视频位率千位每秒
...
其它一些相关信息。
这里我关心的只有duration: 时长总秒数,这个数据需要在合并完成后进行修改。
onMetaData在脚本段中,通常一个flv只有一个脚本段,是文件的第一个段,当然这只是通常来说
因为官方文档中没有这个规定。
这里谈一下脚本段。
SCRIPTDATAVALUE
这里按数据的不同类型,有不同的数据结构。
具体指。
数据类型1个字节。
数据类型为: 2 :指 String type(SCRIPTDATASTRING)
这里说明如果发现数据类型为2,我就知道后边接了一个串类型(String type)数据。
String type包括。
项目 长度 说明
StringLength 2 串的长度(字节数)
StringData n 串的内容,长度由StringLength指出。
数据类型为: 8:指 ECMA array type(SCRIPTDATAVARIABLE[ECMAArrayLength])
这里说明如果发现数据类型为8,我就知道后边接了一个ECMA数组(ECMA array type)数据。
ECMA array type包括。
项目 长度 说明
Objects 4 数组中包括的对象数目。
数组对象成员* 这里指其它的数据信息,具体数据分别解析。
End 3 数组的结束标志总为9
数组内容包括:
数组对象1
数组对象2
...
数组对象n (n由Objects 数组中包括的对象数目决定)
其中每个数组对象:
项目 长度 说明
StringLength 2 对象的名称长度。
StringData n 对象名称,长度由StringLength指出。
objecttype 1 对象的数据类型。
数据 * 据体内容按不同类型分别处理。
数据值 If Type = 0, DOUBLE(8个字节的double数据)
If Type = 1, UI8
If Type = 2, 2字节长度的字符串
If Type = 3, object数据
If Type = 4, SCRIPTDATASTRING 定义MovieClip的路径
If Type = 7, UI16
If Type = 8,数据变量[ECMAArrayLength] 变量的结束标志是000009
If Type = 10,数据变量
If Type = 11,日期类型
If Type = 12,4字节长度的字符串
数据结束 If Type = 3,object数据结束标志 Object 和array 的结束标志
If Type = 10,array数据结束标志
日期类型是由下面组成:
------------------------
时间值 DateTime类型由8个字节的毫秒从Jan 1, 1970 UTC开始
时间偏移 本地的时区和标准时间的分钟的偏移
=========================================
通常读到文件的duration经验类型只有
0 = Number type DOUBLE 8
1 = Boolean type bool 1
2 = String type 上边已经说明,字节不固定
8 = ECMA array type
所以重点理解了这几个类型,其它类型就先不看了,因为暂时还不需要。
![](http://hi.csdn.net/attachment/201011/8/0_1289203901uKpz.gif)
这是一个flv data tag的具体内容,下面是针对其结构数据的分析:
0x12 data tag的类型标志.
000152 data tag的长度
000000 时间戳
00 时间戳扩展
000000 流id
0x02 data object的类型标志
000A object name的长度
6F6E4D65746144617461 object name(onMetaData)
08 第二个amf. data array的类型标志
0000000E 数组的长度
000D object name的长度
617564696F6461746172617465 object name(audiodatarate)
00 double类型数据标志
404C354DDA204355 double类型的数据值
...
...
0005 object name的长度
7769647468 object name(width flv视频的宽度)
00 double类型数据标志
4086800000000000 double类型的数据值
000009 data tag的结束标志.
0000015D data tag的tag size
顶
0
踩
0
上一篇位图
与 矢量图
下一篇视频格式和音频格式介绍
相关文章推荐
- FLV文件格式分析实例
- FLV文件格式分析
- FLV 文件格式分析
- FLV视频文件格式分析
- ELF可执行格式文件实例分析
- 以一个wav文件为实例分析wav文件格式
- FLV文件格式分析
- IOS 基础媒体文件格式语法描述和语意(MP4文件格式分析实例)
- zip 文件格式分析: 附实例介绍
- PHP文件缓存内容保存格式实例分析
- PHP文件缓存内容保存格式实例分析
- java class 文件格式分析及实例完全标注
- flv文件格式分析FlvParse.exe
- FLV文件格式分析
- FLV文件(H264 + AAC)格式超详细分析
- FLV文件格式分析(附源码)
- FLV文件格式分析
- BMP文件格式实例分析
- elf文件格式实例分析
- BMP文件格式实例分析