如何使用WAVEFORMATEX编写.wav文件

How to write .WAV file using WAVEFORMATEX?

本文关键字:wav 文件 编写 WAVEFORMATEX 何使用      更新时间:2023-10-16

我写了一个程序,打开wav文件并通过控制台播放它们,然后修改声音并重放。我如何保存一个新的wav文件与修改的声音?所以本质上我想创建一个wav文件并将修改后的结果写入其中。我使用WAVEFORMATEX作为音频的数据。

我做了更多的工作,我得到了wav文件创建,但它不能播放

下面是我的代码:
// writes the modified audio data into a .WAV file
void writeWaveFile(char* filename,WAVEFORMATEX& wfx)
{   
    FILE* file = fopen(filename, "wb");
    if (file)
    {
        // write wave header 
        unsigned short formatType = wfx.wFormatTag;
        unsigned short numChannels = wfx.nChannels;
        unsigned long  sampleRate = wfx.nSamplesPerSec;
        unsigned short bitsPerChannel = wfx.wBitsPerSample;
        unsigned short bytesPerSample = wfx.nAvgBytesPerSec;
        unsigned long  bytesPerSecond = wfx.nAvgBytesPerSec;
        unsigned long  dataLen = wfx.nBlockAlign;
        const int fmtChunkLen = 16;
        const int waveHeaderLen = 4 + 8 + fmtChunkLen + 8;
        unsigned long totalLen = waveHeaderLen + dataLen;
        fwrite("RIFF", 4, 1, file);
        fwrite(&totalLen, 4, 1, file);
        fwrite("WAVE", 4, 1, file);
        fwrite("fmt ", 4, 1, file);
        fwrite(&fmtChunkLen, 4, 1, file);
        fwrite(&formatType, 2, 1, file);
        fwrite(&numChannels, 2, 1, file);
        fwrite(&sampleRate, 4, 1, file);
        fwrite(&bytesPerSecond, 4, 1, file);
        fwrite(&bytesPerSample, 2, 1, file);
        fwrite(&bitsPerChannel, 2, 1, file);
        // write data
        fwrite("data", 4, 1, file);
        fwrite(&dataLen, 4, 1, file);
        //fwrite(data, dataLen, 1, file);
        // finish
        printf("Saved audio as %sn", filename);
        fclose(file);
    }
    else
        printf("Could not open %s to write audio datan", filename);
}

您可以完全自己编写文件,但是使用helper API是更好的方法。参见使用waveInOpen保存wave文件获取代码参考和详细信息。

我组合了一些代码,并在以下链接中制作了源代码。它记录10秒,并将缓冲区保存为。wav文件。这很简单。对不起,我不能在这里张贴代码。

http://concon.comule.com/wero/mainsound.cpp