c++ - 如何使用 WAVEFORMATEX 写入 .WAV 文件?

标签 c++ winapi audio wav

我编写了一个程序,它可以打开 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 %s\n", filename);
        fclose(file);
    }
    else
        printf("Could not open %s to write audio data\n", filename);
}

最佳答案

您可以完全自己编写文件,但是最好使用辅助 API 来完成此操作。参见 Save wave file using waveInOpen代码引用和详细信息。

关于c++ - 如何使用 WAVEFORMATEX 写入 .WAV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16269494/

相关文章:

c++ - 编译器执行并提供默认构造函数的构造函数代码内部发生了什么?

c++ - 替换 Windows 任务对话框中的文本 “OK” 、 “Cancel” 、 “Yes” 、 “No”

c++ - 如何使用windows api获取输入

unity3d - unity AudioSource.Play 有噪音

audio - 如何用python的频谱图创建mp3?

c++ - Qt C++ 中的 GStreamer 链接器错误 LNK2019 和 LNK2001

c++ - 使用模板化类指定给 RtlValidateHeap 错误的无效地址

android - 打开蓝牙耳机的 socket 后音频暂停(Android 2.x)

C++ 无法理解的崩溃行为

c++ - 如何更改复选框属性? C++/VS