Horizon-开源音频可视化库介绍
英文原文:Introducing Horizon, Our Own Open Source Library for Sound Visualization
Yalantis最近发布了几个具有音频录制功能的app。Halaa 就是我们音频技术的最新例子。每次我们想添加音频效果的时候,我们都需要处理许多问题。
首先,对于音频文件的分析,目前没有简单而又方便的安卓库。我们承认有一些比较优秀的声音处理库,比如TarsosDSP,Sound Powered, ffmpeg等等。但是它们都太庞大而又复杂,尤其是对那些对音频理论一窍不通的人。
其次,为了动画流畅,音频必须被快速的分析和渲染。虽然已经有了可以快速渲染的开源解决方案,但是这些解决方案都只针对音频动画的某几个方面的问题,而不是全部。
在我们的研究期间,有三个解决方案吸引了我们的注意。虽然这些方案不是我们理想中的分析和可视化方案,但是它们为我们展示了那些可以进行改进的地方。
为什么这三个库没有为音频可视化提供很好的解决办法?
1. CRAudioVisualizationView
提供了比较美观的动画,CRAudioVisualizationView是我们发现的最佳开源可视化工具。它产生平滑的声音波浪效果。这个方案采用OpenGL来实现,因此没有性能fang面的问题。但是这个库的缺点是它是基于Android原生Visualiser(频谱器)。这意味着你不能把动画和麦克风实时输入联系起来。换句话说,无法在录制声音的时候使用这个library。
2. AudioVisualizer
AudioVisualizer library提供了多种视觉效果,但是它和CRAudioVisualizationView有相同的缺点。此外,它所有的效果都有点过时了,让你觉得是在用着一个Windows Media Player。
3. VisualAudio
最后有人提供了他们自己的音频分析!但是在视觉效果方面又过于基础,只显示声音的频谱。这个库看起来就是一个为从事傅立叶变换工作的人准备的教程。
Horizon: a Library That Visualizes Sound Quickly and Beautifully
我们决定为我们的音频项目创建自己的音频Visualizer(频谱器) 。于普遍看法不同的是,Horizon证明了其实安卓在音频方面也很在行。
对于Horizon库,我们又两个主要的目标:
-
出色的性能
-
出色的图像
性能
对于一个安卓app来说,并没有多少可以显著提高性能的方法。我们要应对的第一个问题就是计算。要分析声音频谱并显示在View上,你需要做许多数学计算,并且要做的迅速。
绝大多数声音分析都是用c++实现的。这种语言减少了获取声音频谱所需要的时间。虽然绝大多数分析代码都是用c++写的,但是为了让我们的控件更易自定义,在我们还是用了java做少量计算。
绘制
Horizon的设计让人联想到海上日出的情景。这也是我们把library命名为Horizon(地平线)的原因(还有个原因是我们喜欢Bring Me the Horizon乐队)。你可以在 Dribbble 和 Github上查看Horizon。
我们控件的颜色和形状必须清新夺目,这就是为什么我们需要实现恰当的blending。同时,为了尽可能快的绘制所有曲线,我们使用OpenGL来实现绘制,以达到流畅的用户体验。
Horizon是一个显示特定音频数据频谱信息的漂亮组建。
你可以从这个视频中看到Horizon的实际表现:
注:视频请翻q。
我们想感谢我们的iOS工程师同时也是 Zagreb music乐队成员的Zagreb和 Igor Muzyka,是他们演奏了一些音乐来测试Horizon。
如何在你的项目中添加Horizon?
三个步骤
1.添加依赖
compile 'com.yalantis:eqwaves:1.0'
2.初始化Horizon对象
mHorizon = new Horizon(glSurfaceView, getResources().getColor(R.color.background),
RECORDER_SAMPLE_RATE, RECORDER_CHANNELS, RECORDER_ENCODING_BIT);
3.调用updateView方法来更新Horizon
byte\[\] buffer = new byte\[bufferSize\];
//here we put some sound data to the buffer
mHorizon.updateView(buffer);
在下面三个地方查看Horizon sound visualizer: