这几天在做音乐可视化,就是把音乐的频谱通过图像动态地显示出来。这个功能的实现主要是通过Visualizer类和MediaPlayer类的配合。能够想到要做这种功能的开发者,一般都对MediaPlayer类熟练了,不然也不会想到要做这种复杂的功能。关于Visualizer类的介绍的文章有很多,不过基本都是复制黏贴的,不过这样也好,让我们能对这个Visualizer类更加熟悉。所以这里也不再介绍这个类了,读者可以百度一下,有很多介绍。
就来说一下我遇到的问题。这是部分关键代码:
public void initVisualizer(){
int audioSessionid = 0;
audioSessionid = MusicService.mPlayer.getAudioSessionId();
Log.e("audioSessionid","audioSessionid="+audioSessionid);
mVisualizer = new Visualizer(audioSessionid);
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[0]);
//BaseVisualizerView类是一个开源项目的类,大家可以上github搜
mBaseVisualizerView.setVisualizer(mVisualizer);
mVisualizer.setEnabled(true);
}
这个方法在MediaPlayer.OnPreparedListener的OnPrepare()之后调用。
播放音乐,然后能够看到音乐的频谱图形,点击暂停,频谱图形逐渐消失。然后切换下一首,程序就崩溃了。
日志输出有这么一句:setCaptureSize() called in wrong state: 2。
代码错误指示的地方在这一句:mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[0]);
在网上搜了很多资料,许多开发者说是mVisualizer.setEnabled(false)没有调用才会出现这种错误。于是我尝试在多个地方加入这一句。最终,我发现了成功的方法。代码修改如下:
public void initVisualizer(){
int audioSessionid = 0;
audioSessionid = MusicService.mPlayer.getAudioSessionId();
Log.e("audioSessionid","audioSessionid="+audioSessionid);
if(mVisualizer != null){
mVisualizer = null;
}
mVisualizer = new Visualizer(audioSessionid);
mVisualizer.setEnabled(false);
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[0]);
mBaseVisualizerView.setVisualizer(mVisualizer);
mVisualizer.setEnabled(true);
}
增加了上面红色的代码后,再运行程序。播放,暂停,下一首,上一首,程序正常运行,而且能显示出频谱图。