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

How to mix two wav files using LibSoX

本文关键字:两个 wav 文件 何使用 LibSoX 混合      更新时间:2023-10-16

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

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

然而,我想用C/c++函数和LibSoX链接以编程方式做到这一点。我已经成功地构建了LibSoX,并尝试了不包含两个音频文件"混合"的示例程序。

之前有人这样做过吗?如果您能提供一个代码片段或至少一些指针来使用LibSoX调用

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

虽然这是一个老问题,但我最近又遇到了同样的问题。为了在代码中使用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;
}