我正在尝试在Windows上使用LibSoX混合两个wav文件。我可以使用以下命令从命令行使用sox来执行此操作:
sox -m f1.wav f2.wav out.wav
但是,我想使用C / C ++函数以编程方式执行此操作并使用LibSoX进行链接。我已经成功构建了LibSoX,并尝试了不包含两个音频文件“混合”的示例程序。
有人先前这样做过吗?如果您可以使用LibSoX调用提供代码片段或至少一些指针来实现这一点,那就太棒了
答案 0 :(得分:2)
想要分享我为上述问题所做的解决方案(解决方法)。基本上,混合不会作为导出的函数调用公开。混合可以通过命令行完成,因此可以有两种解决方案:1)通过程序生成进程(sox.exe)和2)通过libsox。我需要一个基于libsox的解决方案作为调用混合函数的函数,不能产生一个进程(约束)。所以我将主函数功能从sox移到了我导出的libsox中的新方法:)。所以现在我可以将相同的命令行开关传递给我的函数,并使用libsox完成工作!理想情况下,这将是一种“解决方法”,直到Chris Bagwell暴露了libsox的混合(和其他缺失)功能。
答案 1 :(得分:0)
尽管这是一个古老的问题,但最近我遇到了同样的问题。为了使用代码中的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;
}