我对编程真的很陌生,所以你们的任何帮助都会很有帮助,我将非常感激。顺便说一下,这是 C++。我有一个波形文件,我成功读取了它的标题。我想创建另一个波形文件,将第一个波形文件的所有其他数据值作为输出。每个值将是第一个文件中两个的平均值。
这将使样本数量减少一半。为了让它以正确的速度播放,我需要更改第二个波形文件的标题信息,以便将采样频率减半。但是,当我尝试使用 fwrite 时,我似乎无法进行算术运算。我已经成功编写了第二个波形文件,其标题与第一个文件相同,但我需要更改一些值。
我真的认为这只是一个简单的数据类型错误或其他什么,但我是一个新手程序员,所以我无法弄清楚。
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 文件的标头位于名为 HeaderInfo 的结构中)。此代码完美运行,但是我想将 &HeaderInfo.Chunksize 更改为我在顶部附近的值 ChunkSizeOut。我不能简单地输入值,因为它说 int 类型的变量不兼容。我已经尝试了很多,但似乎没有任何效果。我也尝试在 &HeaderInfo.Chunksize 上执行算术,但你不能这样做。我将更改更多变量,而不仅仅是这个,但格式对所有人都是一样的。
请帮助我,我将非常感激。