用C语言写一个读取wav文件的程序
时间: 2023-07-18 12:32:11 浏览: 67
好的,以下是一个简单的读取wav文件的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char chunk_id[4];
int chunk_size;
char format[4];
} ChunkHeader;
typedef struct {
char subchunk1_id[4];
int subchunk1_size;
short audio_format;
short num_channels;
int sample_rate;
int byte_rate;
short block_align;
short bits_per_sample;
} FormatSubchunk;
typedef struct {
char subchunk2_id[4];
int subchunk2_size;
} DataSubchunk;
int main() {
FILE *wav_file = fopen("test.wav", "rb");
if (!wav_file) {
printf("Failed to open file.\n");
return 1;
}
ChunkHeader chunk_header;
FormatSubchunk format_subchunk;
DataSubchunk data_subchunk;
fread(&chunk_header, sizeof(ChunkHeader), 1, wav_file);
fread(&format_subchunk, sizeof(FormatSubchunk), 1, wav_file);
fread(&data_subchunk, sizeof(DataSubchunk), 1, wav_file);
printf("File format: %s\n", format_subchunk.audio_format == 1 ? "PCM" : "Unknown");
printf("Channels: %d\n", format_subchunk.num_channels);
printf("Sample rate: %d Hz\n", format_subchunk.sample_rate);
printf("Bits per sample: %d\n", format_subchunk.bits_per_sample);
int num_samples = data_subchunk.subchunk2_size / (format_subchunk.bits_per_sample / 8);
short *data = malloc(num_samples * sizeof(short));
fread(data, sizeof(short), num_samples, wav_file);
// Do something with the audio data
fclose(wav_file);
free(data);
return 0;
}
```
这个程序使用了三个结构体来解析wav文件的格式信息:
- `ChunkHeader`:包含了RIFF块的信息,包括块标识符、块大小以及文件格式。
- `FormatSubchunk`:包含了格式子块的信息,包括子块标识符、子块大小、音频格式、声道数、采样率、字节率、块对齐方式以及每个样本的位数。
- `DataSubchunk`:包含了数据子块的信息,包括子块标识符和子块大小。
程序首先打开了一个wav文件,然后读取了三个结构体,分别对应wav文件的三个块。接着,程序输出了一些文件格式的信息,包括音频格式、声道数、采样率和每个样本的位数。最后,程序读取了音频数据并将其存储在一个short类型的数组中,可以在数组中进行进一步的处理。最后,程序关闭文件并释放分配的内存。
请注意,这只是一个简单的示例程序,实际上,解析wav文件需要更多的处理和错误检查。