任务是从录音开始和结束的阈值中删除静音。 我使用这个sox端口到iOS。 https://github.com/shieldlock/SoX-iPhone-Lib/
我发现命令行sox工具通过以下命令完成我的任务:
sox in.wav out.wav silence 1 0.1 1% reverse silence 1 0.1 1% reverse
(取自此处:http://digitalcardboard.com/blog/2009/08/25/the-sox-of-silence/)
但是我不能像iOS这样在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);
我需要为执行此任务提供哪些参数?
答案 0 :(得分:1)
由于sox in.wav out.wav silence 1 0.1 1% reverse silence 1 0.1 1% reverse
是两个不同命令行的串联:
sox in.wav temp.wav silence 1 0.1 1% reverse
sox temp.wav out.wav silence 1 0.1 1% reverse
在你的链中创建两个沉默效果。一旦效果修剪文件的开头并将反转的副本传递给临时目标,然后从temp的开头进行修剪并将其反转回完成的目标。
但是传递什么参数(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);
答案 1 :(得分:0)
Sox的文档很差。我在这里分享我的解决方案 示例中的阈值可能对您来说太低。根据需要调整参数。 (在使用C / C ++ API之前,请确保了解shell命令行选项。)
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