【问题标题】:Wrong duration info while Merging two wav files in c++在c ++中合并两个wav文件时错误的持续时间信息
【发布时间】:2013-12-04 08:02:43
【问题描述】:

我试图在 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();

此代码成功合并文件,它也可以正确播放文件,但文件的持续时间显示错误值,该值远大于实际持续时间。谁能帮我这个?

【问题讨论】:

    标签: c++ file audio media wav


    【解决方案1】:

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

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

    Subchunk2Size = sampleCount * channelCount * bitDepth/8;
    

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

    【讨论】:

      【解决方案2】:

      感谢康斯坦丁的帮助。但我发现我哪里出错了。

      我忘了考虑 ChunkSize 和 SubChunkSize2 是在小端系统中排序的。 所以我改变了我在标题中输入这些信息的部分,整个事情开始工作了。

      for (int i=3; i>=0 ; i--)  //I made the change here
      {
          outputWavFile << bArray[i];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-10
        • 2011-12-11
        • 1970-01-01
        相关资源
        最近更新 更多