#include <iostream>
#include <fstream>
#include <vector>
#include <cstdint>
#pragma pack(push, 1) // 对齐结构体
struct WAVHeader {
char riff[4]; // "RIFF"
uint32_t overall_size; // 文件总大小
char wave[4]; // "WAVE"
char fmt[4]; // "fmt "
uint32_t fmt_chunk_size; // fmt 块大小
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; // 每个样本的位数
char data[4]; // "data"
uint32_t data_size; // 数据大小
};
#pragma pack(pop)
void wavToPcm(const std::string& wavFilePath, const std::string& pcmFilePath) {
std::ifstream wavFile(wavFilePath, std::ios::binary);
if (!wavFile) {
std::cerr << "无法打开WAV文件!" << std::endl;
return;
}
WAVHeader header;
wavFile.read(reinterpret_cast<char*>(&header), sizeof(header));
if (header.audio_format != 1) { // 确保是 PCM 格式
std::cerr << "非 PCM 格式的WAV文件!" << std::endl;
return;
}
std::vector<int16_t> pcmData(header.data_size / sizeof(int16_t)); // PCM 数据
wavFile.read(reinterpret_cast<char*>(pcmData.data()), header.data_size);
wavFile.close();
// 写入 PCM 文件
std::ofstream pcmFile(pcmFilePath, std::ios::binary);
if (!pcmFile) {
std::cerr << "无法创建PCM文件!" << std::endl;
return;
}
pcmFile.write(reinterpret_cast<char*>(pcmData.data()), header.data_size);
pcmFile.close();
std::cout << "转换成功!PCM 文件:" << pcmFilePath << std::endl;
}
int main() {
std::string wavFilePath = "input.wav"; // 输入 WAV 文件路径
std::string pcmFilePath = "output.pcm"; // 输出 PCM 文件路径
wavToPcm(wavFilePath, pcmFilePath);
return 0;
}
【开源项目】C++ WAV转PCM
最新推荐文章于 2025-06-24 09:49:04 发布