我试图混合两个wav文件使用LibSoX在Windows上。我可以通过使用以下命令从命令行中使用sox来实现这一点:
sox -m f1.sox f2.sox out.wav
但是,我希望使用C/C++函数并使用LibSoX进行编程。我已经成功地构建了LibSoX,并且已经尝试了不包含两个音频文件的示例程序。
之前有人这么做过吗?如果您可以提供一个代码片段或至少一些使用LibSoX调用来执行此操作的指针,那就太好了。
发布于 2013-01-07 14:15:00
想要分享解决方案(解决办法),我为上面的问题。基本上,混合不作为导出的函数调用公开。当然,混合可以通过命令行完成,因此可以有两种解决方案: 1)通过程序生成进程(sox.exe),2)通过libsox生成进程。我需要一个基于libsox的解决方案,作为调用混合函数的函数,不能生成一个进程(约束)。因此,我将主要功能从sox移到libsox中的一个新方法,我导出了:)。因此,现在我可以将相同的命令行开关传递给我的函数,并使用libsox完成工作!这将是一个理想的“解决方案”,直到Chris公开libsox的混合(和其他缺失的)功能。
发布于 2019-08-31 17:32:07
虽然这是个老问题,但我最近遇到了同样的问题。为了从代码中使用sox.c main方法,您需要在调用之后重置所有全局。sox.c打算运行一次,然后退出。为此,您可以添加如下所示的函数。然后您可以重命名main,sox_main_private,基本上可以通过调用sox_main()直接使用命令行调用来构建arv数组。
// 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;
}https://stackoverflow.com/questions/14183120
复制相似问题