我对媒体播放器的使用非常典型,仅在尝试设置播放参数时出现问题。
创建媒体播放器
mediaplayer mmediplayer=new mediaplayer();
将setdatasource设置为已知工作的本地中介文件
mmedipayer.prepareAsync();
onprepared()回调调用mmediplayer.start()
如果我打电话给:
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(2.0f));
}
在调用mmediplayer.start()之前,播放速度会按预期受到影响,不会出现异常。如果我将setspeed()调用放在mmediplayer.start()调用之后,应用程序将因IllegateStateException而崩溃。
有趣的是,这只发生在手机(nexus 5,priv)上,但在测试的平板电脑(nexus 7和9)上运行良好。
我看到的一些建议提到暂停音频并等待几百毫秒,但没有帮助。
根据文档设置的播放速度,当音频播放时是完全可以接受的。有人知道这是怎么回事吗?我花了太多时间调查这个。
谢谢!
最佳答案
我对这个问题的解决方案是确保当速度通过滑动窗口小部件改变时,媒体播放器被重置(通过mmediplayer.reset()),然后重新配置,暂停或停止是不够的。
在滑块回调中,我现在存储用户指定的速度,重置媒体播放器并调用play以恢复媒体播放器在重置前关闭的位置。(以前,这是更改播放参数和引发崩溃的地方)
public void onStopTrackingTouch(DiscreteSeekBar discreteSeekBar) {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
mSpeed = speed;
mMediaPlayer.reset();
play(mCurrentMediaId);
}
}
play()重新配置媒体播放器并最终调用mmediplayer.asyncPrepare();这将导致要执行的onPrepared()回调,它基本上调用mmediplayer.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;dr;mediaplayer.reset()。