[英]Wrong duration info while Merging two wav files in c++
我正在尝试在c ++中合并两个wav文件。 我正在做的是将两个wav文件作为二进制ifstream打开,并且还创建了一个新的ofstream输出wavfile。
ifstream wavFileA("fileA.wav",ios::binary) ;
ifstream wavFileB("fileB.wav",ios::binary);
ofstream wavoutputfile("output.wav",ios::binary);
然后我将整个wavfileA及其标头复制到输出文件中,然后我复制了wavfileB,省略了前44位(即wavfileB的标头信息)。
wavFileA.seekg(0,ios::end);
int leng2 = wavFileA.tellg();
cout << leng2 << endl;
wavFileA.seekg(0,ios::beg);
int pos;
pos = wavoutputfile.tellp();
cout << pos << endl << endl;
for(int i = 0; i < leng2 ; i++)
{
byteB = readByte(wavFileA);
wavoutputfile << byteB;
}
pos = wavoutputfile.tellp();
cout <<"current pos-"<< pos << endl << endl;
wavoutputfile.seekp(pos, ios::beg);
wavFileB.seekg(0,ios::end);
int leng3 = wavFileB.tellg();
wavFileB.seekg(44,ios::beg);
cout<<"length --"<<leng3<<endl;
for(int i= 0 ; i < leng3-44 ; i++)
{
byteC = readByte(wavFileB);
wavoutputfile << byteC;
}
pos = wavoutputfile.tellp();
cout <<"end pos--"<< pos << endl << endl;
接下来,我修改了输出wav文件中的标头信息,并将标头中的ChunkSize更改为(我的输出文件的大小减去(-)4个字节)(即RIFF的大小),然后将标头中的Subchunk2Size更改为(我的整个文件大小减去标题的大小(-)。
int fsize = pos-8;
unsigned char bArray[4];
wavoutputfile.seekp(4, ios::beg);
bArray[0] = ((fsize >> 24) & 0xFF);
bArray[1] = ((fsize >> 16) & 0xFF);
bArray[2] = ((fsize >> 8) & 0xFF);
bArray[3] = ((fsize) & 0xFF);
for (int i=0; i<4 ; i++)
{
wavoutputfile << bArray[i];
}
int dataSize = (pos-44);
wavoutputfile.seekp(42, ios::beg);
bArray[0] = ((dataSize >> 24) & 0xFF);
bArray[1] = ((dataSize >> 16) & 0xFF);
bArray[2] = ((dataSize >> 8) & 0xFF);
bArray[3] = ((dataSize) & 0xFF);
for (int i=0; i<4 ; i++)
{
wavoutputfile << bArray[i];
}
wavoutputfile.seekp(0, ios::end);
wavFileA.close();
wavFileB.close();
wavoutputfile.close();
此代码成功合并了文件,并且还正确播放了文件,但是文件的持续时间显示了一个错误值,该值比实际持续时间大得多。 谁能帮我这个?
接下来,我修改了输出wav文件中的标头信息,并将标头中的ChunkSize更改为(我的输出文件的大小减去(-)4bytes)(即RIFF的大小)
这可能是您的主要问题:您应该将文件大小减去8个字节(而不是4个字节),以获取ChunkSize。 还要确保Subchunk2Size确实是没有标题的原始音频数据的大小-不要使用pos - 44
这样的魔术数字,它会使您的代码难以阅读和理解。 更好地利用您的样本计数,每个样本的通道数和位数进行计算。 即
Subchunk2Size = sampleCount * channelCount * bitDepth/8;
如果所有这些都无济于事,请向我们显示您保存的wavefile的标头(大约前72个字节)(十六进制)以及预期的长度。
感谢康斯坦丁的帮助。 但是我发现我要去哪里错了。
我忘记考虑ChunkSize和SubChunkSize2是在Little Endian系统中订购的。 所以我更改了我在标题中输入这些信息的部分,整个事情开始起作用。
for (int i=3; i>=0 ; i--) //I made the change here
{
outputWavFile << bArray[i];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.