我写了一个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 ++代码中的数据转换似乎有所不同,导致两个不同程序输出不同的数据/声音。
答案 0 :(得分:1)
默认情况下,当您在C ++中打开流时,它会在文本模式中打开,这可以执行将某些字符序列转换为其他字符序列的操作(最值得注意的是0x0a
可以成为0x0d 0x0a
('\n'
到"\r\n"
))。
您需要以二进制模式打开流:
std::ofstream sfile(fname, std::ios::out | std::ios::binary);