Android - 如何判断MediaPlayer何时缓冲

Dan*_*iel 35 android buffering media-player

我必须在这里遗漏一些明显的东西,但我似乎无法找到任何东西让我确定MediaPlayer何时缓冲音频.我正在播放互联网音频,我想显示一个缓冲指示器,但我尝试过的任何东西都不能让我知道MediaPlayer何时中断音频缓冲,所以我无法正确显示缓冲指示器.有线索吗?

小智 55

如下所示(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;
    }
});
Run Code Online (Sandbox Code Playgroud)

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

  • `mediaPlayer`已开始缓冲的事实是否保证它已停止播放?我不确定这一点. (5认同)

Dan*_*iel 10

好的,我现在感觉有点平反.我检查了Pandora应用程序,它没有显示缓冲指示器.当音乐被中断以进行缓冲时,它只是坐在那里,好像什么也没发生,UI看起来还在播放.所以我得出的结论是,如果你正在使用MediaPlayer,那么就无法确定该曲目是否暂时暂停以进行缓冲.

但是,我注意到有一些可能有用的MediaPlayer常量:MEDIA_INFO_BUFFERING_START和MEDIA_INFO_BUFFERING_END.但它们只能在API级别9+中使用,而且文档中没有任何关于它们的内容.我假设它们可以与OnInfoListener一起使用.

我很失望,但至少我现在可以停止转动轮子并转向别的东西.


Mat*_*çon 7

@Daniel,根据您对@ JRL的回答的评论,您可以通过启动线程并等待超时来实现此功能.

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

但是,我确实同意启动这个单独的线程是一个黑客攻击.也许OnBufferingUpdateListener可以保证它调用的频率,onBufferingUpdate()无论缓冲进度是否发生了变化,这样我们就可以检测出我们是否一遍又一遍地获得相同的值.