如何使用SoX C库混合音频文件

如何使用SoX C库混合音频文件,c,audio,sox,mixing,C,Audio,Sox,Mixing,使用命令行中的SoX和“SoX-m…”混合音频文件很简单,但我试图找到与C库完全相同的东西,但我不知道如何在任何地方进行混合。有可能吗?嗯,有可能,但图书馆不会帮你 查看sox.c代码,您可以注意到实际的混合代码位于静态函数中: for (ws = 0; ws < olen; ++ws) { /* wide samples */ if (combine_method == sox_mix || combine_method == sox_mix_power) { for (s

使用命令行中的SoX和“SoX-m…”混合音频文件很简单,但我试图找到与C库完全相同的东西,但我不知道如何在任何地方进行混合。有可能吗?

嗯,有可能,但图书馆不会帮你

查看
sox.c
代码,您可以注意到实际的混合代码位于
静态
函数中:

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);
        }
    }
/* [...] */
(ws=0;ws*/ if(combine_method==sox_mix | | combine_method==sox_mix_power){ 对于(s=0;sin_signal.channels;++s,++p){/*和采样*/ *p=0; 对于(i=0;iilen[i]&sft->signal.channels){ /*强制转换为double可防止整数溢出*/ 双采样=*p+(双)z->ibuf[i][ws*文件[i]->ft->signal.channels+s]; *p=SOX\u圆形\u片段\u计数(样本、混合\u片段); } } /* [...] */
因此,如果您真的想使用sox,您可以将其用于文件输入/输出,但混合操作需要您自己完成。

好吧,这是可能的,但库不会帮助您

查看
sox.c
代码,您可以注意到实际的混合代码位于
静态
函数中:

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);
        }
    }
/* [...] */
(ws=0;ws*/ if(combine_method==sox_mix | | combine_method==sox_mix_power){ 对于(s=0;sin_signal.channels;++s,++p){/*和采样*/ *p=0; 对于(i=0;iilen[i]&sft->signal.channels){ /*强制转换为double可防止整数溢出*/ 双采样=*p+(双)z->ibuf[i][ws*文件[i]->ft->signal.channels+s]; *p=SOX\u圆形\u片段\u计数(样本、混合\u片段); } } /* [...] */
因此,如果你真的想使用sox,你可以将它用于文件输入/输出,但混合需要你自己来完成。

你到底想实现什么?读取n个文件,混合它们,然后…?sox对于库来说似乎是一个糟糕的选择;非常不友好的API。读取n个文件,然后将它们混合到输出文件中。还有其他库你想要的吗d建议?我还需要知道更多。既然您实际上是在执行命令行
sox
所做的操作,为什么要将其嵌入C?sox有一个C库(),我们正在测试它作为命令行的替代。这里有一个示例代码(example4.C,可在sox源代码发行版中获得)它连接了两个文件,但我看不到一种方法来改变这一点,使它们混合。是的,我理解。但我考虑的是更大的图景。你是否正在创建一些更大的应用程序,其中音频混合将是其中一个功能?你到底想实现什么?读取n个文件,混合它们,然后…?SoX似乎是一个糟糕的选择库;非常不友好的API。读取n个文件并将它们混合到一个输出文件中。您还建议使用其他库吗?我还需要了解更多。既然您实际上是在执行命令行
sox
所做的操作,为什么要将其嵌入C?sox有一个C库()我们正在测试它作为命令行的替代方案。这里有一个示例代码(example4.c,可在SoX源代码发行版中获得)它连接了两个文件,但我看不到一种方法来改变这一点,使它们混合。是的,我理解。但我考虑的是更大的图景。你是否正在创建一个更大的应用程序,其中音频混合将是其中一个功能?我自己这么做,你的意思是尝试在我自己的C代码中实现这些功能?听起来很有趣!或者找到一些其他功能brary来做混合。但我认为它应该足够简单,可以手工完成,除非你正在寻找一些更精细的方法。好吧,我不是一个非常有经验的程序员,但我会看看我是怎么做的。谢谢你的帮助!除非我遗漏了什么,否则这里使用的算法非常简单:对于每个样本
I
output[I]=平均值(输入1[i],输入2[i],…)
(伪代码).然而,我不是声音专家,所以可能有更好的方法。你是说我自己动手,你的意思是尝试用我自己的C代码实现这些函数?听起来很有趣!或者找其他库来做混合。但我认为这应该足够简单,可以手工完成,除非你正在寻找一些更精细的方法。好吧,我不是一个很有经验的人我是一名优秀的程序员,但我会看看我会怎么做。谢谢你的帮助!除非我遗漏了什么,否则这里使用的算法非常简单:对于每个示例
I
output[I]=mean(input1[I],input2[I],…)
(伪代码)。然而,我不是声音专家,所以可能有更好的方法。