SoX(Sound eXchange)安装与使用详解
安装SoX
安装依赖
libmp3lame
libmp3lame是目前最好的mp3编码器,编码高质量mp3最好也是唯一的选择。
[root@ecs ~]# yum install -y lame-devellame-devel包含了libmp3lame.so,SoX调用libmp3lame.so实现解码mp3功能。
windows sox默认不支持编解码mp3,需要依赖
libmp3lame-0.dll和libmad-0.dll才能实现编解码功能。将wav等音频格式转为mp3时,使用libmp3lame-0.dll进行编码。将mp3转为wav等格式时,使用libmad-0.dll进行解码。linux lame即可以编码,也可以解码mp3、wav和aif格式,等效于windows sox + libmp3lame-0.dll + libmad-0.dll。
wav转mp3
[root@ecs ~]# lame -h input.wav output.mp3mp3转wav
[root@ecs ~]# lame input.mp3 output.wav
libmad
libMAD是一个开源的高精度MPEG音频解码库,支持MPEG-1。MPEG-1音频分3层,分别是:MPEG-1 Layer1、MPEG-1 Layer2和MPEG-1 Layer3(简称mp3)。
[root@ecs ~]# yum install -y libmad-devel虽然lame工具有解码mp3的功能,但libmp3lame并不具备解码mp3的功能,因此SoX需要依赖libmad实现mp3解码功能。
id3tag
mp3格式标准里没有特别定义保存曲目相关信息的结构,于是在1996年有人提出在mp3文件的末尾添加128字节额外的数据空间用于存储歌曲名、演唱者、专辑名、音轨编号、曲目类型等信息,这些信息成为ID3Tag。
[root@ecs ~]# yum install -y libid3tag-devel zlib-devel注:sox编译id3tag时依赖zlib库。
towlame
TwoLAME is an optimised MPEG Audio Layer 2 (MP2) encoder based on tooLAME by Mike Cheng, which in turn is based upon the ISO dist10 code and portions of LAME.
[root@ecs ~]# yum install -y twolame-devel注:twolame-devel自动安装twolame-libs。lame-devel、libmad-devel和twolame-libs均来自epel源,需要先安装epel源。
flac
flac是一套著名的自由音频无损压缩编码器,不同于其它有损编码(mp3、aac等),flac不会破坏任何原有的音频信息。
[root@ecs ~]# yum install -y flac-develvorbis
有损音频编解码器(需配合ogg容器使用),完全免费、开放,没有专利限制。
[root@ecs ~]# yum install -y libvorbis-developus
有损音频编解码器,和vorbis都是由xiph.org基金会开发。opus后由IETF(互联网工程任务组)进行标准化,目的用一种格式包含声音和语音,取代speex和vorbis。
[root@ecs ~]# yum install -y opusfile-develwindows可以使用opus-tools实现ogg音频转换,opus-tools等效于sox + libogg-0.dll。
wav转ogg
[root@ecs ~]# opusenc input.wav output.oggogg转wav
[root@ecs ~]# opusdec input.ogg output.wav查看ogg信息
[root@ecs ~]# opusinfo input.ogg
amr
全称Adaptive Multi-Rate,自适应多速率编码,主要用于移动设备的音频,压缩比大,但相对其他的压缩格式质量差,多用于人声通话。amr一般是指amr-nb,8kHz采样,有8种比特率的编解码算法,另外有amr-wb,16kHz采样,有9种比特率的编解码算法。由于amr-wb采样率高,所以复杂度大概是amr-nb的两倍。amr-nb和amr-wb都属于speech codec,对audio的编码效果并不好。
[root@ecs ~]# yum install -y gcc-c++ [root@ecs ~]# tar -zxvf opencore-amr-0.1.6.tar.gz && cd opencore-amr-0.1.6 [root@ecs opencore-amr-0.1.6]# ./configure [root@ecs opencore-amr-0.1.6]# make && make install或者:
[root@ecs ~]# cd /usr/local/src [root@ecs src]# rpm -ivh opencore-amr-devel-0.1.6-1.el7.x86_64.rpm注:opencore-amr(包含amrnb和amrwb)
wavpack
由David Bryant于1998年开发的一款自由、开放的无损音频编解码器。
[root@ecs ~]# yum install -y wavpack-devellibsndfile
一款专注于音频文件读写的跨平台C语言库,支持wav、flac等主流格式,适用于音频数据处理、格式转换等场景。sox通常自带对大量音频格式支持,同时也支持通过libsndfile库扩展其格式处理能力,sox不强制依赖libsndfile。
[root@ecs ~]# yum install -y libsndfile-devellibmagic
智能处理没有扩展名或扩展名错误的音频,通过读取文件头部的magic number来确认真实格式。
[root@ecs ~]# yum install -y file-devel
安装驱动
ALSA
[root@ecs ~]# yum install -y alsa-lib-devel不安装驱动不影响SoX的音频处理能力,但会导致
play和rec命令无法调用系统的扬声器和麦克风。PulseAudio
[root@ecs ~]# yum install -y pulseaudio-libs-develAO
[root@ecs ~]# yum install -y libao-devel安装libao-devel会自动安装flac-libs、libogg、libsndfile、libvorbis和pulseaudio-libs等。
安装SoX
[root@ecs ~]# yum install -y gcc libtool-ltdl-devel
[root@ecs ~]# cd /usr/local/src && tar -zxvf sox-14.4.2.tar.gz && cd sox-14.4.2
[root@ecs sox-14.4.2]# ./configure --prefix=/usr/local/sox \
--enable-dl-amrnb \
--enable-dl-amrwb \
--enable-dl-lame \
--enable-dl-mad \
--enable-dl-twolame \
--enable-dl-sndfile \
--enable-shared
[root@ecs sox-14.4.2]# make -s && make install
[root@ecs sox-14.4.2]# echo export PATH="\$PATH:/usr/local/sox/bin" >> /etc/profile
[root@ecs sox-14.4.2]# source /etc/profile将--enable-shared改成--enable-static可以生成静态文件,对比生成的sox程序大小:
ll -h /usr/local/sox/bin/sox注:
--enable-dl-*生效,必须先安装libtool-ltdl-devel。- 如果使用
--enable-dl-amrnb,可无需安装opencore-amr。 --enable-dl使用动态链接,推荐搭配--enable-shared,不使用--enable-dl则可以使用--enable-static。
安装脚本
[root@ecs ~]# yum install -y gcc lame-devel libmad-devel libid3tag-devel zlib-devel twolame-devel \
flac-devel \
libvorbis-devel opusfile-devel \
wavpack-devel libsndfile-devel file-devel \
alsa-lib-devel pulseaudio-libs-devel \
libtool-ltdl-devel
[root@ecs ~]# cd /usr/local/src
[root@ecs src]# rpm -ivh opencore-amr-0.1.6-1.el7.x86_64.rpm opencore-amr-devel-0.1.6-1.el7.x86_64.rpm
[root@ecs src]# tar -zxvf sox-14.4.2.tar.gz && cd sox-14.4.2
[root@ecs sox-14.4.2]# ./configure --prefix=/usr/local/sox \
--enable-dl-amrnb \
--enable-dl-amrwb \
--enable-dl-lame \
--enable-dl-mad \
--enable-dl-twolame \
--enable-dl-sndfile \
--enable-shared
[root@ecs sox-14.4.2]# make -s && make install
[root@ecs sox-14.4.2]# echo export PATH="\$PATH:/usr/local/sox/bin" >> /etc/profile
[root@ecs sox-14.4.2]# source /etc/profile
[root@ecs sox-14.4.2]# sox --version
sox: SoX v14.4.2操作SoX
sox可以处理self-describing和raw格式音频文件,self-describing音频包含一个用于描述编码属性的文件头(如wav、flac、mp3等),而raw格式不包含这些信息,使用sox时需要通过以下选项指定相关信息:
| 参数 | 说明 |
|---|---|
| -b, --bits | 指定采样大小 音频采样时用于存储每个样本的数据位数(bits),目前广泛使用的是16bit采样大小 |
| -c, --channels | 指定通道数 文件包含的音频通道数量。目前常见的有单声道(mono)和双声道(stereo) |
| -e, --encoding | 指定编码器 |
| -r, --rate | 指定采样率 指声音由模拟信号(平滑的波形)转换成数字信号(锯齿的波形)的过程中,每秒从连续信号中提取的用于组成离散信号的样本个数。CD的采样率通常使用44100Hz,即1秒内采样44100次 |
| -t, --type | 指定音频文件类型 |
| -C | 指定比特率大小 一个单位时间内编码音频信号占用的存储空间大小 未压缩格式(wav)比特率不能指定,而是通过采样率 × 采样位深 × 声道数计算而来 对于有损压缩,可以按照指定大小做限制 |
播放音频
[root@ecs ~]# sox input.wav -t waveaudio -d-t waveaudio:指定输出文件类型为waveaudio(windows特有设备驱动程序别名,代表声卡输出)-d:代表输出设备为默认(default)设备- linux系统去掉
-t waveaudio(windows专属) 放大音量
[root@ecs ~]# sox input.wav -t waveaudio -d vol 2.02倍速播放
[root@ecs ~]# sox input.wav -t waveaudio -d tempo 22倍速播放
[root@ecs ~]# sox input.wav -t waveaudio -d speed 2speed 2会重新采样,丢掉一半的采样点,加原本1秒的数据压缩到0.5秒内播放完,速度和音调都会翻倍。
录音
从默认设备(麦克风)读取音频数据,输出(录制)到record.mp3文件。
[root@ecs ~]# sox -t waveaudio -d record.mp3获取音频元数据
[root@ecs ~]# sox --i input.flac查看比特率
[root@ecs ~]# sox --i -B input.flac双声道变单声道
[root@ecs ~]# sox input.flac -c 1 output.mp3融合声道
将左右声道的数据融合(mix)成单声道。
[root@ecs ~]# sox input.flac output.mp3 remix 1,2合并声道
[root@ecs ~]# sox -M left.wav right.wav output.flacmp3最多支持双声道,当声道数超过2个时,不能导出mp3。
放大音量
[root@ecs ~]# sox -v 1 input.wav output.wav为了防止过大造成消波,可以使用
sox input.wav -n stat -v查看可放大倍数。裁剪
[root@ecs ~]# sox input.flac output.wav trim 0 30 [root@ecs ~]# sox input.flac output.wav trim 2:00 1:00trim接收2个参数,第一个参数为裁剪的起始位置,第二个参数为音频持续时间。持续时间可以为正整数(单位秒),也可以使用
hh:mm:ss.fs时间格式。拼接
[root@ecs ~]# sox input1.mp3 input2.mp3 output.mp3拼接不同于-M合并,拼接是将所有音频放在同一个声道按顺序连接到一起。
混合
[root@ecs ~]# sox -m input.flac -v 1.1 input.wav output.mp3将input.flac音量提高1.1倍后与input.wav融合(mix)。
注:-m(Mix)是将输入音频相同声道的数据进行叠加,叠加后声道数据不可逆。而-M(Merge)是将输入音频存放于不同的声道,每个声道的数据是相互独立的。