首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用libsox从wav文件中减少通道

使用libsox从wav文件中减少通道
EN

Stack Overflow用户
提问于 2013-06-17 14:37:29
回答 1查看 778关注 0票数 2

我是libsox编程的新手,我想从立体声音频'a.wav‘中减少一个通道,然后用以下代码生成一个单声道音频'b.wav’:

代码语言:javascript
复制
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的一半。我的代码有什么问题吗?

任何回复都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-18 23:34:10

在此处理步骤之后,sox_add_effect()将覆盖输入信号(第三个参数)以描述信号的属性,以便您可以将其传递到下一个效果。但是,在您的示例中,读处理程序也会使用修改后的信号信息,并且内容不再与正在读取的文件匹配。

您需要复制sox_open_read()返回的信号信息,然后可以将其作为第三个参数传递给sox_add_effect()调用:

代码语言:javascript
复制
sox_signalinfo_t interm_signal = in->signal;
...
sox_add_effect(chain, e, &interm_signal, &out->signal);

这就是为什么我要在git库中查看example3.c的最新版本,而不是在已发布的版本中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17141679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档