首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libsox编码

Libsox编码
EN

Stack Overflow用户
提问于 2009-02-06 05:11:00
回答 1查看 1.5K关注 0票数 0

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

代码语言:javascript
复制
&in->encoding.encoding = SOX_ENCODING_UNSIGNED;
&in->encoding.bits_per_sample = 8;

使用上面的代码?

输入文件的bits_per_sample = 16。

EN

回答 1

Stack Overflow用户

发布于 2009-02-06 05:55:58

所以你是说你告诉SOX把一个16位的WAV样本文件作为一个8位的示例文件来读取?我对SOX一无所知,我希望它能把每个16位样本读成两个8位样本.高阶字节和低阶字节,如:...HLHLHLHLHL.

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

我们将把低阶字节样本称为"B样本“。这些将是粗略的随机和编码噪音。

因此,我们将有一个原始的声音,'A‘样本,移动的频率下降了一半。这是因为每一个'A‘样本之间都有一个'B’样本,使'A‘样本的比率减半。“B”样本增加了原始声音的噪音。所以我们会有原始的声音,向下移动一半,带有噪音。

你听到的是这个吗?

编辑嘉宾评论说,目标是将WAV转换为8位音频。读取SoX手册后,SoX似乎总是在内存中使用32位音频,这是sox_read()的结果。传递一个格式只会使它尝试从该格式中读取。

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

代码语言:javascript
复制
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位格式而不是在读取时使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/519188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档