我必须在这里遗漏一些明显的东西,但我似乎找不到任何东西可以让我确定 MediaPlayer 何时缓冲音频。我正在流式传输互联网音频,我想显示一个缓冲指示器,但我尝试过的任何方法都无法让我知道 MediaPlayer 何时中断音频以进行缓冲,因此我无法正确显示缓冲指示器。有什么线索吗?
6 回答
如下所示(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 错误
好吧,我现在觉得有点平反了。我检查了 Pandora 应用程序,它没有显示缓冲指示器。当音乐因缓冲而中断时,它就静静地呆在那里,就好像什么都没发生一样,UI 看起来还在播放。所以我得出的结论是,如果您使用的是 MediaPlayer,则无法确定轨道是否暂时暂停以进行缓冲。
但是,我确实注意到有几个 MediaPlayer 常量可以使用:MEDIA_INFO_BUFFERING_START 和 MEDIA_INFO_BUFFERING_END。但是它们仅在 API 级别 9+ 中可用,并且文档没有说明它们。我假设它们可以与 OnInfoListener 一起使用。
我很失望,但至少我现在可以停止转动我的轮子并继续做其他事情。
@Daniel,根据您对@JRL 答案的评论,您可以通过启动线程并等待超时来完成此工作。
DetectBufferTimeout.java (未经测试)之类的东西会做得很好。
但是,我确实同意启动这个单独的线程有点像 hack。也许OnBufferingUpdateListener
可以保证onBufferingUpdate()
不管缓冲进度是否发生变化,它调用的频率是多少,这样我们就可以检测我们是否一遍又一遍地获得相同的值。
注册一个OnBufferingUpdate监听器。
您可以使用一个线程来检查 MediaPlayer 的当前位置。如果位置没有变化,则可以断定媒体处于缓冲状态。这是我写的完整教程:http ://www.ottodroid.net/?p=260
就像@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();
});