Android音乐可视化实现

1,910 阅读4分钟

前言

一直对于音乐可视化非常感兴趣,正好工作中涉及到这一块,所以整理一下,用Android实现一个简单音乐可视化的播放器。

基础知识

1、音量

人主观上感觉到的声音大小(也叫响度),由“振幅”(amplitude)和人离声源的距离决定。

2、音调

声音的高低(高音、低音),由“频率”(frequency)决定,频率越高音调越高。

3、音色 音色是一种抽象的东西,波形决定了声音的音色。声音因不同发声物体材料而具有不同特性,波形是把这个抽象特性直观的表现出来。典型的音色波形有方波,锯齿波,正弦波,脉冲波等。

4、采样   所谓采样,即按一定的采样频率将模拟信号变成时间轴上离散的抽样信号的过程。原则上采样频率越高,声音的质量也就越好,声音的还原也就越真实。   采样率即每秒从模拟信号中提取并组成离散信号的采样个数,用赫兹(Hz)来表示。说到采样率有一个不得不提的著名定律,即香农(Shannon)/奈奎斯特(Nyquist)采样定律,该定律表明采样频率必须大于或等于所传输的模拟信号的最高频率的2倍,才能不失真地恢复模拟信号。

5、 量化   前面采样得到的抽样信号虽然是时间轴上离散的信号,但仍然是模拟信号,其采样值在一定的取值范围内,可有无限多个值,必须采用“四舍五入”的方法把样值分级“取整”,使一定取值范围内的样值由无限多个值变为有限个值,这一过程称为量化。 6、编码   量化后的抽样信号就转化为按抽样时序排列的一串十进制数字码流,即十进制数字信号。简单高效的数据系统是二进制码系统,因此,应将十进制数字码变换成二进制编码,这种把量化的抽样信号变换成给定字长(量化位数)的二进制码流的过程称为编码。   编码方式种类非常多,其对比可见 Comparison of audio coding formats,PCM音频格式编码常见有四种:PCM(Linear PCM)、ADPCM(Adaptive differential PCM)、 A-law(A律13折线码)、μ-law(μ律15折线码),最简单的当然是下图所示的LPCM(示例为4bit),这是一种均匀量化编码,广泛用于 Audio CD, AES3, WAV, AIFF, AU, M2TS, VOB中。   在这里插入图片描述

模拟信号到数字信号的过程

在这里插入图片描述 同过上面的图可以看出,模拟信号通过pam后生成采样信号,然后通过量化生成了-127到+127之间的数据,最后通过二进制存放。   

Visualizer

有了上面的基础知识,可以知道音乐可视化其实可以通过量化后的数据去生成音乐的可视化内容,google官方提供了Visualizer类来帮助实现音乐可视化,这个类主要是可以返回音乐的Waveform data和Frequency data 1、Waveform data waveform data 波形数据,就是上面图中模拟信号经过处理后的数据,google提供的是一个8bit的无符号数据。

2、Frequency data Frequency data 就是频率数据,频率数据是通过快速傅里叶转换,把时域上连续的信号(波形)强度转换成离散的频域信号(频谱)

Visualizer使用

1、获取实例

visualizer = new Visualizer(mediaPlayer.getAudioSessionId());

2、设置采样值

visualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);

通过Visualizer.getCaptureSizeRange()这一底层实现的方法来返回一个采样值的范围数组,0为最小值128,1为最大值1024!采样值都为2的n次幂!

3、设置监听器

setDataCaptureListener(OnDataCaptureListener listener, rate,iswave,isfft )

先说后面三个参数:rate采样的频率,下边通过方法Visualizer.getMaxCaptureRate()返回最大的采样频率,单位为milliHertz毫赫兹,iswave是波形信号,isfft是频域信号。 第一个参数OnDataCaptureListener接口,这里可以一个它的匿名内部类,然后它有两个回调方法:

onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate)

onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate)

这两个回调对应着上边的两个参数iswave和isfft!如果iswave为true,isfft为false则会回调onWaveFormDataCapture方法,如果iswave为false,isfft为true则会回调onFftDataCapture方法。

音乐可视化实现

music.gif

代码实现

未完待续....

项目地址

github.com/hankinghu/A…

参考

1、developer.android.com/reference/a…