c语言读取wav音频文件输出浮点内容
时间: 2023-12-08 13:55:01 浏览: 263
好的,可以使用C语言中的库函数来读取WAV音频文件,并且获取其中的浮点数值。具体步骤如下:
1. 打开WAV文件,可以使用标准IO库中的fopen函数,以"rb"模式打开二进制文件。
2. 读取WAV文件头信息,其中包含有采样率、声道数、每个样本的位数等信息。
3. 根据采样率和位数计算出每个采样值的字节数,在读取每个采样值时,需要按照这个字节数来读取。
4. 将每个采样值转换为浮点数,这可以使用float类型变量来存储,根据每个样本的位数(如16位),将其转换为-1到1之间的浮点数。
5. 输出每个浮点数,可以使用printf函数在控制台输出,或者使用fwrite函数将浮点数写入新的文件中。
下面是一个读取WAV音频文件并输出浮点数的示例代码:
```
#include <stdio.h>
#include <stdint.h>
typedef struct {
uint32_t chunk_id;
uint32_t chunk_size;
uint32_t format;
} wav_header_t;
typedef struct {
uint32_t subchunk_id;
uint32_t subchunk_size;
uint16_t audio_format;
uint16_t num_channels;
uint32_t sample_rate;
uint32_t byte_rate;
uint16_t block_align;
uint16_t bits_per_sample;
} wav_format_t;
void print_wav_info(wav_header_t* header, wav_format_t* format) {
printf("Sample rate: %d Hz\n", format->sample_rate);
printf("Channels: %d\n", format->num_channels);
printf("Bits per sample: %d\n", format->bits_per_sample);
}
int main(int argc, char** argv) {
if (argc < 2) {
printf("Usage: %s <wav file>\n", argv[0]);
return 1;
}
char* filename = argv[1];
FILE* fp = fopen(filename, "rb");
if (!fp) {
printf("can't open file %s\n", filename);
return 1;
}
wav_header_t header;
fread(&header, sizeof(header), 1, fp);
if (header.chunk_id != 0x46464952 || header.format != 0x45564157) {
printf("Not a WAV file\n");
return 1;
}
wav_format_t format;
fread(&format, sizeof(format), 1, fp);
if (format.subchunk_id != 0x20746D66 || format.audio_format != 1) {
printf("Invalid format\n");
return 1;
}
print_wav_info(&header, &format);
// read data chunk
uint32_t data_id;
fread(&data_id, sizeof(data_id), 1, fp);
while (data_id != 0x61746164) { // find data chunk
uint32_t data_size;
fread(&data_size, sizeof(data_size), 1, fp);
fseek(fp, data_size, SEEK_CUR);
fread(&data_id, sizeof(data_id), 1, fp);
}
uint32_t data_size;
fread(&data_size, sizeof(data_size), 1, fp);
uint32_t num_samples = data_size / (format.bits_per_sample / 8) / format.num_channels;
printf("Num samples: %d\n", num_samples);
for (uint32_t i = 0; i < num_samples; i++) {
int16_t sample[2];
fread(sample, sizeof(sample), 1, fp);
float left = (float)sample[0] / 32768;
float right = (float)sample[1] / 32768;
printf("%f %f\n", left, right);
}
fclose(fp);
return 0;
}
```
注意:这段代码仅仅适用于读取采样位数为16,并且音频文件中只有两个声道的情况,如果需要读取其他格式的音频文件,需要自行修改代码。同时,该段代码不保证完全正确,仅仅作为参考。
阅读全文