0

如果我使用 libsox 将 wav 文件转换为:

&in->encoding.encoding = SOX_ENCODING_UNSIGNED;
&in->encoding.bits_per_sample = 8;

使用上面的代码?

输入文件的 bits_per_sample = 16。

4

1 回答 1

0

所以你是说你告诉 SOX 将 16 位样本 WAV 文件作为 8 位样本文件读取?对 SOX 一无所知,我希望它将每个 16 位样本读取为两个 8 位样本……高位字节和低位字节如下:……HLHLHLHLHL……

为简单起见,我们将高位字节样本称为“A”样本。“A”样本携带动态范围较小的原始声音,因为具有额外精度的低位字节已被截断。

我们将把低位字节样本称为“B 样本”。这些将大致是随机的并编码噪声。

因此,作为结果,我们将原始声音“A”样本的频率降低了一半。这是因为在每个“A”样本之间都有一个“B”样本,这将“A”样本的速率减半。“B”样本为原始声音添加了噪音。所以我们将得到原始声音,降低一半,并带有噪音。

这是你听到的吗?

编辑客人评论说,目标是将 WAV 下变频为 8 位音频。阅读 SoX 的手册页,由于 sox_read(),SoX 似乎总是在内存中使用 32 位音频。将格式传递给它只会使它尝试该格式读取。

要在内存中进行下转换,请使用 sox.h 中的 SOX_SAMPLE_TO_SIGNED_8BIT 或 SOX_SAMPLE_TO_UNSIGNED_8BIT,即:

sox_format_t ft = sox_open_read("/file/blah.wav", NULL, NULL);
if( ft ) {
    sox_ssample_t buffer[100];
    sox_size_t amt = sox_read(ft, buffer, sizeof(buffer));
    char 8bitsample = SOX_SAMPLE_TO_SIGNED_8BIT(buffer[0], ft->clips);
}

要输出下转换文件,请在写入时使用 8 位格式,而不是在读取时使用。

于 2009-02-06T05:55:58.923 回答