前言
播放媒体测试时,出现Mediaplayer报异常问题,如下打印日志
MediaPlayerNative(13594): start called in state 4, mPlayer(0x75b4e81280) MediaPlayerNative(13594): error (-38, 0) MediaPlayer(13594): Error (-38,0)
记录于此,以便查阅。
总结
原因 :Mediaplayer没有准备好(preparing状态)就开始调用start()方法了。
总结一下:
- 不使用prepareAsync()方法
//mMediaPlayer.prepareAsync(); mMediaPlayer.prepare(); mMediaPlayer.start();
- 监听onPrepared(MediaPlayer iMediaPlayer)回调时start()
- prepare()会阻塞直到获取到数据,prepareAsync()异步,不会阻塞到数据全部获取成功。
个人还是推荐当onPrepared()回调后开始播放,这个表示有数据已经准备好了。
正文
网上也有分析这个问题,这里就简单的附上自己的观点。
使用prepareAsync():
mMediaPlayer.reset(); mMediaPlayer.setDataSource(path); mMediaPlayer.prepareAsync(); mMediaPlayer.start();
按照这个代码片段执行,一定会出现异常,日志如[前言]所示。
使用prepare():
mMediaPlayer.reset(); mMediaPlayer.setDataSource(path); mMediaPlayer.prepare(); mMediaPlayer.start();
prepare()会阻塞到数据完全加载,也就是准备好了,不会出现异常。
但是,上面执行的代码只理想状态,按顺序执行,但是现实测试中,当执行到prepare()时用户是还可以死劲操作的(你懂的 哈哈_)。
所以,需要考虑加锁和onPrepared()回调了执行播放才是最完美的。
什么时候用prepare()和调用prepareAsync()
下面是源码中注释的区别(机器翻译)
- 对于流,调用prepareAsync(),它会立即返回,而不是阻塞直到有足够的数据缓冲。
- 对于文件,调用prepare(),它会阻塞直到MediaPlayer准备好播放。
参考文章
© 版权声明