使用C ++保存wav文件时音频数据不正确(基于C#程序)

时间:2015-04-02 15:05:02

标签: c# c++ audio

我写了一个C#函数来保存音频数据,没有任何问题。以下是用于将数据写入流的原始函数:

public override void store(double data)
// stores a sample in the stream
{
    double sample_l;
    short sl;
    sample_l = data * 32767.0f;
    sl = (short)sample_l;
    stream.WriteByte((byte)(sl & 0xff));
    stream.WriteByte((byte)(sl >> 8));
    stream.WriteByte((byte)(sl & 0xff));
    stream.WriteByte((byte)(sl >> 8));
}

我将其转换为某些C ++代码并用它将数据输出到wav文件:

double data;
short smp;
char b1, b2;
int i;
std::ofstream sfile(fname);
...
for (i = 0; i < tot_smps; i++)
{
    smp = (short)(rend() * 32767.0);
    b1 = smp & 0xff;
    b2 = smp >> 8;
    sfile.write((char*)&b1, sizeof(char));
    sfile.write((char*)&b2, sizeof(char));
    sfile.write((char*)&b1, sizeof(char));
    sfile.write((char*)&b2, sizeof(char));
}

rend总是介于-1和1之间。当我从C ++程序中收听/查看wav文件时,会发出额外的嗡嗡声。与原始C#代码相比,C ++代码中的数据转换似乎有所不同,导致两个不同程序输出不同的数据/声音。

1 个答案:

答案 0 :(得分:1)

默认情况下,当您在C ++中打开流时,它会在文本模式中打开,这可以执行将某些字符序列转换为其他字符序列的操作(最值得注意的是0x0a可以成为0x0d 0x0a'\n'"\r\n"))。

您需要以二进制模式打开流:

std::ofstream sfile(fname, std::ios::out | std::ios::binary);