【问题标题】:Libsox encodingLibsox 编码
【发布时间】:2009-02-06 05:11:00
【问题描述】:

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

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

使用上面的代码?

输入文件的 bits_per_sample = 16。

【问题讨论】:

  • 我在哪里可以得到这个糟糕的 sox 源文件以及如何添加到 xCode Project for iphone ???

标签: audio wav


【解决方案1】:

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

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

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

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

这是你听到的吗?

编辑 客人评论说目标是将 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 位格式,而不是读取时。

【讨论】:

  • 我想将其转换为每个样本 8 位。我该怎么做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多