3

MediaStream的方法的文档prepareAsync()说:

异步准备播放器进行播放。设置数据源和显示表面后,您需要调用 prepare() 或 prepareAsync()。对于流,您应该调用 prepareAsync(),它会立即返回,而不是阻塞直到缓冲了足够的数据。

如果我们用于播放流,会出现什么问题?prepare()我一直在使用prepare(),我从来没有遇到任何麻烦。

相反,在我自己的情况下,当我使用 'prepareAsync()'时,流永远不会开始。当我使用“prepare()”时,流在缓冲期(1s-2s)之后开始并且播放良好。为什么异步方法会发生这种情况?async prepare 的形式是否与 for 相同prepare()

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

2 回答 2

3

问题prepare()在于它阻塞了UI线程。如果准备媒体的时间过长,您的应用程序将因ANR错误而被终止。

事件然后,阻塞UI线程 1 到 2 秒并不是很酷。如果您要访问网络服务器,那么您迟早会被杀死,这是肯定的。

要开始prepareAsync工作,您必须调用MediaPlayer.setOnPreparedListener,然后调用MediaPlayer.start()处理程序。

于 2012-12-07T12:24:58.977 回答
1

在 UI 线程中执行复杂的操作是一种不好的做法。它可能会长时间阻塞您的 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();
于 2012-12-07T12:42:01.060 回答