【问题标题】:Why MediaPlayer prepare() is not to be used with streams?为什么 MediaPlayer prepare() 不能与流一起使用?
【发布时间】:2012-11-25 14:47:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: android streaming android-mediaplayer


    【解决方案1】:

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

    那么,将 UI 线程阻塞 1 到 2 秒并不是很酷。如果你访问一个网络服务器,你迟早会被杀死,这是肯定的。

    要让prepareAsync 工作,您必须调用MediaPlayer.setOnPreparedListener,然后在处理程序中调用MediaPlayer.start()

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-03-09
        • 2021-06-14
        • 2012-10-09
        • 2020-03-18
        • 2017-11-21
        • 2019-04-11
        • 2012-09-19
        • 2013-12-30
        • 2011-04-20
        相关资源
        最近更新 更多