setPlaybackParams 导致 IllegalStateException

问题描述 投票:0回答:1

我对媒体播放器的使用非常典型,仅在尝试设置播放参数时才出现问题。

  1. 创建媒体播放器 MediaPlayer mMediaPlayer = new MediaPlayer();
  2. 将DataSource设置为已知可以工作的本地中介文件
  3. mMediaPlayer.prepareAsync();
  4. OnPrepared()回调调用mMediaPlayer.start()

如果我打电话:

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
     mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(2.0f));
}

在调用 mMediaPlayer.start() 之前,播放速度按预期受到影响,没有发生异常。如果我在 mMediaPlayer.start() 调用之后调用 setSpeed() ,应用程序将崩溃并出现 illegateStateException。

有趣的是,这只发生在手机(nexus 5、priv)上,但在测试的平板电脑(nexus 7 和 9)上运行良好。

我看到的一些建议提到暂停音频并等待几百毫秒,但这没有帮助。

根据文档,在播放音频时设置播放速度是完全可以接受的。有人知道这里发生了什么事吗?我花了太多时间调查这个。

谢谢!

android media-player android-mediaplayer
1个回答
7
投票

我对这个问题的解决方案最终是确保当通过滑块小部件更改速度时,媒体播放器被重置(通过

mMediaPlayer.reset()
)然后重新配置,暂停或停止是不够的。

在滑块回调中,我现在存储用户指定的速度,重置媒体播放器并调用播放以恢复媒体播放器在重置之前停止的位置。 (之前是这里更改了播放参数导致崩溃的)

public void onStopTrackingTouch(DiscreteSeekBar discreteSeekBar) {
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
         mSpeed = speed;
         mMediaPlayer.reset();
         play(mCurrentMediaId);
    }
}

play()
重新配置媒体播放器并最终调用
mMediaPlayer.asyncPrepare();
,这会导致执行
onPrepared()
回调,它基本上调用
mMediaPlayer.start()
,在此调用之前我配置了播放参数:

onPrepared()
回调中:

if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
        mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(mSpeed));
    }
    mMediaPlayer.start();
    mState = PlaybackState.STATE_PLAYING;
            ...

tl;博士;

MediaPlayer.reset()
在某些设备上更改播放参数之前。

© www.soinside.com 2019 - 2024. All rights reserved.