Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 检测视频视图是否正在缓冲_Android_Media Player_Android Videoview - Fatal编程技术网

Android 检测视频视图是否正在缓冲

Android 检测视频视图是否正在缓冲,android,media-player,android-videoview,Android,Media Player,Android Videoview,有人知道是否有可能检测到视频视图正在缓冲吗 我想在视频缓冲时显示ProgressDialog final ProgressDialog bufferingDialog; bufferingDialog = ProgressDialog.show(context, "Buffering", "Please wait", true, true); VideoView videoView; videoView = (VideoView) fin

有人知道是否有可能检测到视频视图正在缓冲吗

我想在视频缓冲时显示ProgressDialog

    final ProgressDialog bufferingDialog;
    bufferingDialog = ProgressDialog.show(context,
            "Buffering", "Please wait", true, true);

    VideoView videoView;
    videoView = (VideoView) findViewById(R.id.video_view);
    videoView.setVideoPath(path);
    videoView.setMediaController(new MediaController(context));
    videoView.requestFocus();
    videoView.start();
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                @Override
                public boolean onInfo(MediaPlayer mp, int what, int extra) {
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START)
                        bufferingDialog.show();
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END)
                        bufferingDialog.dismiss();
                    return false;
                }
            });
        }
    });
    videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            bufferingDialog.dismiss();
            return false;
        }
    });
到目前为止,我尝试使用OnPreparedListener,但这只在视频首次加载时起作用。如果正在播放视频,并且用户将擦洗条移动到另一个点,则即使正在缓冲,视频仍处于“准备”状态

    final ProgressDialog bufferingDialog;
    bufferingDialog = ProgressDialog.show(context,
            "Buffering", "Please wait", true, true);

    VideoView videoView;
    videoView = (VideoView) findViewById(R.id.video_view);
    videoView.setVideoPath(path);
    videoView.setMediaController(new MediaController(context));
    videoView.requestFocus();
    videoView.start();
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                @Override
                public boolean onInfo(MediaPlayer mp, int what, int extra) {
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START)
                        bufferingDialog.show();
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END)
                        bufferingDialog.dismiss();
                    return false;
                }
            });
        }
    });
    videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            bufferingDialog.dismiss();
            return false;
        }
    });
我还尝试了(我知道这很糟糕)一个异步线程,它只在isplay()上忙着等待:

私有类BufferTask扩展了AsyncTask{
受保护的空位背景(空位…空位){
最终视频视图视频视图=(视频视图)findviewbyd(R.id.video);
而(!videoView.isPlaying()){}
返回null;
}
受保护的void onPostExecute(void v){
//在这里隐藏对话框。。。
}
}
这不起作用,因为只要调用start(),一个视频视图似乎就被视为正在播放,即使它正在缓冲

    final ProgressDialog bufferingDialog;
    bufferingDialog = ProgressDialog.show(context,
            "Buffering", "Please wait", true, true);

    VideoView videoView;
    videoView = (VideoView) findViewById(R.id.video_view);
    videoView.setVideoPath(path);
    videoView.setMediaController(new MediaController(context));
    videoView.requestFocus();
    videoView.start();
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                @Override
                public boolean onInfo(MediaPlayer mp, int what, int extra) {
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START)
                        bufferingDialog.show();
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END)
                        bufferingDialog.dismiss();
                    return false;
                }
            });
        }
    });
    videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            bufferingDialog.dismiss();
            return false;
        }
    });
我能想到的唯一解决方案是构建一个自定义的VideoView类型类,这样我就可以访问它的MediaPlayer实例


有什么想法吗?谢谢你的阅读。

我正在做类似的工作,但没能想出一个好的解决方案。发布了一些有趣的解决方案,如果您没有看到它们,您应该查看它们

无论如何,我想出了下面的黑客,这是暗示在上面的线程和工程ok了

@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
    float temp = ((float)mp.getCurrentPosition() / (float)mp.getDuration())*100;
    if(Math.abs(percent - temp) < 1) {
        buffer_fail++;
        if(buffer_fail == 15) {
            //buffer failed
        }
    }
}
@覆盖
public void onBufferingUpdate(MediaPlayer mp,整数百分比){
浮动温度=((浮动)mp.getCurrentPosition()/(浮动)mp.getDuration())*100;
如果(数学绝对值(温度百分比)<1){
缓冲区失败++;
如果(缓冲区故障==15){
//缓冲区失败
}
}
}

为了不实现自定义视频视图,我进行了以下攻击。其思想是每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);
videoMessage只是一个文本视图,文本“Buffering…”位于我的视频视图的中心。

因为,您现在可以从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.GONE);
                return true;
            }
        }
        return false;
    }

});

mVideoView.setOnInfoListener(onInfoToPlayStateListener);

下面的代码将在每次VideoView缓冲时显示一个缓冲对话框

    final ProgressDialog bufferingDialog;
    bufferingDialog = ProgressDialog.show(context,
            "Buffering", "Please wait", true, true);

    VideoView videoView;
    videoView = (VideoView) findViewById(R.id.video_view);
    videoView.setVideoPath(path);
    videoView.setMediaController(new MediaController(context));
    videoView.requestFocus();
    videoView.start();
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                @Override
                public boolean onInfo(MediaPlayer mp, int what, int extra) {
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START)
                        bufferingDialog.show();
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END)
                        bufferingDialog.dismiss();
                    return false;
                }
            });
        }
    });
    videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            bufferingDialog.dismiss();
            return false;
        }
    });

显示缓冲时进度的视频视图。
以下代码适用于我:

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(final MediaPlayer mp) {
                mp.start();
                mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                    @Override
                    public boolean onInfo(MediaPlayer mp, int what, int extra) {
                        switch (what) {
                            case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START: {
                                progressBar.setVisibility(View.GONE);
                                return true;
                            }
                            case MediaPlayer.MEDIA_INFO_BUFFERING_START: {
                                progressBar.setVisibility(View.VISIBLE);
                                return true;
                            }
                            case MediaPlayer.MEDIA_INFO_BUFFERING_END: {
                                progressBar.setVisibility(View.GONE);
                                return true;
                            }
                        }
                        return false;
                    }
                });
            }
        });
这对我有用

boolean b_start = true;
boolean b_end = true;                                                                  
 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: {
                    dialog1.setVisibility(View.GONE);
                    b_end = false;
                    b_start = false;

                }
                case MediaPlayer.MEDIA_INFO_BUFFERING_START: {
                    if (b_start){
                    dialog1.setVisibility(View.VISIBLE);
                    }
                    b_start = true;

                }
                case MediaPlayer.MEDIA_INFO_BUFFERING_END: {
                    if(b_end){
                    dialog1.setVisibility(View.VISIBLE);
                    }
                    b_end = true;
                }
            }
            return false;
        }

    };


    videoView.setOnInfoListener(onInfoToPlayStateListener);

这不能在VideoView中使用。因此,请将它与从VideoView.setOnPreparedListener获得的MediaPlayer配合使用。这看起来像是一段递归指数内存消耗程序代码。不是吗?您的问题解决了吗?我们不应该隐藏缓冲端的进度吗?欢迎来到堆栈溢出!请不要把你的源代码扔在这里。试着对你的答案作一个很好的描述。见: