1. 从零构建WAV文件:揭开计算机文件的本质面纱
第一次看到WAV文件结构时,我被它的简洁震撼到了。作为一个长期沉浸在算法竞赛中的程序员,我过去总是把各种文件格式想象得过于神秘。直到亲手用C++从零构建出一个能播放的WAV文件,才真正理解计算机文件的本质——它们不过是按照特定规则组织的二进制数据而已。
这个认知突破让我想起小时候玩的积木。就像用标准积木块可以搭建出各种建筑,计算机世界中的所有文件也都是由基本的"数据块"按照既定规则拼接而成。WAV文件作为最简单的无损音频格式,是理解这个原理的绝佳案例。
2. WAV文件结构深度解析
2.1 RIFF块:文件的身份证
RIFF块是WAV文件的"门面",它告诉计算机:"嘿,我是一个WAV文件!"这个块的结构非常规范:
c复制struct RIFF_Chunk {
char ChunkID[4]; // 固定为"RIFF"
uint32_t ChunkSize; // 文件总大小-8字节
char Format[4]; // 固定为"WAVE"
};
这里有几个关键细节需要注意:
- ChunkID必须严格4字节,没有终止符。很多新手会犯加'\0'的错误
- ChunkSize计算时要减去ChunkID和ChunkSize自身的8字节
- Format字段必须大写"WAVE",这是微软的规范要求
提示:在写入这些字段时,务必使用memcpy而不是字符串操作,确保字节数精确。
2.2 fmt块:音频的技术参数说明书
fmt块定义了音频的核心参数,相当于产品的"规格书":
c复制struct FMT_Chunk {
char ChunkID[4]; // 固定"fmt "(注意末尾空格)
uint32_t ChunkSize; // PCM格式固定16
uint16_t AudioFormat; // 1表示PCM
uint16_t NumChannels; // 声道数
uint32_t SampleRate; // 采样率(Hz)
uint32_t ByteRate; // 每秒数据量
uint16_t BlockAlign; /
