Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用soxlib for iOS消除开始和结束静音_C++_Ios_Objective C_Sox - Fatal编程技术网

C++ 如何使用soxlib for iOS消除开始和结束静音

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端口连接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_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