SoX系列(一)——编译和使用
SoX号称是声音处理程序的瑞士军刀,是一个跨平台(Windows、Linux、MacOS X 等)命令行实用程序,可以将各种格式的计算机音频文件转换为其他格式。它还可以对这些声音文件应用各种效果,而且一个额外的好处是,SoX 可以在大多数平台上播放和录制音频文件。[1]
要使用编译好的二进制程序,可访问官网下载。或者向本文介绍的,使用源码进行编译后安装。
编译安装
源码获取
通过github主页[3]获取最新的release源码。这里下载.
编译安装
安装参考源码内的INSTALL文件,确保automake,autoconf,都已经安装,并且满足版本要求,这里直接给出步骤:
$autoreconf -i
$./configure
$make -s -j4
$make install
验证
$sox --version
sox: SoX v
使用
当完成SoX的编译安装后,除了可以使用"sox"命令外,默认还生成了动态库和静态库供我们编程使用。
1. 命令行
因为命令行参数过多,这里不详细介绍。可参考以下资料:
参看官方文档[3].
这里有个中文版[4].
其他参考资料[5].
2. 库
安装完成后,默认头文件安装在/usr/local/include,库文件安装在/usr/local/lib目录下。
头文件:
#include "sox.h"
编译连接:
gcc source.c -l sox -I/usr/local/include -L/usr/local/lib
3. 举例
拿均衡器举例,
均衡器(Equalizer),可以分别调节信号各种频率成分,通常用来,对各种不同频率的信号的调节来补偿扬声器和声场的缺陷及其它特殊作用。
IMPULSE.wav是单位冲激响应,频谱图如下,是一条直线,即所有频率的能量都是一样的。
sox IMPULSE.wav song.wav equalizer 100 1.5q 12 equalizer 1000 2.0q -12
经过上述命令处理后,我们发现频谱发生了变化,在100hz位置有增益,在1000hz位置有衰减。通过这个图我们也对equalizer施加的影响有了直观的认识。
我们如何通过编程实现呢?
直接上代码,详细注释,关键几个函数。
#include "sox.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
int main(int argc, char * argv[])
{
static sox_format_t * in, * out; /* input and output files */
sox_effects_chain_t * chain;
sox_effect_t * e;
char * args[10];
//在使用sox前调用,初始化全局参数
assert(sox_init() == SOX_SUCCESS);
//打开输入文件
assert(in = sox_open_read(argv[1], NULL, NULL, NULL));
//打开输出文件,必须制定输出信号特征(第二个参数),这里简单演示,使用in一致的信号特征
assert(out = sox_open_write(argv[2], &in->signal, NULL, NULL, NULL, NULL));
//创建一个效果链
chain = sox_create_effects_chain(&in->encoding, &out->encoding);
//创建一个最简单的效果,输入文件
e = sox_create_effect(sox_find_effect("input"));
args[0] = (char *)in, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
//增加效果到效果链
assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
free(e);
//创建第一段equalizer效果器
e = sox_create_effect(sox_find_effect("equalizer"));
args[0] = "100";
args[1] = "1.5q";
args[2] = "12";
assert(sox_effect_options(e, 3, args) == SOX_SUCCESS);
//增加效果到效果链
assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
free(e);
//创建第二段equalizer效果器
e = sox_create_effect(sox_find_effect("equalizer"));
args[0] = "1000";
args[1] = "2.0q";
args[2] = "-12";
assert(sox_effect_options(e, 3, args) == SOX_SUCCESS);
//增加效果到效果链
assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
free(e);
//输出到文件的效果器
e = sox_create_effect(sox_find_effect("output"));
args[0] = (char *)out, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
free(e);
//让整个效果器运行起来,直到遇到eof
sox_flow_effects(chain, NULL, NULL);
//clean
sox_delete_effects_chain(chain);
sox_close(out);
sox_close(in);
sox_quit();
}
编译,运行
$gcc test.c -I /usr/local/include -L/usr/local/lib -lsox
$./a.out ./a.out IMPULSE.wav IMPULSE1.wav
打开IMPULSE1.wav可以看到,达到的效果和命令行是一致的。
参考资料
[1].http://sox.sourceforge.net
[2].https://github.com/chirlu/sox
[3].http://sox.sourceforge.net/sox.html
[4].https://blog.csdn.net/p222p/article/details/77624046
[5].https://www.jianshu.com/p/be8977de4a6b