c语言读取wav音频文件输出浮点内容
时间: 2023-12-08 08:55:01 浏览: 24
读取 WAV 音频文件需要用到文件操作及 WAV 文件格式处理,可以使用 C 语言中的标准库函数和结构体来实现。以下是读取 WAV 文件中浮点数内容的伪代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define SAMPLE_RATE 44100
#define NUM_CHANNELS 2
#pragma pack(push, 1) //保证结构体按照字节对齐
struct WAVHeader {
// RIFF chunk
uint32_t chunkID;
uint32_t chunkSize; // 文件大小减去 8 字节
uint32_t format;
// fmt sub-chunk
uint32_t subchunk1ID;
uint32_t subchunk1Size;
uint16_t audioFormat;
uint16_t numChannels;
uint32_t sampleRate;
uint32_t byteRate;
uint16_t blockAlign;
uint16_t bitsPerSample;
// data sub-chunk
uint32_t subchunk2ID;
uint32_t subchunk2Size;
};
#pragma pack(pop)
int main(int argc, char *argv[]) {
FILE* sourceFile; // 声明文件指针
struct WAVHeader header; // 声明 WAV 文件头
// 读入 WAV 文件
sourceFile = fopen("input.wav", "rb");
fread(&header, sizeof(header), 1, sourceFile);
// 输出文件信息
printf("Sample rate: %u Hz\n", header.sampleRate);
printf("Channels: %u\n", header.numChannels);
printf("Bits per sample: %u\n", header.bitsPerSample);
// 计算采样数据长度
uint32_t sampleSize = header.bitsPerSample / 8;
uint32_t numSamples = header.subchunk2Size / sampleSize;
uint32_t byteOffset = ftell(sourceFile); // 记录当前文件指针位置
// 读入采样数据并输出
for (uint32_t i = 0; i < numSamples; i++) {
float value = 0.0f;
fread(&value, sizeof(float), 1, sourceFile);
printf("%f\n", value);
}
// 关闭文件指针
fclose(sourceFile);
return 0;
}
```
该程序首先定义了 WAV 文件头的结构体,通过文件指针读取 WAV 文件头信息。然后计算采样数据长度和数量,使用文件指针读取采样数据,并输出每个采样的浮点值。