检测VideoVIew是否正在缓冲

ton*_*nyc 15 android media-player android-videoview

有谁知道是否有可能检测到VideoView何时缓冲?

我想在视频缓冲时显示ProgressDialog.

到目前为止,我尝试使用OnPreparedListener,但这仅在首次加载视频时才有效.如果正在播放视频并且用户将擦洗条移动到不同的点,则视频仍然"准备好",即使它正在缓冲.

我也试过(我知道这很糟糕)AsyncThread只是忙等待isPlaying():

private class BufferTask extends AsyncTask<Void, Void, Void> {

  protected Void doInBackground(Void...voids) {
    final VideoView videoView = (VideoView)findViewById(R.id.video);
    while (!videoView.isPlaying()) { }
    return null;
  }

 protected void onPostExecute(Void v) {
     // Hide the dialog here...
 }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为只要你调用start(),即使它正在缓冲,VideoView似乎也被认为是在播放.

我能想到的唯一解决方案是构建一个自定义的VideoView类型类,以便我可以访问它的MediaPlayer实例.

有任何想法吗?谢谢阅读.

cad*_*rry 13

API级别17开始,您现在可以从MediaPlayer访问InfoListener:

final MediaPlayer.OnInfoListener onInfoToPlayStateListener = new MediaPlayer.OnInfoListener() {

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

});

mVideoView.setOnInfoListener(onInfoToPlayStateListener);
Run Code Online (Sandbox Code Playgroud)

  • 我们不应该隐藏缓冲结束的进展吗? (3认同)

mig*_*las 10

我带来了以下hack,以便不实现自定义VideoView.如果当前位置与之前的1秒相同,则每1秒检查一次.如果是,则视频正在缓冲.如果没有,视频真的在播放.

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 
    public void run() {
        int duration = videoView.getCurrentPosition();
        if (old_duration == duration && videoView.isPlaying()) {
            videoMessage.setVisibility(View.VISIBLE);
        } else {
            videoMessage.setVisibility(View.GONE);
        }
        old_duration = duration;

        handler.postDelayed(runnable, 1000);
    }
};
handler.postDelayed(runnable, 0);
Run Code Online (Sandbox Code Playgroud)

videoMessage只是一个TextView,文本"Buffering ..."放在我的VideoView的中心.

  • 这看起来像一个递归的指数内存消费者代码片段.不是吗? (5认同)