首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++中合并两个wav文件时出错的持续时间信息

在c++中合并两个wav文件时出错的持续时间信息
EN

Stack Overflow用户
提问于 2013-12-04 08:02:43
回答 2查看 542关注 0票数 0

我试图合并c++中的两个wav文件。我正在做的是以二进制ifstream的形式打开两个wav文件,并创建一个新的also输出波形文件。

代码语言:javascript
复制
ifstream wavFileA("fileA.wav",ios::binary) ;      
ifstream wavFileB("fileB.wav",ios::binary);      
ofstream wavoutputfile("output.wav",ios::binary);        

然后,我将整个wavfileA及其头部复制到输出文件中,然后复制wavfileB,省略了前44位(即wavfileB的头信息)。

代码语言:javascript
复制
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在头中更改为(整个文件大小减去(-)头的大小)。

代码语言:javascript
复制
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();

该代码成功地合并了文件,并正确地播放了文件,但是文件的持续时间显示了一个错误的值,这个值比实际的持续时间要大得多。有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-04 12:47:57

谢谢你的帮助康斯坦丁。但我发现我哪里出了问题。

我忘了考虑到ChunkSize和SubChunkSize2是在小endian系统中订购的。所以我改变了在标题中输入这些信息的部分,整个过程就开始工作了。

代码语言:javascript
复制
for (int i=3; i>=0 ; i--)  //I made the change here
{
    outputWavFile << bArray[i];
}
票数 0
EN

Stack Overflow用户

发布于 2013-12-04 11:20:44

接下来,我修改了输出wav文件中的头信息,并将头文件中的ChunkSize更改为(输出文件的大小减去(-)4字节)(即RIFF的大小)。

这可能是您的主要问题:为了获得ChunkSize,您应该将文件大小减去8个字节(而不是4个字节)。另外,确保Subchunk2Size确实是原始音频数据的大小,没有标题--不要使用像pos - 44这样的神奇数字,这会使您的代码难以阅读和理解。最好用样本数、通道数和每个样本的位数来计算。即

代码语言:javascript
复制
Subchunk2Size = sampleCount * channelCount * bitDepth/8;

如果所有这些都没有帮助,请向我们展示您保存的波形文件(十六进制)的头(大约前72个字节)和预期长度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20370080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档