如何使用 LibSoX 混合两个 wav 文件

Posted

技术标签:

【中文标题】如何使用 LibSoX 混合两个 wav 文件【英文标题】:How to mix two wav files using LibSoX 【发布时间】:2013-01-06 14:34:56 【问题描述】:

我正在尝试在 Windows 上使用 LibSoX 混合两个 wav 文件。我可以通过使用以下命令从命令行使用 sox 来做到这一点:

sox -m f1.wav f2.wav out.wav

但是我想以编程方式使用 C/C++ 函数并与 LibSoX 链接。我已经成功构建了 LibSoX,并尝试了不涵盖两个音频文件“混合”的示例程序。

之前有人做过吗?如果您可以使用 LibSoX 调用提供代码 sn-p 或至少一些指针来执行此操作,那就太好了

【问题讨论】:

检查 sox 实用程序的源代码 :-) 您可以在此处在线浏览源代码:sox.git.sourceforge.net/git/gitweb.cgi?p=sox/sox;a=tree @NikosC。拥有代码并构建了 LibSox.lib,但一切都非常紧密耦合。我想知道它是否可以通过导出的 LibSoX 调用来完成 好像没有。它只是将样本添加在一起(sox.c,第 572 行)。它通过首先转换为double 来防止溢出。 @NikosC,请看下面我的回答 【参考方案1】:

想分享我为上述问题制定的解决方案(解决方法)。基本上,混合不会作为导出的函数调用公开。混合当然可以通过命令行完成,因此可能有两种解决方案:1)通过程序生成进程(sox.exe)和 2)通过 libsox。我需要一个基于 libsox 的解决方案,因为该函数将调用混合函数,但无法生成进程(约束)。所以我将主要功能功能从 sox 移到了我导出的 libsox 中的一个新方法:) 。所以现在我可以将相同的命令行开关传递给我的函数,并使用 libsox 完成工作!理想情况下,这将是一种“解决方法”,直到 Chris Bagwell 公开 libsox 的混合(和其他缺失)功能。

【讨论】:

如果你能告诉我们混合程序在 libsox 中的哪个位置会很酷。 混合功能不存在于任何一个函数中。使用多个功能,有时相同的功能用于多个选项。混合功能存在于 -m 选项引用的代码中,该选项设置 combine_method = sox_mix【参考方案2】:

虽然这是一个老问题,但我最近遇到了同样的问题。为了在您的代码中使用 sox.c main 方法,您需要在调用后重置所有全局变量。 sox.c 旨在运行一次然后退出。为此,您可以添加如下所示的功能。然后你可以重命名 main,sox_main_private 并且事情基本上可以使用命令行调用直接通过调用 sox_main() 手动构建你的 argv 数组

// reset the globals so that multiple calls can be made to sox_main
static void cleanup_globals(void)

    file_count = 0;
    input_count = 0;
    output_count = 0;
    current_input = 0;

    input_wide_samples = 0;
    read_wide_samples = 0;
    output_samples = 0;
    input_eof = sox_false;
    output_eof = sox_false;
    user_abort = sox_false;
    user_skip = sox_false;
    user_restart_eff = sox_false;
    success = 0;

    files = NULL;
    user_efftab = NULL;
    user_efftab_size = 0;
    effects_chain = NULL;
    save_output_eff = NULL;
    user_effargs_size = NULL;  /* array: size of user_effargs for each chain */
    nuser_effects = NULL;  /* array: number of effects in each chain */
    current_eff_chain = 0;
    eff_chain_count = 0;
    very_first_effchain = sox_true;
    effects_filename = NULL;
    play_rate_arg = NULL;
    norm_level = NULL;


int sox_main(int argc, char *argv[])

#if DEBUG
    printf("sox_main:\n");
    int i = 0;
    while (i < argc) 
        printf("%s ", argv[i]);
        i++;
    
    printf("\n");
#endif
    sox_main_private(argc, argv);
    cleanup_globals();
    return 0;

【讨论】:

以上是关于如何使用 LibSoX 混合两个 wav 文件的主要内容,如果未能解决你的问题,请参考以下文章

怎么用MATLAB进行两个语音信号.wav文件的卷积混合?

如何使用 python 连接两个 wav 文件?

Sox:混合两个输入,其中一个重复

如何将两个 wav 文件合并/合并为一个 wav 文件?

如何使用 NAudio 将两个 wav 音频文件与 30 秒的白色声音连接起来

将 PCM 16 位 LE 转换为 WAV