如何使用LibSoX混合两个wav文件
How to mix two wav files using LibSoX
我正在尝试在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;
}
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 如何在C++中比较两个char数组
- 给定两个偶数,求出它们之间所有偶数的平方和
- 比较两个大小不等的映射c++
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 如何在for循环中包含两个索引值的测试条件
- 在声明中合并两个常量"std::set"(不是在运行时)
- 如何使用LibSoX混合两个wav文件