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

时间:2012-12-07 12:10:23

标签: android streaming android-mediaplayer

MediaStream方法prepareAsync()的文档说:

  

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

如果我们使用prepare()播放流,那么错误会出错我一直在使用prepare(),我从来没有遇到任何麻烦。

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

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

2 个答案:

答案 0 :(得分:3)

prepare()的问题在于它会阻止UI线程。如果准备媒体花费的时间太长,您的应用将会因ANR错误而被杀死。

事件然后,阻止UI线程1到2秒并不是很酷。如果你正在点击一个网络服务器,你肯定迟早会被杀死。

要让prepareAsync生效,您必须致电MediaPlayer.setOnPreparedListener,然后在处理程序中调用MediaPlayer.start()

答案 1 :(得分:1)

在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();