2010-12-16 72 views
29

我必须在这里丢失一些明显的东西,但似乎找不到任何可以让我确定何时MediaPlayer正在缓冲音频的东西。我正在流式传输互联网音频,我想显示一个缓冲指示符,但我试过的任何东西都不允许我知道MediaPlayer何时中断要缓冲的音频,所以我无法正确显示缓冲指示符。任何线索?Android - 如何判断MediaPlayer何时缓冲

+0

对此有何更新?我正在尝试制作流媒体视频播放器。所有评论欢迎。 – Sen 2011-05-12 09:17:07

回答

6

@丹尼尔,根据你对@ JRL的回答的评论,你可能会通过旋转线程并等待超时来获得这个工作。

DetectBufferTimeout.java(未经测试)会很好。

但是,我确实认为旋转这个单独的线程是有点破解的。也许OnBufferingUpdateListener可以保证它调用onBufferingUpdate()的频率,不管缓冲进度是否发生了变化,所以我们可以检测到我们是否一遍又一遍地获得相同的值。

+1

谢谢,马特。我遇到的问题是没有通知MediaPlayer何时实际暂停要缓冲的轨道。但是你的建议还是不错的。我认为应用同样的技术......而不是检查缓冲进度,我应该检查播放进度。如果它没有更新并且没有从我的末端暂停或停止,则MediaPlayer实例必须暂停它以便缓冲更多音频数据。谢谢! – Daniel 2011-04-13 04:46:59

+0

啊,是的,我没有意识到你想知道赛道何时暂停_specifically_,因为它已经通过它的缓冲区。 – 2011-04-15 03:03:33

1

注册一个OnBufferingUpdate监听器。

+2

谢谢。我已经这样做了,但这似乎只是告诉我缓冲的音轨的百分比。我试图与赛道的当前比赛时间进行比较。我想也许我可以看到当前缓冲区百分比是否等于当前播放时间百分比。但是这不起作用,因为MediaPlayer似乎有一些缓冲代码被烘焙,以便在缓冲区完全运行之前进行缓冲。所以我仍然无法告诉(或控制)曲目何时缓冲。希望我错过了什么? – Daniel 2010-12-16 21:53:11

10

好吧,我现在觉得有点平反。我检查了潘多拉的应用程序,它不显示缓冲指标。当音乐中断缓冲时,它就像没有任何事情发生一样,UI看起来还在播放。所以我得出的结论是,如果您使用的是MediaPlayer,则无法确定曲目是否暂时暂停以进行缓冲。

但是,我确实注意到有几个MediaPlayer常量可以使用: MEDIA_INFO_BUFFERING_START和MEDIA_INFO_BUFFERING_END。但是他们只能在9级以上的API中使用,而且文档对此没有提及。我假设他们可以与OnInfoListener一起使用。

我很失望,但至少我现在可以停止旋转我的轮子并转向其他东西。

47

像下面(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; 
    } 
}); 

注意:有一个已知的错误在机器人。在播放HLS流时,它从不调用OnInfoListener或OnBuffering。检查此链接OnInfoListener bug

+0

这个作品完美!谢谢 – 2013-07-05 06:49:51

+5

“mediaPlayer”启动缓冲的事实确保它已停止播放吗?我不确定这一点。 – shujj 2014-06-09 05:40:00

+0

我欠你一百万;) – ZimaXXX 2016-04-15 14:17:38

0

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