› › 文章

MediaPlayerNative(13594): start called in state 4, mPlayer(0x75b4e81280)

文章目录

前言

播放媒体测试时,出现如下问题

MediaPlayerNative(13594): start called in state 4, mPlayer(0x75b4e81280)
MediaPlayerNative(13594): error (-38, 0)
MediaPlayer(13594): Error (-38,0)

记录于此,以便查阅。

总结

原因 :Mediaplayer没有准备好(preparing状态)就开始调用start()方法了。

总结一下:

  1. 不使用prepareAsync()方法
    //mMediaPlayer.prepareAsync();
    mMediaPlayer.prepare();
    mMediaPlayer.start();
  1. 监听onPrepared(MediaPlayer iMediaPlayer)回调时start()
  2. 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()

下面是源码中注释的区别(机器翻译)

  1. 对于流,调用prepareAsync(),它会立即返回,而不是阻塞直到有足够的数据缓冲。
  2. 对于文件,调用prepare(),它会阻塞直到MediaPlayer准备好播放。

参考文章

  1. E/MediaPlayer: start called in state 4, mPlayer(0xcc719a40)解决

猜你喜欢

发表评论