【问题标题】:Incorrect audio data when saving wav file using C++ (based on a C# program)使用 C++ 保存 wav 文件时音频数据不正确(基于 C# 程序)
【发布时间】:2015-04-02 15:05:01
【问题描述】:

我写了一个 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# 代码相比似乎有些不同,导致两个不同的程序输出的数据/声音不同。

【问题讨论】:

  • 我假设rend 返回一个浮点值?

标签: c# c++ audio


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 2010-09-06
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多