gpt4 book ai didi

audio - Libsox编码

转载 作者:行者123 更新时间:2023-12-03 02:28:15 25 4
gpt4 key购买 nike

如果我使用libsox将WAV文件转换为以下内容,为什么输出失真?

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

使用上面的代码?

输入文件的bits_per_sample = 16。

最佳答案

因此,您是说告诉SOX将16位示例WAV文件读取为8位示例文件?对SOX一无所知,我希望它将每个16位样本读取为两个8位样本...高位字节和低位字节是这样的:... HLHLHLHLHL ...

为简单起见,我们将高阶字节样本称为“A”样本。 “A”样本携带的动态范围较小的原始声音,因为已经切除了具有更高精度的低阶字节。

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

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

那是你听到的吗?

编辑 guest 评论说,目标是将WAV下转换为8位音频。读取manpage for 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位格式。

关于audio - Libsox编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/519188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com