在 C++ 中加载 Wav 文件

问题描述 投票:0回答:1

我正在尝试将 wav 文件加载到 C++ 应用程序中 这就是我目前的代码中的内容

WAV_Decoder类负责加载到文件中然后进行处理 WAV 标头,然后将文件存储到一个数组中,稍后我可以在应用程序中使用该数组,但问题是 WAV 文件被处理为无效格式 即使 WAV 文件没有损坏并且可以在我的设备上使用媒体播放器流畅播放

WAV_解码器.hpp

#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;
};

WAV_解码器.cpp

#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;
}

主.cpp

#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;
}

我不断让程序打印“无效的 Wav 文件”退出代码 5;

我该如何修复它?

c++ std wav
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.