38

我必须在这里遗漏一些明显的东西,但我似乎找不到任何东西可以让我确定 MediaPlayer 何时缓冲音频。我正在流式传输互联网音频,我想显示一个缓冲指示器,但我尝试过的任何方法都无法让我知道 MediaPlayer 何时中断音频以进行缓冲,因此我无法正确显示缓冲指示器。有什么线索吗?

4

6 回答 6

59

如下所示(API 级别 ≥ 9):

mp.setOnInfoListener(new OnInfoListener() {

    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        switch (what) {
            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                loadingDialog.setVisibility(View.VISIBLE);
                break;
            case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                loadingDialog.setVisibility(View.GONE);
                break;
        }
        return false;
    }
});

注意:Android 中有一个已知错误。播放 HLS 流时,它永远不会调用 OnInfoListener 或 OnBuffering。检查此链接OnInfoListener 错误

于 2013-04-11T04:23:26.650 回答
10

好吧,我现在觉得有点平反了。我检查了 Pandora 应用程序,它没有显示缓冲指示器。当音乐因缓冲而中断时,它就静静地呆在那里,就好像什么都没发生一样,UI 看起来还在播放。所以我得出的结论是,如果您使用的是 MediaPlayer,则无法确定轨道是否暂时暂停以进行缓冲。

但是,我确实注意到有几个 MediaPlayer 常量可以使用:MEDIA_INFO_BUFFERING_START 和 MEDIA_INFO_BUFFERING_END。但是它们仅在 API 级别 9+ 中可用,并且文档没有说明它们。我假设它们可以与 OnInfoListener 一起使用。

我很失望,但至少我现在可以停止转动我的轮子并继续做其他事情。

于 2010-12-17T16:49:45.737 回答
7

@Daniel,根据您对@JRL 答案的评论,您可以通过启动线程并等待超时来完成此工作。

DetectBufferTimeout.java (未经测试)之类的东西会做得很好。

但是,我确实同意启动这个单独的线程有点像 hack。也许OnBufferingUpdateListener可以保证onBufferingUpdate()不管缓冲进度是否发生变化,它调用的频率是多少,这样我们就可以检测我们是否一遍又一遍地获得相同的值。

于 2011-04-12T19:19:24.463 回答
1

注册一个OnBufferingUpdate监听器。

于 2010-12-16T21:23:45.340 回答
1

您可以使用一个线程来检查 MediaPlayer 的当前位置。如果位置没有变化,则可以断定媒体处于缓冲状态。这是我写的完整教程:http ://www.ottodroid.net/?p=260

于 2014-01-09T20:51:48.523 回答
0

就像@JRL 说的那样,注册 aOnBufferUpdateListener但将其注册到 in 的MediaPlayer对象上OnPreparedListener,这样音乐在缓冲的任何时候都会显示出来。因为这个监听器总是在媒体播放器缓冲时被调用。像这样:

player.setOnPreparedListener(mediaPlayer -> {
               mediaPlayer.setOnBufferingUpdateListener((mediaPlayer1, percent) -> {
                    if (percent<=99)view.showMusicBuffer();

                    else view.hideMusicBuffer();
                });
                view.setTrackDuration(mediaPlayer.getDuration());
                mediaPlayer.start();

                changeTrackBarProgress();
            });
于 2020-07-08T13:19:59.130 回答