Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 加载和保存WAV文件_C++_Audio_Wave - Fatal编程技术网

C++ 加载和保存WAV文件

C++ 加载和保存WAV文件,c++,audio,wave,C++,Audio,Wave,我试图将一个WAVE文件加载到数据结构中,然后将其作为原始文件的副本保存回磁盘。加载和保存似乎工作正常,但复制的WAVE文件不会播放任何声音(尽管它打开时没有错误)。我想知道这是否与endian ness有关 这是我保存WAVE文件的数据结构: struct WaveFile { public: static const uint16 NUM_CHARS = 4; public: WaveFile() : Data(nullptr) {} ~WaveFile()

我试图将一个WAVE文件加载到数据结构中,然后将其作为原始文件的副本保存回磁盘。加载和保存似乎工作正常,但复制的WAVE文件不会播放任何声音(尽管它打开时没有错误)。我想知道这是否与endian ness有关

这是我保存WAVE文件的数据结构:

struct WaveFile
{
public:

    static const uint16 NUM_CHARS = 4;

public:

    WaveFile() : Data(nullptr) {}

    ~WaveFile() { delete[] Data; }

    char ChunkID[NUM_CHARS];

    uint32 ChunkSize;

    char Format[NUM_CHARS];

    char SubChunkID[NUM_CHARS];

    uint32 SubChunkSize;

    uint16 AudioFormat;

    uint16 NumChannels;

    uint32 SampleRate;

    uint32 ByteRate;

    uint16 BlockAlign;

    uint16 BitsPerSample;

    char SubChunk2ID[NUM_CHARS];

    uint32 SubChunk2Size;

    byte* Data; 
};
这是我加载它的方式:

std::ifstream file(filename, std::ios::binary);

if (file.good())
{
    file.read(waveFile.ChunkID, WaveFile::NUM_CHARS);
    file.read(reinterpret_cast<char*>(&waveFile.ChunkSize), size_ui32);
    file.read(waveFile.Format, WaveFile::NUM_CHARS);
    file.read(waveFile.SubChunkID, WaveFile::NUM_CHARS);
    file.read(reinterpret_cast<char*>(&waveFile.SubChunkSize), size_ui32);
    file.read(reinterpret_cast<char*>(&waveFile.AudioFormat), size_ui16);
    file.read(reinterpret_cast<char*>(&waveFile.NumChannels), size_ui16);
    file.read(reinterpret_cast<char*>(&waveFile.SampleRate), size_ui32);
    file.read(reinterpret_cast<char*>(&waveFile.ByteRate), size_ui32);
    file.read(reinterpret_cast<char*>(&waveFile.BlockAlign), size_ui16);
    file.read(reinterpret_cast<char*>(&waveFile.BitsPerSample), size_ui16);
    file.read(waveFile.SubChunk2ID, WaveFile::NUM_CHARS);
    file.read(reinterpret_cast<char*>(&waveFile.SubChunk2Size), size_ui32);
    waveFile.Data = new byte[waveFile.SubChunk2Size];
    file.read(reinterpret_cast<char*>(waveFile.Data), sizeof(waveFile.SubChunk2Size));
    file.close();
}
没关系,我好像找不出我哪里出了问题


为任何帮助干杯。

发布此问题后,我刚刚发现问题所在

在读取中的数据时,我已执行以下操作:

file.read(reinterpret_cast<char*>(waveFile.Data), sizeof(waveFile.SubChunk2Size));
file.read(重新解释cast(waveFile.Data)、sizeof(waveFile.SubChunk2Size));
应该是:

file.read(reinterpret_cast<char*>(waveFile.Data), waveFile.SubChunk2Size);  
file.read(重新解释转换(waveFile.Data)、waveFile.SubChunk2Size);

在我删除sizeof()时工作。我真傻。

发布这个问题后,我才发现问题所在

在读取中的数据时,我已执行以下操作:

file.read(reinterpret_cast<char*>(waveFile.Data), sizeof(waveFile.SubChunk2Size));
file.read(重新解释cast(waveFile.Data)、sizeof(waveFile.SubChunk2Size));
应该是:

file.read(reinterpret_cast<char*>(waveFile.Data), waveFile.SubChunk2Size);  
file.read(重新解释转换(waveFile.Data)、waveFile.SubChunk2Size);

在我删除sizeof()时工作。愚蠢的我。

这适用于大多数波形文件,但某些标题可能包含特定的用户数据。您可以使用struct WAVEHEADER的单写:

struct WAVEFILEHEADER
{
    // don't change the order of attributes
    char m_lpcChunkId[4];
    int m_iChunkSize;
    char m_lpcFormat[4];
    char m_lpcSubChunkFmt[4];
    int m_iSubChunkFmtSize;
    short int m_siAudioFormat;
    short int m_siNumChannels;

    int m_iSampleRate;
    int m_iByteRate;
    short int m_siBlockAlign;
    short int m_siBitsPerSample;

    char m_lpcChunkData[4];
    int m_iSubChunkDataSize;
    // unsigned char * m_data;
};

WAVEFILEHEADER whdr;
FILE* fid = fopen("newaudio.wav","wb"); // important to use binary file

// some inicialization for whdr - RIFF etc.
// You can use only 1 write to save whole header:
fwrite(&whdr, 1, sizeof(WAVEFILEHEADER), fid);

// or you can read wav header
fread(&whdr, 1, sizeof(WAVEFILEHEADER), fid); 
// check chunk size, few headers have aditional 2 bytes (by definition user data, but they was always 0x0000)

这适用于大多数波形文件,但某些标题可能包含特定的用户数据。您可以使用struct WAVEHEADER的单写:

struct WAVEFILEHEADER
{
    // don't change the order of attributes
    char m_lpcChunkId[4];
    int m_iChunkSize;
    char m_lpcFormat[4];
    char m_lpcSubChunkFmt[4];
    int m_iSubChunkFmtSize;
    short int m_siAudioFormat;
    short int m_siNumChannels;

    int m_iSampleRate;
    int m_iByteRate;
    short int m_siBlockAlign;
    short int m_siBitsPerSample;

    char m_lpcChunkData[4];
    int m_iSubChunkDataSize;
    // unsigned char * m_data;
};

WAVEFILEHEADER whdr;
FILE* fid = fopen("newaudio.wav","wb"); // important to use binary file

// some inicialization for whdr - RIFF etc.
// You can use only 1 write to save whole header:
fwrite(&whdr, 1, sizeof(WAVEFILEHEADER), fid);

// or you can read wav header
fread(&whdr, 1, sizeof(WAVEFILEHEADER), fid); 
// check chunk size, few headers have aditional 2 bytes (by definition user data, but they was always 0x0000)