音乐Visualizer类的错误 setCaptureSize() called in wrong state: 2 的解决办法

       这几天在做音乐可视化,就是把音乐的频谱通过图像动态地显示出来。这个功能的实现主要是通过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);
    }


     增加了上面红色的代码后,再运行程序。播放,暂停,下一首,上一首,程序正常运行,而且能显示出频谱图。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值