繁体   English   中英

在C ++中合并两个WAV文件时的持续时间信息错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM