为什么MediaPlayer prepare()不与流一起使用?

MediaStream方法prepareAsync()的文档说:

Prepares the player for playback, asynchronously. After setting the
datasource and the display surface, you need to either call prepare()
or prepareAsync(). For streams, you should call prepareAsync(),
which returns immediately
, rather than blocking until enough data
has been buffered.

如果使用prepare()播放流,有什么不好的地方会出错?我一直在使用prepare(),但从未遇到任何麻烦.

相反,在我自己的情况下,当我使用’prepareAsync()’时,流永远不会启动.当我使用“ prepare()”时,流在缓冲时间段(1s-2s)之后开始播放,并播放良好.为什么使用异步方法会发生这种情况?异步prepare的形式与prepare()相同吗?

    mPlayer = new MediaPlayer();
    mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mPlayer.setDataSource(STREAM_URL);
    mPlayer.prepareAsync();
    mPlayer.start();

解决方法:

在UI线程中执行复杂的操作是一种不好的做法.它会长时间阻止用户界面,Android可能会杀死您的应用程序.
在这种情况下,由于对数据进行解码和获取,prepare()方法可能会花费大量时间.

您应该在侦听OnPrepared事件时调用prepareAsync()方法.触发事件后,您应该通知您的UI并启动播放器.

mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(STREAM_URL);
mplayer.setOnPreparedListener(/*your listener here*/)
mPlayer.prepareAsync();
上一篇:kafka unclean 配置代表啥,会对 spark streaming 消费有什么影响?


下一篇:看了这篇博客,你还敢说不会Structured Streaming?