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

Posted

技术标签:

【中文标题】使用 libsox 从 wav 文件中减少通道【英文标题】:Reducing a channel from wav file using libsox 【发布时间】:2013-06-17 06:37:29 【问题描述】:

我是 libsox 编程的新手,我想从名为“a.wav”的立体声音频中减少一个通道,然后使用以下代码生成一个单声道音频“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 的一半。 我的代码有问题吗?

任何回复将不胜感激!

【问题讨论】:

【参考方案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 的最新版本,而不是在已发布版本中。

【讨论】:

感谢您的回复!我几乎忘记了这个问题,因为我已经离开这里几个月了。很抱歉,API 仍然存在一些错误并且难以使用。最后,我使用 sox 可执行程序通过命令行进行转换。谢谢!天天快乐~

以上是关于使用 libsox 从 wav 文件中减少通道的主要内容,如果未能解决你的问题,请参考以下文章

从多通道 wav 文件中读取单个通道

在 Python 中用 24 位数据从立体声 wav 文件 wav 中读取单个通道的数据

如何使用流体合成器将单个 midi 通道导出为 wav?

如何在java中将Wav文件拆分为通道?

AVAudioConverter.convertToBuffer 抛出错误代码 -50

gstreamer 将多通道 wav 文件拆分为单独的通道并将每个通道编码为 mp3、alac 等并保存到文件