我是libsox编程的新手,我想从名为'a.wav'的立体声音频中减少chennel,然后使用以下代码生成单声道音频'b.wav':
sox_format_t * in, * out;
sox_effects_chain_t * chain;
sox_effect_t * e;
char * args[10];
sox_init();
in = sox_open_read("E:\\a.wav", NULL, NULL, NULL);
out = sox_open_write("E:\\b.wav", &in->signal, NULL, NULL, NULL, NULL);
out->signal.channels = 1;
chain = sox_create_effects_chain(&in->encoding, &out->encoding);
e = sox_create_effect(sox_find_effect("input"));
sox_add_effect(chain, e, &in->signal, &in->signal);
e = sox_create_effect(sox_find_effect("channels"));
sox_add_effect(chain, e, &in->signal, &out->signal);
e = sox_create_effect(sox_find_effect("output"));
sox_add_effect(chain, e, &in->signal, &out->signal);
sox_flow_effects(chain, NULL, NULL);
sox_delete_effects_chain(chain);
sox_close(out);
sox_close(in);
sox_format_quit();
运行应用程序后,会生成单声道音频'b.wav',但声音的持续时间是a.wav的一半。 我的代码有问题吗?
任何回复都将不胜感激!
答案 0 :(得分:1)
sox_add_effect()
会覆盖输入信号(第三个参数)以描述此处理步骤之后的信号属性,以便您可以将其传递给下一个效果。但是,在您的情况下,读取处理程序也使用修改的信号信息,并且内容不再与正在读取的文件匹配。
您需要复制sox_open_read()
返回的信号信息,然后您可以将其作为第三个参数传递给sox_add_effect()
来电:
sox_signalinfo_t interm_signal = in->signal;
...
sox_add_effect(chain, e, &interm_signal, &out->signal);
这就是为什么我warned you在git存储库中查看最新版本的example3.c
,而不是在已发布的版本中。