AVI(Audio/Video Interleaved)文件是MS-Windows的视频文件,其文件扩展名为“.AVI”。它一般由三部分构成:信息区、数据区和索引区(可缺省),即两个LIST快和一个idx1块。这些区域,通常由一些子块组成,它们多用于为播放软件提供更为系统的数据信息;或为播放时进行快速数据定位及播放,并提供详细资料和识别手段(关于“区域”与“子块”具体包容关系请见图6)。
说明:本例由“四部分”构成,即在两个LIST块中间夹了个JUNK块。这个JUNK块纯属人为添加的自定义块,即在AVI文件中从未有对此块的定义。换句话说,我们也可以添加自己的决,只要遵循如下原则:在这三个标准块其中的某个后面,定义一个四字节的块识别码(不要与本文用到的识别码相同,最好字母用大写),紧跟一个长整数来表示你自定义的块的大小,随后便可以在定义的大小范围内写入你想表述的信息。同样,在这三个标准块的内部,也可以用上述方法添加自定义干块。
注:下文的说明内容部分取自华中理工大学出版的<>一文和<>的HELP文件。
以下就是作为例子的文件内容(数据D)及AVI文件标准结构图。
1.从(00000000-000007F3)为一个WindowsAVI文件的信息区部分。
它是文件的第一个LIST块。在它的内部记录着整个文件的系统构成,如告诉播放软件“我是一个AVI文件”;“在我的体内有几个数据流”;“每个数据流包含着什么数据类型——图像、声音或其他”;“如果是图像数据流,那么它的大小、颜色、压缩方式、播放速度等,等是怎样规定的”;“如果是声音数据流,那么它的压缩方式、播放效果等等又将有何规定”......在信息区中还有多个附属的LIST块,也就是我们前面提到的“子块”,它们用来记录每个数据流的全部信息。而这些附间LIST块与数据流之间保持着—一对应的关系,即
第一个附属LIST块对应于00号数据流;第二个附属LIST块对应于01号数据流......要想解释数据流,我们必须先了解AVI文件中数据块是什么。在AVI文件中,数据块是被放置在数据区中的一个有起始标志(由“数据流识别码”和“数据块存储方式识别码"组成,请参见对数据区部分的说明),并指明大小和数据内容的数据段.那么,数据流就是那些相互之间具有联系的同种数据类型的数据块集合.
00000000-00000003 多媒体文件识别码:RIFF
00000004-00000007 文件大小(10EDICh字节)-8字节
00000008-0000000B AVI文件识别码
0000000C-0000000F 第一个LIST块识别码
00000010-00000013 第一个LIST块的大小(168h字节)
00000014-00000017 hdrl部分识别码,以下数据记录着此文件的格式
00000018-0000001B hdrl部分所包含的avih块识别码,此模块记录着本文件的初始化信息
0000001C-0000001F avih块大小(38h字节)
00000020-00000023 每帧画面显示所维持多少个百万分之一秒,本例为1046Bh,即66667百万分之一秒,约0.07秒。所以在播放此文件时,你看到的画面约每秒15帧
AMV文件格式分析(原创)
AMV文件格式分析(原创)
由于MP3播放器生产厂商广泛采用炬力2085方案,因此市面上视频MP3播放器普及率已经很高了。采用2085的视频MP3,其视频格式是AMV。这种格式在网络上找不到任何资料,估计可能是炬力公司自行设计的,不愿公开,只能自行分析其文件格式了。
1.测试文件的特性。
选择一个AMV文件为测试文件,使用AMV文件播放器察看文件属性,该文件每视频秒钟12帧,视频大小是128 ╳ 96。音频采样率:22050,单声道,播放时间 2分58秒。
2.文件头的分析
看到“RIFF....AMV LIST”了吗,是不是觉得很眼熟啊,和AVI文件很相似的,是不是采用RIFF文件格式的AVI文件?
先让我们了解一下RIFF文件格式,RIFF文件使用四字符码FOURCC(four-character code)来表征数据类型,比如'RIFF'、'AVI'、'LIST'等。最开始的4个字节是一个四字符码'RIFF',表示这是一个RIFF文件;紧跟着后面用4个字节表示此RIFF文件的大小;然后又是一个四字符码说明文件的具体类型(比如AVI、WAVE等);最后就是实际的数据。不过AMV文件将文件长度信息忽略了,在AMV文件里表示文件长度的4字节数据都是0。
AVI文件类型用一个四字符码'AVI'来表示。整个AVI文件的结构为:一个RIFF头 + 两个列表(一个用于描述媒体流格式,一个用于保存媒体流数据) + 一个可选的索引块。普通AVI文件(一视频流、一音频流)的展开结构如下:
RIFF('AVI '
LIST(
'hdrl'
'avih'(AVI信息数据)
LIST(
'strl'(视频流)
'strh'(流信息数据)
'strf'(流格式数据)
'strd'(扩展流信息,可选)
'strn'(流名称,可选)
)
LIST(
'strl'(音频流)
'strh'(流信息数据)
'strf'(流格式数据)
'strd'(扩展流信息,可选)
'strn'(流名称,可选)
)
)
LIST(
'movi'(流数据块)
.
.
.
)
['idxl'](索引块数据,可选)
)
其中流数据块使用了一个四字符码来表征它的类型,这个四字符码由2个字节的流编号和2个字节的类型码组成。标准的类型码定义如下:'db'(非压缩视频帧)、'dc'(压缩视频帧)、'pc'(改用新的调色板)、'wb'(音频)。
可见AMV文件格式和AVI是基本类同的。
RIFF ('AMV'...)标示AMV文件类型。然后就是第一个列表-'hdrl'列表,用于描述文件中流的格式信息。'hdrl'列表嵌套了一系列块和子列表——首先是一个'amvh'块,用于记录文件的全局信息,比如流的数量、视频图像的宽和高等,其数据结构基本仿照AVIMAINHEADER结构,可归纳如下:
typedef struct _amvmainheader {
FOURCC fcc; // 必须为‘amvh’
DWORD cb; // 本数据结构的大小,不包括最初的8个字节
DWORD dwMicroSecPerFrame;// 视频帧间隔时间(以微秒为单位)
BYTE reserve[28];//初步分析,这28个字节作为备用,全部为零。
DWORD?dwWidth;// 视频图像的宽(以像素为单位)
DWORD?dwHeight; // 视频图像的高(以像素为单位)
DWORD?dwSpeed; // 帧速度 /(帧/秒)
DWORD reserve0; //值等于1,用途还不清楚
DWORD reserve1; //值等于0,用途还不清楚
BYTE dwTimeSec; //总时间(秒)
BYTE dwTimeMin; //总时间(分)
WORD dwTimeHour;//总时间 (小时)
} AMVMAINHEADER;
下一个LIST存储视频流信息,包含一个'strl'子列表,'strl'子列表至少包含一个'strh'块和一个'strf'块,'strh'块的数据结构基本仿照AVISTREAMHEADER结构,可归纳如下:
typedef struct _amvstreamheader {
FOURCC fcc; // 必须为'strh'
DWORD cb; //本数据结构的大小,不包括最初的8个字节
BYTE reserve[56];//初步分析,这28个字节作为备用,全部为零。
} AMVSTREAMHEADER;
'strf'块的数据结构基本上没有使用,除了'strf'标示和结构长度以外,全部为零。这和普通的AVI文件的区别在于普通的AVI文件此处应该是一个BITMAPINFO结构。
下一个LIST存储音频流信息,包含一个'strl'子列表,'strl'子列表至少包含一个'strh'块和一个'strf'块,'strh'块的数据结构也是AMVSTREAMHEADER
'strf'块的数据结构和普通的AVI文件相同,此处是一WAVEFORMATEX数据结构。
typedef struct {
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
3.流数据的分析
下一个LIST存储流数据,格式和AVI文件基本相同,其中视频数据的四字符码为'00dc',音频数据的四字符码为'01wb'。
统计一下测试文件中视频流的块,共2124块,而测试文件的帧速是每秒钟12帧,播放时间 2分58秒,总共应该有2136帧,基本上等于视频流的块数,考虑2085的处理能力,估计对于视频压缩只是进行了帧内编码,没有进行帧间编码,每个视频流的块对应一帧数据。
观察一下视频数据块,所有的块都是以'FF D8'开始,以'FF D9'结束。这不就是JPEG文件的格式吗,不过去处了DQT,SOF,SOS等标记码段,只保留了压缩数据。
统计一下测试文件中音频流的块,也是2124块,每块大小都是927字节。所以音频数据全长为:1968948字节。而测试文件的音频采样率:22050,单声道,播放时间 2分58秒,如果按16位量化精度计算,压缩前数据长度应该是3924900。压缩后的数据大约是原始数据的1/4。符合这个特征的压缩算法就是IMA-ADPCM了。
4.总结:AMV文件格式就是一个简化了的RIFF文件,视频处理方式是单帧JPEG压缩,存储时只存储压缩数据。音频采用IMA-ADPCM压缩