我对FLV 文件格式的理解

2009-09-05 18:14

我对FLV 文件格式的理解
------------------------------------------
通篇文章为作者(eleel)本人对adobe官方文件的理解。
只对感兴趣的,自认为当下用得着的部分进行分析,试图保证理解的正确性,
不过作者为流媒体的门外汉,出现错误是可能性较大。

以前只用过一个FLV合并器,
不过此合并器合并后的文件有点小问题,
有些播放器不能完整播放,恰好我还必须用这个播放器,
所以就想自己写一个flv文件合并器。

/*=======================================//

经过一天的编码,自己写的flv文件合并器终于完成了。

1.解决了以前用过的合并程序在mp4播放器和psptube中

只能播放第一段的问题,

2.去除了多余的脚本段。

3.合并速度很快,感觉比原来用过的快一些。

程序提供给用的着的朋友,注程序纯绿色,绿到连作者的信息也没有。

程序下载地址:

http://www.rayfile.com/files/6d457bf3-9ad2-11de-a8d4-0014221f469f/

/=======================================*/

 

adobe官方文件:
http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf
这个文件对编程人员很有用。

------------------------------------------

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字节
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表示脚本段。
其它的表示为保留。
----
======================
视频、音频格式及数据内容就不提了,理解为一个FLV文件中有非常多的分成很小很小段的
视频与音频,这样就可以读出一段视频与音频,播放器播放一段。
======================
这里说说onMetaData,这个对我来说有些用。
有些FLV合并器,合并文件时只是单纯的把文件的各tag连到一起,并没有修改MetaData内
的相关信息,有些播放器确是根据MetaData内的相关信息计算总播放时长的,这就导致这些
播放器无法播放由那些FLV合并器合并的文件,所以。
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     对象的数据类型。
数据      *      据体内容按不同类型分别处理。


#####数据类型为:
只标常用类型。
类型 说明 数据类型 占字节说明
0 = Number type DOUBLE   8
1 = Boolean type bool     1
2 = String type 上边已经说明,字节不固定
3 = Object type
4 = MovieClip type
5 = Null type
6 = Undefined type
7 = Reference type
8 = ECMA array type
10 = Strict array type
11 = Date type
12 = Long string type

=========================================
通常读到文件的duration经历类型只有
0 = Number type DOUBLE   8
1 = Boolean type bool     1
2 = String type 上边已经说明,字节不固定
8 = ECMA array type
所以重点理解了这几个类型,其它类型就先不看了,因为暂时还不需要。


注:文件中的数据类型为big-endian byte order,注意自行转换一下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值