FLV文件格式(Z)

刚才在看一些关于demux的东西,在处理flv格式的文件的时候,由于自己对flv文件的格式不了解,所以就比较云头转向,正好看到了一篇讲述flv文件格式的文章,写的比较明白,所以就转过来了。O(∩_∩)O~
flv头文件比较简单,由9个字节组成.
0-3:前3个字节是文件格式标识(FLV 464C56).
4-4:第4个字节是版本(0x01)
5-5:第5个字节的前5个bit是保留的必须是0.
         第5个字节的第6个bit音频类型标志(TypeFlagsAudio)
         第5个字节的第7个bit也是保留的必须是0
         第5个字节的第8个bit视频类型标志(TypeFlagsVideo)
6-9:第6-9的四个字节还是保留的.其数据为 00000009 .

文件内容是由4字节的0 开始,它标志着前一个tag的size(因为前一个tag为空,所以size为0).然后就是flv文件内容的第1个tag。tag类型为1个字节,有:8音频;9视频;18(0x12) 脚本数据;其它保留。每种tag有其特定类型。
1:如下图为data tag


data tags被flash player中的NetStream调用.一个meta包的内容由两个amf包组成.第一个(amf类型0x02)是基本上总是由2个字节带字符串长度+ 字符串组成,第二个(amf类型0x08)是由一个数组组成,数组中的各个元素是由不同类型组成。 (The SWF file format uses 8-bit, 16-bit, 32-bit, 64-bit, signed, and unsigned integer types. All integer values are stored in the SWF file by using little-endian byte order.FLV files, unlike SWF files, store multibyte integers in big-endian byte order.)
data tags基本格式:
/*---------------------------
tag类型 0x12
tag大小 3个字节
时间戳 3个字节
时间戳扩展 1个字节
streamid 3个字节 总是0
data tag数据
---------------------*/

data tag数据组成(名字+数据):
/*--------------------------------------
object名字:2个字节名字大小
object数据:
数据类型 1个字节 
   0 = Number type
   1 = Boolean type
   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

数组长度
   If Type = 8, 4个字节的数据大小
  
数据值   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开始
                                    时间偏移 本地的时区和标准时间的分钟的偏移
--------------------------------------------------*/
上图中的数据分析如下:
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类型的数据值

2:如下图为  视频tag
视频 tags基本格式:
/*---------------------------
tag数据大小 3个字节的视频数据大小 
tag时间戳 3个字节tag数据应用的时间(毫秒)
tag时间戳扩展 1个字节的时间戳扩展,让时间戳变成4字节,本字节作为时间戳的高位.
streamID 3个字节的类id,总是0
视频tags的数据
--------------------------------------------*/

视频tags的数据:
/*----------------------------

帧类型 4bit
1: 关键帧keyframe(视频中的关键帧,数据存储的是整个画面完整的数据,可以提取它来生成图片)
2: 中间帧inter frame(关键帧之间的状态,不完整的画面数据,需要依靠前面帧的数据生成)
3: 可任意使用的中间帧disposable inter frame(H.263 only)

视频编码id 4bit
2: Sorenson H.263(mencoder转换所使用的视频编码)
3: Screen video
4: On2 VP6
5: On2 VP6 with alpha channel
6: Screen video version 2

视频数据 
If CodecID = 2
H263VIDEOPACKET
If CodecID = 3
SCREENVIDEOPACKET
If CodecID = 4
VP6FLVVIDEOPACKET
If CodecID = 5
VP6FLVALPHAVIDEOPAC
KET
If CodecID = 6
SCREENV2VIDEOPACKET

3:如下图为 音频tag
音频tags基本格式:
/*---------------------------
tag数据大小 3个字节的音频数据大小 
tag时间戳 3个字节tag数据应用的时间(毫秒)
tag时间戳扩展 1个字节的时间戳扩展,让时间戳变成4字节,本字节作为时间戳的高位.
streamID 3个字节的类id,总是0
//-----------------------------------------------------------------------------------------------------------
音频tags的数据:
音频格式的数据的组成如下:
音频格式 4bit 0是未压缩的,1是ADPCM,2是mp3,5是Nellymoser 8kHz,6是Nellymoser.
音频率 2bit 0 = 5.5 kHz
   1 = 11 kHz
   2 = 22 kHz
   3 = 44 kHz
音频大小 1bit 0 = snd8Bit
   1 = snd16Bit
音频类型 1bit 0 = sndMono
   1 = sndStereo
音频数据 1个字节的音频数据大小,不同的音频数据格式

Nellymoser 8kHz 是一个特殊的类型—8kHz取样率在其它格式中不被支持.当音频的格式是Nellymoser 8kHz mono的时候,声音率和声音类型被忽略了. 对于其它的 Nellymoser取样率,音频格式和音频率照常.
参考资料:
flv文件格式解读: www.roading.net/blog/post_102.html
flv相关资源: blog.csdn.net/everlastinging/archive/2007/12/15/1939117.aspx
SWF and FLV File Format Specification License Agreement(flv格式文档下载): www.adobe.com/licensing/developer/fileformat/license/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值