【问题标题】:How to mix audio files using SoX C library如何使用 SoX C 库混合音频文件
【发布时间】:2012-08-24 10:28:33
【问题描述】:

使用 SoX 从命令行使用“sox -m ...”混合音频文件很简单,但我试图用 C 库找到完全相同的东西,但我不知道该怎么做任何地方。有没有可能?

【问题讨论】:

  • 究竟想要达到什么目的?读取 n 个文件,混合它们然后……? SoX 对于图书馆来说似乎是一个糟糕的选择。非常不友好的 API。
  • 读取 n 个文件并将它们混合到一个输出文件中。您还有其他推荐的库吗?
  • 我还需要了解更多。既然您实际上是在执行命令行sox 所做的操作,为什么要将其嵌入到 C 中?
  • SoX 有一个 C 库 (sox.sourceforge.net/libsox.html),我们正在测试它作为命令行的替代方案。有一个示例代码(example4.c,在 SoX 源代码分发中可用)连接两个文件,但我看不出有什么方法可以改变它以使它们混合。
  • 是的,我明白了。但我正在考虑更大的图景。您是否正在创建一些更大的应用程序,其中音频混合将成为功能之一?

标签: c audio sox mixing


【解决方案1】:

嗯,这是可能的,但图书馆不会帮助你。

查看sox.c代码,你可以注意到实际的混合代码在static函数中:

for (ws = 0; ws < olen; ++ws) { /* wide samples */
  if (combine_method == sox_mix || combine_method == sox_mix_power) {
    for (s = 0; s < effp->in_signal.channels; ++s, ++p) { /* sum samples */
      *p = 0;
      for (i = 0; i < input_count; ++i)
        if (ws < z->ilen[i] && s < files[i]->ft->signal.channels) {
          /* Cast to double prevents integer overflow */
          double sample = *p + (double)z->ibuf[i][ws * files[i]->ft->signal.channels + s];
          *p = SOX_ROUND_CLIP_COUNT(sample, mixing_clips);
        }
    }
/* [...] */

所以,如果你真的想使用sox,你可以将它用于文件输入/输出,但是你需要自己做混合。

【讨论】:

  • 我自己做,你的意思是尝试在我自己的C代码中实现这些功能?听起来很有趣!
  • 或者找一些其他的库来做混合。但我认为它应该足够简单,可以手动完成,除非您正在寻找一些更精致的方法。
  • 好吧,我不是一个很有经验的程序员,但我会看看我会怎么做。感谢您的帮助!
  • 除非我遗漏了什么,这里使用的算法非常简单:对于每个样本ioutput[i] = mean(input1[i], input2[i], …)(在伪代码中)。不过,我不是声音专家,所以可能有更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
相关资源
最近更新 更多