AVI文件格式简介与WAV文件分析
AVI文件格式(回答问题)
所有AVI文件至少包含2个必须的LIST Chunk和一个索引Chunk
Chunk:
LIST Chunk:
小端:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
打开一个本地的avi文件如下:
元数据:
实际数据:
问题一
第一个hdrl list描述视频,故音频用01wb表示,视频用00dc或00db
01wb代表一个音频数据块wave:
一个视频数据块00dc(压缩后的)
又一个音频数据块:
由上可见avi文件中音频和视频数据是交织放置的。
问题二
一个视频数据块:
大小为00 01 D4 C0,即120000个字节
又一个视频数据块:
大小为0,即0字节
又一个视频数据块:
大小为00 03 AB 21,即240471个字节
由上可知,AVI文件的视频数据块大小各不相同
一个音频数据块:
大小为00 00 19 04
又一个音频数据块:
大小为00 00 19 04
查找后发现音频数据块均为此大小
参考本文使用avi文件解析器的结果:
发现avi文件的确视频帧大小不同,音频数据块大小相同
WAV文件分析
概述
WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几! WAV打开工具是WINDOWS的媒体播放器。
不对原有文件压缩,在音质方面无失真情况,但是文件的体积较大。
文件结构
WAV文件是属于RIFF结构形式的文件,这种结构是一种树状结构,其最基本的组成单元是chunk(块),而每一个chunk则由辨识码,数据大小,以及数据本身组成(各4字节),其中辨识码就是RIFF四个字母的ASCII码,用十六进制表示就是52 49 46 46;辨识码之后的四个字节,表示除去文件辨识码和它自己之后剩余文件的大小,最后就是文件的数据本身了。
而WAV格式的文件除了前面的文件头之后,还包含两个子块,如下所示:
其中fmt子块主要用于描述该wav文件的信息,例如,采样率,数据量,编码格式,声道数等,其结构也如RIFF,最开始4个字节表示标识符“fmt”,接着四个字符表示该块大小,后面的18个字节则表示文件的信息,同样,也是fmt子块的“数据”;
这里的fact子块并不是必须的,在标准的WAV文件中没有该子块,只有一些软件转化而来的才会增加该子块,其主要存储关于该文件内容的重要信息;data块则主要就是WAV文件真正能播放的声音数据部分了。
RIFF Chunk标识块
52 49 46 46,即RIFF标识,其后4个字节为46 C0 06 00,说明WAV大小为442438字节(最小端存储)。
57 41 56 45,即WAVE对应的ASCII码
结构体表示为:
struct RIFF_HEADER
{
char szRiffID[4]; // 'R','I','F','F'
DWORD dwRiffSize;
char szRiffFormat[4]; // 'W','A','V','E'
};
fmt文件信息块
名称 | 字节数 | 说明 |
---|---|---|
格式块标识 | 4字节 | 小写字符串“fmt ” |
格式块长度 | 4字节 | 格式块长度取决于编码形式(参见编码形式表) |
编码格式代码 | 2字节 | 常见的 WAV 文件使用 PCM 脉冲编码调制格式,该数值通常为 1。(参见编码形式表) |
声道个数 | 2字节 | 单声道为 1,立体声或双声道为 2 |
采样频率 | 4字节 | 每个声道单位时间采样次数。常用的采样频率有 11025, 22050 和 44100 Hz。 |
数据传输速率 | 4字节 | 声道数×采样频率×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。 |
数据块对其单位 | 2字节 | 采样帧大小。该数值为:声道数×位数/8。播放软件需要一次处理多个该值大小的字节数据,用该数值调整缓冲区。 |
采样位数 | 2字节 | 存储每个采样值所用的二进制数位数。常见的位数有 4、8、12、16、24、32 |
蓝:标识符”fmt“,66 6D 74 20是fmt对应的ASII码
粉:fmt数据块长度
黄:fmt数据块内容
-
00 01表示该数据以PCM方式编码
-
00 02表示该文件为双声道文件
-
00 00 BB 80表示采样频率为48000Hz
-
00 02 EE 00表示数据传输速率为192000bps
-
00 04表示采样帧大小为一次处理一帧4字节
-
00 10表示每个采样值所用二进制位数为16,高八位左声道,低八位右声道
-
49 4C表示附加信息
结构体为:
struct WAVE_FORMAT { WORD wFormatTag; WORD wChannels; DWORD dwSamplesPerSec; DWORD dwAvgBytesPerSec; WORD wBlockAlign; WORD wBitsPerSample; }; struct FMT_BLOCK { TCHAR szFmtID[4]; //'f','m','t',' ' please note the // space character at the fourth location. DWORD dwFmtSize; WAVE_FORMAT wavFormat; };
data数据块
名称 | 字节数 | 说明 |
---|---|---|
格式块标识 | 4字节 | 标识data块 |
格式块长度 | 4字节 | 表明数据块的长度 |
数据 | N字节 | 表示音频数据 |
多声道文件样本在数据中交替出现,本例中,每个采样值所用二进制位数为16,高八位左声道,低八位右声道
粉:64 64 74 61为data标识符,标识data的ASCII码
绿:data数据块长度00 06 C0 00,即442368字节
结构体为:
struct DATA_BLOCK
{
char szDataID[4]; // 'd','a','t','a'
DWORD dwDataSize;
};
参考文献
- wav文件分析 https://zhuanlan.zhihu.com/p/45518641
- avi文件详解 https://blog.csdn.net/intel1985/article/details/114284756
- wav文件格式分析 https://www.cnblogs.com/ranson7zop/p/7657874.html
## 参考文献
1. wav文件分析 https://zhuanlan.zhihu.com/p/45518641
2. avi文件详解 https://blog.csdn.net/intel1985/article/details/114284756
3. wav文件格式分析 https://www.cnblogs.com/ranson7zop/p/7657874.html