C++ 如何使用soxlib for iOS消除开始和结束静音
任务是从音频录制的开始和结束按阈值消除静音。 我使用这个sox端口连接iOS。 我发现命令行sox工具通过以下命令完成我的任务:C++ 如何使用soxlib for iOS消除开始和结束静音,c++,ios,objective-c,sox,C++,Ios,Objective C,Sox,任务是从音频录制的开始和结束按阈值消除静音。 我使用这个sox端口连接iOS。 我发现命令行sox工具通过以下命令完成我的任务: sox in.wav out.wav silence 1 0.1 1% reverse silence 1 0.1 1% reverse (摘自此处:) 但我无法将其转换为iOS lib格式,如下所示: sox_create_effect(sox_find_effect("silence")); args[0] = "2000", assert(sox_effec
sox in.wav out.wav silence 1 0.1 1% reverse silence 1 0.1 1% reverse
(摘自此处:)
但我无法将其转换为iOS lib格式,如下所示:
sox_create_effect(sox_find_effect("silence"));
args[0] = "2000", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
执行此任务需要提供哪些参数?因为
sox in.wav out.wav静默1 0.1 1%反向静默1 0.1%反向静默是两个不同命令行的串联:
sox in.wav temp.wav silence 1 0.1 1% reverse
sox temp.wav out.wav silence 1 0.1 1% reverse
在链中创建两个静音效果。“一次效果”修剪文件的开头并将反转的副本传送到临时目标,而“下一次效果”修剪临时目标的开头并将其反转回完成的目标
但是要传递哪些参数(args
)?免责声明:我没有什么经验,无法测试,但我相信应该是以下字符串:
args[1] = "1";
args[2] = "0.1";
args[3] = "1%";
args[4] = "reverse";
e = sox_create_effect(sox_find_effect("silence"));
args[0] = "2000", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &inFile->signal, &tempFile->signal) == SOX_SUCCESS);
free(e);
e = sox_create_effect(sox_find_effect("silence"));
args[0] = "2000", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &tempFile->signal, &outFile->signal) == SOX_SUCCESS);
free(e);
sox_flow_effects(chain, NULL, NULL);
Sox的文档很差。我在这里分享我的解决方案。
示例中的阈值可能对您来说太低。根据需要调整参数。(在使用C/C++API之前,请确保了解shell命令行选项。)
char*选项[10];
//输入效应。有关详细信息,请参阅sox的文档。
//相当于“静音10.30.1%反向静音10.30.1%反向”
选项[0]=常量(“1”);
选项[1]=常量(“0.3”);
选项[2]=常量(“0.1%”);
对于(int i=0;i<2;++i){
//沉默10.30.1%
e=sox_创造效应(sox_发现效应(“沉默”));
如果(sox效果选项(e,3,选项)!=sox成功){
on_错误(“静音1效果选项错误!”);
}
如果(sox_添加_效果(链、e和in->信号和in->信号)!=sox_成功){
on_错误(“添加效果错误!”);
}
免费(e);
//逆转
e=sox_创造效应(sox_发现效应(“反向”));
如果(sox效果选项(e,0,NULL)!=sox成功){
on_错误(“静音1效果选项错误!”);
}
如果(sox_添加_效果(链、e和in->信号和in->信号)!=sox_成功){
on_错误(“添加效果错误!”);
}
免费(e);
}
//输出效应
谢谢,我来测试一下out@kdogisthebest“幸运吗?”汤普森沉默和逆转是两个独立的效应。见下面我的答案。谢谢你,回答得很好。我正在尝试使用“pad”命令。它被用来增加沉默。在终端中运行良好,但在代码中不起作用。你能帮我吗?
char *options[10];
// input effect. See sox's documentaton for details.
// equivalent to 'silence 1 0.3 0.1% reverse silence 1 0.3 0.1% reverse'
options[0] = const_cast<char*>("1");
options[1] = const_cast<char*>("0.3");
options[2] = const_cast<char*>("0.1%");
for(int i = 0; i < 2; ++i) {
// silence 1 0.3 0.1%
e = sox_create_effect(sox_find_effect("silence"));
if(sox_effect_options(e, 3, options) != SOX_SUCCESS) {
on_error("silence1 effect options error!");
}
if(sox_add_effect(chain, e, &in->signal, &in->signal) != SOX_SUCCESS) {
on_error("add effect error!");
}
free(e);
// reverse
e = sox_create_effect(sox_find_effect("reverse"));
if(sox_effect_options(e, 0, NULL) != SOX_SUCCESS) {
on_error("silence1 effect options error!");
}
if(sox_add_effect(chain, e, &in->signal, &in->signal) != SOX_SUCCESS) {
on_error("add effect error!");
}
free(e);
}
// output effect