SoundTouch音频处理库的简单使用(音调、音速、声道等等)

音频的处理,通常会涉及到音调、音速或者声道的切换,例如睡觉时,开车时,跑步时,party,吃饭时等等根据不同场景我们也许会要求音乐能有不同的意境变化,强大的soundtouch音频开源库基于C++的底层算法处理,为我们应用层的开发者提供了非常便捷的调用接口。下面我们来一步步分析soundtouch的结构以及是如何使用的。

结构:
1.首先我们打开soundtouch源码,看到初始化so库的操作:

static {
        System.loadLibrary("soundtouch");
    }

那么soundtouch.so里是什么鬼?打开c++源码:
SoundTouch音频处理库的简单使用(音调、音速、声道等等)_第1张图片
SoundTouch 类的声明包含在SoundTouch.h和SoundTouch.cpp之中,由FIFOProcessor类直接派生,而FIFOProcessor类又直接从基类FIFOSamplePipe派生。同时声明SoundTouch这个类包含在命名空间 soundtouch,这就是为什么我们使用这个库的时候需要声明命名空间的且仅仅定义了一些常量,诸如版本号,版本ID号等等,这两个父类都包含在FIFOSamplePipe.h和FIFOSamplePipe.cpp文件中。不管什么库,如果要使用的话,一般的流程都是先定义然后进行一些必要的初始化。

2.其次,我们看看经常使用的拓展类(直接调用soundtouch库的java类):

基类:

SoundTouch音频处理库的简单使用(音调、音速、声道等等)_第2张图片
SoundTouch音频处理库的简单使用(音调、音速、声道等等)_第3张图片

主类:

SoundTouch音频处理库的简单使用(音调、音速、声道等等)_第4张图片

通过上面的引用方式我们发现主类SoundStreamAudioPlayer是一个线程,异步处理的方式,也就是说在播放过程中我们可以实时地修改音频频率参数,这为我们的开发可谓是解决了大麻烦!

使用:

1.提供音频源:
a.我们可以将制订的媒体放在sdcard中,然后将路径传给SoundStreamAudioPlayer:

SoundStreamAudioPlayer player = new SoundStreamAudioPlayer(0, f.getPath(), tempo, pitchSemi);

b.通过录音采集媒体源:
这里想要重点提一下关于录音,soundtouch在录音方面也做了处理,就是用户可以根据调节的频率参数,在录音完毕后通过录音类SoundStreamAduioRecorder中的AudioTrack,不断完成声音的采集,最后将采集的声音源改变音轨。SoundStreamAduioRecorder自身提供了startRecord、stopRecord、startPlay、stopPlay方法,很明显这是录音和播放的方法。

SoundTouch库其实是一个非常强大,源码非常复杂但应用层接口的调用非常简单的一个音频调节工具,目前我只是刚接触不久,在开发中曾简单使用过,后续的探索会根据需要不断深入,相信美好的东西是经过时间的打磨产生的!

小结:
关于SoundTouh的底层算法想要了解的详见博友“suhetao的专栏”:http://blog.csdn.net/suhetao/article/details/5843480

本人整理了一个完整关于SoundTouch使用的Demo已上传到GitHub,欢迎下载:https://github.com/yinzhengwei/SoundTouchDemo

你可能感兴趣的:(音频,流媒体技术)