Chinaunix首页 | 论坛 | 博客
  • 博客访问: 700807
  • 博文数量: 112
  • 博客积分: 2486
  • 博客等级: 大尉
  • 技术积分: 1541
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-14 18:30
文章分类

全部博文(112)

文章存档

2012年(5)

2011年(48)

2010年(26)

2009年(33)

我的朋友

分类: LINUX

2011-05-12 23:42:44

一 .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数据[n]
  If Type = 4, SCRIPTDATASTRING 定义MovieClip的路径
  If Type = 7, UI16
  If Type = 8,数据变量[ECMAArrayLength] 变量的结束标志是000009
  If Type = 10,数据变量[n]
  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
所以重点理解了这几个类型,其它类型就先不看了,因为暂时还不需要。

这是一个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

阅读(1550) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~