wav文件 格式详解
### Wav 文件格式详解 #### 一、综述 WAV (Waveform Audio File Format) 是一种用于存储音频数据的标准格式之一,广泛应用于各种多媒体应用之中。它是一种无损压缩的音频格式,能够保留原始音频的所有细节。WAV 文件遵循 RIFF (Resource Interchange File Format) 规范进行构建,这使得它可以兼容多种操作系统和软件。 RIFF 是一种通用容器格式,用来封装不同的媒体数据类型,如音频、视频等。在 WAV 文件中,RIFF 容器包含了所有必要的元数据和音频数据。一个典型的 WAV 文件由以下部分组成: 1. **RIFF WAVE Chunk** 2. **Format Chunk** 3. **Fact Chunk** (可选) 4. **Data Chunk** #### 二、RIFF WAVE Chunk RIFF WAVE Chunk 位于 WAV 文件的开头,它标识了文件的整体结构,并且指明了这是一个符合 RIFF 规范的 WAV 文件。该 Chunk 包含以下字段: - **ID**: 固定值 "RIFF",用以标识 Chunk 类型。 - **Size**: 表示 Chunk 的大小,不包括 ID 和 Size 字段本身所占的字节数。计算方法为整个 WAV 文件的长度减去 8 字节。 - **Type**: 固定值 "WAVE",表明这是一个 WAV 文件。 结构体定义如下所示: ```c struct RIFF_HEADER { char szRiffID[4]; // 'R', 'I', 'F', 'F' DWORD dwRiffSize; char szRiffFormat[4]; // 'W', 'A', 'V', 'E' }; ``` #### 三、Format Chunk Format Chunk 用于描述音频的基本属性,包括采样率、通道数等信息。该 Chunk 的结构如下: 1. **ID**: 固定值 "fmt ",表示这是一个格式描述块。 2. **Size**: 常见的数值为 16 或 18,如果为 18,则包含额外的信息。 3. **Format Tag**: 指定编码方式,通常为 0x0001,代表 PCM 编码。 4. **Channels**: 通道数,例如 1 表示单声道,2 表示立体声。 5. **Samples Per Sec**: 采样频率,单位为 Hz,常见的值有 44100Hz、48000Hz 等。 6. **Avg Bytes Per Sec**: 每秒平均字节数,计算公式为 `SamplesPerSec * NumChannels * BitsPerSample / 8`。 7. **Block Align**: 块对齐,即每个采样帧的字节数,计算公式为 `NumChannels * BitsPerSample / 8`。 8. **Bits Per Sample**: 每个样本的位数,常见值有 8 位、16 位等。 结构体定义如下: ```c struct FORMAT_CHUNK { char szFmtID[4]; // 'f', 'm', 't', ' ' DWORD dwFmtSize; WORD wFormatTag; // 编码方式 WORD wChannels; // 声道数 DWORD dwSamplesPerSec; // 采样频率 DWORD dwAvgBytesPerSec; // 平均每秒字节数 WORD wBlockAlign; // 块对齐 WORD wBitsPerSample; // 每个样本的位数 }; ``` #### 四、Fact Chunk (可选) Fact Chunk 不是必须存在的,但如果存在的话,它通常只包含一个字段:**Sample Length**。这个字段用于指定 Data Chunk 中样本的数量。在某些情况下,这个信息对于播放或编辑软件来说非常有用。Fact Chunk 的结构如下: 1. **ID**: 固定值 "fact"。 2. **Size**: 总是 4 字节。 3. **Sample Length**: 数据块中的样本数量。 #### 五、Data Chunk Data Chunk 包含了实际的音频数据。它的结构相对简单: 1. **ID**: 固定值 "data"。 2. **Size**: 数据块的实际大小。 3. **Audio Data**: 音频数据。 #### 六、C语言编程读写 WAV 文件 在 C 语言中读写 WAV 文件主要涉及对上述结构体的操作。编写程序时,首先需要解析 WAV 文件的头部信息,确定音频的基本参数,然后根据这些信息读取或写入音频数据。 读取 WAV 文件的步骤大致如下: 1. 打开 WAV 文件。 2. 读取 RIFF Header,获取文件大小和类型。 3. 读取 Format Chunk,获取音频参数。 4. 如果存在 Fact Chunk,读取其内容。 5. 读取 Data Chunk,获取音频数据。 写入 WAV 文件的步骤与之类似,但顺序相反,即先写入头部信息再写入数据。 通过以上介绍,我们可以了解到 WAV 文件格式的基本结构及其如何被 C 语言程序所处理。这对于从事音频开发工作的工程师来说是非常有用的。理解 WAV 文件的内部结构有助于更好地控制和优化音频处理流程,提高开发效率。
- zyfyytt2011-11-07没什么实际用处,初学者可以看看,没有坏处
- 小Wai2012-09-24没什么实际用处,初学者可以看看,没有坏处
- 琅嬛2012-12-07只有介绍 没有源代码
- moondarkness2012-04-10好像说了挺多,不过都是百度之后百科最基本的那些知识,所以也仅供初学者看看罢了。
- jermy5532014-05-08是一些基本的介绍
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- LABVIEW程序实例-打开写字板.zip
- LABVIEW程序实例-代码连线.zip
- LABVIEW程序实例-读取电子表格文件.zip
- LABVIEW程序实例-读取波形文件.zip
- LABVIEW程序实例-调整图标大小.zip
- LABVIEW程序实例-读取数据记录文件.zip
- LABVIEW程序实例-读取二维数组二进制文件.zip
- LABVIEW程序实例-读取图像文件.zip
- LABVIEW程序实例-读取文本文件.zip
- LABVIEW程序实例-对象排列.zip
- LABVIEW程序实例-仿真容器.zip
- LABVIEW程序实例-高层函数保存二进制文件.zip
- LABVIEW程序实例-分配快捷键.zip
- LABVIEW程序实例-高层函数保存电子表格文件.zip
- LABVIEW程序实例-公式节点.zip
- LABVIEW程序实例-高层函数保存文本文件.zip