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

时间:2013-10-21 06:00:24

标签: c++ fopen fwrite wav

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

这会将样本数减少一半。为了使其以正确的速度回放,我需要更改第二个波形文件的标题信息,以便将采样频率减半。但是,当我尝试使用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的结构中)。这段代码完美无缺,但是我想将&amp; HeaderInfo.Chunksize更改为我靠近顶部的值ChunkSizeOut。我不能简单地输入值,因为它表示int类型的变量是不兼容的。我已经尝试了很多,但似乎没有任何工作。我也尝试在&amp; HeaderInfo.Chunksize上执行算术,但你不能这样做。我将更改变量而不仅仅是这个变量,但格式对所有变量都是相同的。

请帮助我,我会非常感激。

2 个答案:

答案 0 :(得分:1)

了解fopen来电。编写二进制文件时,需要将'b'添加到打开模式,如

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

没有'b'的默认设置是以文本模式打开文件,这可能会导致某些字节的写入方式不同(更具体地说,值0x0a可能会被写为序列{ {1}}和0x0d,即换行符0x0a可能会转换为换行符回车'\n')。

答案 1 :(得分:0)

HeaderInfo看起来像一个结构,ChunkSize字段的类型是什么?尝试在头文件中找到声明(* .h可能是riff.h或wave.h,我现在不使用哪种库)声明了这个结构。根据你的代码HeaderInfo.ChunkSize的任何方式应该是一个int值。所以你可以试试这样的东西:

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

而不是:

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