我正在尝试将 wav 文件加载到 C++ 应用程序中
我不断让程序打印
Invalid Wav File
,退出代码为 5。这意味着程序认为 chunkID 不匹配 WAVE
或 RIFF
。
我该如何修复它?
这就是我目前的代码中的内容
WAV_Decoder类负责加载到文件中然后进行处理 WAV 标头,然后将文件存储到一个数组中,稍后我可以在应用程序中使用该数组,但问题是 WAV 文件被处理为无效格式 即使 WAV 文件没有损坏并且可以在我的设备上使用媒体播放器流畅播放
#pragma once
struct WAV_Header
{
char chunkID[4];
uint32_t chunkSize;
char format[4];
char subchunk1ID[4];
uint32_t subchunk1Size;
uint16_t audioFormat;
uint16_t numChannels;
uint32_t sampleRate;
uint32_t byteRate;
uint16_t blockAlign;
uint16_t bitsPerSample;
char subchunk2ID[4];
uint32_t subchunk2Size;
};
class WAV_Decoder
{
private:
public:
WAV_Decoder() = default;
void LoadWav(std::string filename);
std::vector<char>& getAudioBuffer();
private:
std::vector<char> audio_buffer;
WAV_Header wav_header;
};
#include <iostream>
#include <fstream>
#include <vector>
#include "TTS/WAV_Decoder.hpp"
void WAV_Decoder::LoadWav(std::string filename)
{
std::ifstream file(filename.c_str(), std::ios::binary);
if (!file)
{
std::cerr << "Failed to load WAV file :*(\n";
exit(4);
}
file.read(reinterpret_cast<char*>(&wav_header), sizeof(wav_header));
std::cout << std::string(wav_header.chunkID, 4) << '\n';
if (std::string(wav_header.chunkID, 4) != "RIFF" || std::string(wav_header.format, 4) != "WAVE")
{
std::cerr << "Invalid Wav File\n";
exit(5);
}
audio_buffer.resize(wav_header.subchunk2Size);
file.read(audio_buffer.data(), wav_header.subchunk2Size);
file.close();
}
std::vector<char>& WAV_Decoder::getAudioBuffer()
{
return audio_buffer;
}
#include <iostream>
#include <vector>
#include <WinSock2.h>
#include <ws2tcpip.h>
#include "TTS/WAV_Decoder.hpp"
int main()
{
WAV_Decoder test_decoder;
std::cout << test_decoder.getAudioBuffer().size();
test_decoder.LoadWav("D:/Absolute/File/Path/out.wav");
std::cout << test_decoder.getAudioBuffer().size();
return 0;
}
这段代码可能不是你想要做的。
if (std::string(wav_header.chunkID, 4) != "RIFF" || std::string(wav_header.format, 4) != "WAVE")
{
std::cerr << "Invalid Wav File\n";
exit(5);
}
假设
chunkID
实际上是 RIFF
。好吧,那么RIFF != WAVE
就是真的。对称地,如果 chunkID
是 WAVE
。
因此,无论您对
chunkID
有什么值,这个 if
表达式都将是 true
。
好的情况是当
chunkID
是 RIFF
或 WAVE
时。所以你想要否定它。
cid = std::string(wav_header.chunkID, 4);
if (!(cid == "RIFF" || cid == "WAVE")) { ... }
或者您可以将语句中的
||
更改为 &&
。
cid = std::string(wav_header.chunkID, 4);
if (cid != "RIFF" && cid != "WAVE") { ... }