文章目录

  • SoX系列(一)——编译和使用
    • 编译安装
    • 使用
      • 1. 命令行
      • 2. 库
      • 3. 举例
  • 参考资料

SoX系列(一)——编译和使用

SoX号称是声音处理程序的瑞士军刀,是一个跨平台(Windows、Linux、MacOS X 等)命令行实用程序,可以将各种格式的计算机音频文件转换为其他格式。它还可以对这些声音文件应用各种效果,而且一个额外的好处是,SoX 可以在大多数平台上播放和录制音频文件。[1]

要使用编译好的二进制程序,可访问官网下载。或者向本文介绍的,使用源码进行编译后安装。

编译安装

源码获取

通过github主页[3]获取最新的release源码。这里下载.

编译安装

安装参考源码内的INSTALL文件,确保automake,autoconf,都已经安装,并且满足版本要求,这里直接给出步骤:

 $autoreconf -i$./configure$make -s -j4$make install

验证

 $sox --versionsox:      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);//让整个效果器运行起来,直到遇到eofsox_flow_effects(chain, NULL, NULL);//cleansox_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

SoX系列(一)——编译和使用相关推荐

  1. 运行时常量池在哪里_C++干货系列——从编译期常量谈到constexpr(一)

    C++20都支持虚函数的constexpr了,我打算用三篇读文章讲清楚编译期常量和constexpr这个东西和编译期常量的关系,即为什么需要他来辅助解决这个问题.最后帮助读者在实际编码过程中能够有意识 ...

  2. Android APK系列4-------Android编译APK后的系统结构

    Android APK系列4-------Android编译APK后的系统结构 system文件夹就是system.img的解压结果,data就是userdata.img的解压结果,root就是ram ...

  3. win10编译OpenCV4Android系列1-Android编译环境搭建

    win10编译OpenCV4Android系列1-Android编译环境搭建 前言 一.配置JDK 1.下载JDK 2.安装JDK 二.配置AndroidSDKTools 1.下载AndroidSDK ...

  4. IMX8M系列 yocto编译镜像及demo编译(MYD-JX8MX)

    IMX8M系列 yocto编译镜像及demo编译(MYD-JX8MX) 前段时间由于工作需要,研究了一下米尔的MYD-JX8MX开发板,用的是NXP 的IMX8M型号芯片,说实话,官方提供的文档描述的 ...

  5. Android 音视频开发实践系列-01-ndk-build编译rtmpdump

    在上一篇Android开发实践之<NDK和JNI极速初体验>,留了一个坑: 独立工具链因官方已弃用不再介绍, ndk-build下一篇文章单独介绍,本文使用AndroidStudio新建的 ...

  6. React Native系列(6) - 编译安卓私有React-Native代码

    为何要自己编译React Native安卓私有代码 我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见 React-Nat ...

  7. 认真学习系列:编译原理——B站笔记

    通过一个专门管翻译的机器--编译器. 一.编译器是什么 源程序→预处理器→经过预处理的源程序→编译器→汇编语言程序→汇编器→可重定位的机器代码→链接器/加载器→目标机器代码. 编译器的结构: 与源语言 ...

  8. 仙剑奇侠传2java_仙剑奇侠传1系列:2.编译主程序SDLPAL及SDL

    介绍 仙剑奇侠传1是dos时代的经典游戏,相信以下图片能勾起大家的很多回忆. sdlpal是仙剑奇侠传1的主程序.github项目sdlpal,项目地址:https://github.com/sdlp ...

  9. 30系列显卡编译可变性卷积(DCNv2)

    配置 系统:ubuntu 18.04 显卡:3070 cuda11.1 torch1.8.0 编译DCNv2 试过很多版本,但是都会报错 RuntimeError:Error compiling ob ...

最新文章

  1. let/var——事实上var的设计可以看成JavaScript语言设计上的错误. 但是这种错误多半不能修复和移除, 以为需要向后兼容.||将let看成更完美的var
  2. 【两分钟带你了解树】数据结构04-树结构的概述
  3. load xml error什么意思_XML文件解析实践(DOM解析)
  4. 数据库原理 简单基础入门
  5. 重磅预售 | 分子生物学与遗传学经典名著——《Lewin基因XII》(中译本)
  6. [Android1.6]横竖屏切换时自动弹出键盘的问题
  7. HRBUST 1473 教主的遗产【状态压缩】
  8. Oracle11g x64使用Oracle SQL Developer报错:Unable to find a Java Virtual Machine
  9. java 中button和jbutton输出的按钮不一样_Java学习教程(基础)--Java开发环境搭建
  10. ORA29902执行ODCIIndexStart()例行程序中出错 SQL空间查询ST_Geometry配置
  11. excel多个窗口独立显示_细说丨你想要的Excel保护与加密都在这里
  12. oracle lpad nvl,Oracle的Lpad函数
  13. NDK 开发实战 - 微信公众号二维码检测
  14. word公式编辑器输入斜体
  15. Tensorflow2.* 加载和预处理数据之用 tf.data 加载 Numpy数据(2)
  16. 我喜欢这首歌......
  17. 信号转换芯片-LT8911EXB MIPI CSI/DSI转EDP
  18. Javascript:ES6-ES11(1)
  19. 苦练基本功之分布式系统学习
  20. 期末测验: 课程水平综合测验 (第10周)

热门文章

  1. 浅谈异或(^),与(),或(|)
  2. SpringMVC入门+Mybatis实践demo
  3. 【SSH项目实战】国税协同平台-2.环境搭建和整合
  4. tensorflow 3.滑动平均模型
  5. 黑暗中的YOLO:解决黑夜里的目标检测 | ECCV 2020
  6. Camera2暗光场景很暗原因
  7. OpenCV2马拉松第2圈——读写图片
  8. css文字强制不换行
  9. 用计算机找一个人,我可以通过ID号找到一个人的位置吗?
  10. L1L2正则化图形解读