刚才在看一些关于demux的东西,在处理flv格式的文件的时候,由于自己对flv文件的格式不了解,所以就比较云头转向,正好看到了一篇讲述flv文件格式的文章,写的比较明白,所以就转过来了。O(∩_∩)O~
flv头文件比较简单,由9个字节组成.
flv头文件比较简单,由9个字节组成.
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/