C++ - 从另一个 Wave 文件创建一个 Wave (.Wav) 文件,但带有自定义 header

标签 c++ fopen fwrite wav

我真的是编程新手,所以你们的任何帮助都会很有帮助,我将非常感激。顺便说一下,这是 C++。我有一个 wave 文件,我成功地读取了它的标题。我想创建另一个 wave 文件,将第一个 wave 文件的所有其他数据值作为输出。每个值将是第一个文件中两个值的平均值。

这会将样本数量减少一半。为了让它以正确的速度播放,我需要更改第二个波形文件的标题信息,以便将采样频率减半。但是,当我尝试使用 fwrite 时,我似乎无法进行算术运算。我已经成功编写了第二个 wave 文件,其标题与第一个相同,但我需要更改一些值。

我真的认为这只是一个简单的数据类型错误或其他什么,但我是一个新手程序员所以我无法弄清楚。

FILE* fptr2;                        // File pointer for WAV output
fptr2 = fopen("KingdomOut.wav","w");    // Open wav file for reading


int ChunkSizeOut = (HeaderInfo.ChunkSize)/2 + 18;

cout << ChunkSizeOut << endl;

// RIFF chunk descriptor
fwrite(HeaderInfo.ChunkID, sizeof(char), 4, fptr2);             // "RIFF"
fwrite(&HeaderInfo.ChunkSize, sizeof(int), 1, fptr2);           // 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
fwrite(HeaderInfo.Format, sizeof(char), 4, fptr2);              // "WAVE"
// fmt sub-chunk
fwrite(HeaderInfo.Subchunk1ID, sizeof(char), 4, fptr2);         // "fmt "
fwrite(&HeaderInfo.Subchunk1Size, sizeof(int), 1, fptr2);       // bytes remaining in subchunk, 16 if uncompressed
fwrite(&HeaderInfo.AudioFormat, sizeof(short), 1, fptr2);       // 1 = uncompressed
fwrite(&HeaderInfo.NumChannels, sizeof(short), 1, fptr2);       // mono or stereo
fwrite(&HeaderInfo.SampleRate, sizeof(int), 1, fptr2);
fwrite(&HeaderInfo.ByteRate, sizeof(int), 1, fptr2);            // == SampleRate * NumChannels * BitsPerSample/8
fwrite(&HeaderInfo.BlockAlign, sizeof(short), 1, fptr2);        // == NumChannels * BitsPerSample/8
fwrite(&HeaderInfo.BitsPerSample, sizeof(short), 1, fptr2);         
// data sub-chunk
fwrite(HeaderInfo.Subchunk2ID, sizeof(char), 4, fptr2);         // "data"
fwrite(&HeaderInfo.Subchunk2Size, sizeof(int), 1, fptr2);       // == NumSamples * NumChannels * BitsPerSample/8

fclose(fptr2);

这是使用第一个波形文件的数据写入第二个波形文件。 (第一个 wav 文件的 header 位于名为 HeaderInfo 的结构中)。此代码完美运行,但我想将 &HeaderInfo.Chunksize 更改为我在顶部附近的值 ChunkSizeOut。我不能简单地输入值,因为它说 int 类型的变量不兼容。我已经尝试了很多,但似乎没有任何效果。我还尝试对 &HeaderInfo.Chunksize 执行算术运算,但你不能这样做。我将更改比这一个更多的变量,但格式对所有变量都是相同的。

请帮助我,我将不胜感激。

最佳答案

阅读有关 fopen 调用的信息。在编写二进制文件时,您需要在打开模式中添加一个'b',例如

fptr2 = fopen("KingdomOut.wav","wb");    // Open wav file for reading

没有 'b' 的默认情况下是以文本模式打开文件,这可能会导致某些字节的写入方式不同(更具体地说,值 0x0a 可以写成 0x0d0x0a 的顺序,即换行 '\n' 可以转换为 newline-carriage return "\r\n").

关于C++ - 从另一个 Wave 文件创建一个 Wave (.Wav) 文件,但带有自定义 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19487210/

相关文章:

c - fwrite 无法写入值 10 (0x0A)

c++ - QGraphicsView 可能的错误?

c++ - Opengl 将相对 body 坐标转换为世界坐标

php fwrite() 没有完成将字符串数据写入文件,为什么?

c - 将txt文件逐行读入char数组C

C - 当我将函数 fwrite() 放入循环时写入文件失败

c++ - 如何使用顶点位置坐标进行纹理处理? OpenGL,C++

c++ - 显示用户创建的数组 C++ 中的数字

c - C(Linux) 中的 fopen 返回 "Too many open files"

javascript - 将 Json 对象导出到文本文件