Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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
Java 有没有更好的方法来代替videoview.seekto()?_Java_Android_Android Videoview - Fatal编程技术网

Java 有没有更好的方法来代替videoview.seekto()?

Java 有没有更好的方法来代替videoview.seekto()?,java,android,android-videoview,Java,Android,Android Videoview,在这里,我们想播放一些其他视频,其中主视频到达某个精确的时间点。由于videoview.seekTo无法实现我们想要的,我们必须运行一个线程,通过videoview.getCurrentPosition捕捉时间点,这正是我们所知道的。 事实上,我们只能使用start()和pause(),而不是使用seekTo(当其他视频准备开始或刚刚完成时)使视频从正确的时间点继续。 以下是我们的努力 private VideoView vv; public void load(String url) {

在这里,我们想播放一些其他视频,其中主视频到达某个精确的时间点。由于videoview.seekTo无法实现我们想要的,我们必须运行一个线程,通过videoview.getCurrentPosition捕捉时间点,这正是我们所知道的。 事实上,我们只能使用start()和pause(),而不是使用seekTo(当其他视频准备开始或刚刚完成时)使视频从正确的时间点继续。 以下是我们的努力

private VideoView vv;
public void load(String url) {
    if (null != proxy)
       proxy.destory();
    proxy = new HttpGetProxy1(9980);
    this.url = proxy.getLocalURL(url, true);
    vv.setVideoPath(this.url);
    vv.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
            Log.e("onCompletion");
            state = VideoState.stop;
            ivStart.setVisibility(View.VISIBLE);
            ivStop.setVisibility(View.INVISIBLE);
            ivPause.setVisibility(View.INVISIBLE);
            if (null != callback)
                callback.onComplete();
       }
    });
    vv.setOnPreparedListener(new OnPreparedListener() {
       @Override
       public void onPrepared(MediaPlayer mp) {
       }

    });
    vv.setOnErrorListener(new OnErrorListener() {

        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            Log.e("setOnErrorListener:" + what + "-" + extra);
            load(ComponentVideo1.this.url);
            return false;
        }
    });
    clearTimer();
    if (null == callback || null == questions || questions.size() == 0)
        handler.post(runnable);
}

private Handler handler = new Handler();

private Runnable runnable = new Runnable() {

    public void run() {
        timeFormat.setText(getTimeFormat(vv.getCurrentPosition()) + "/" + getTimeFormat(vv.getDuration()));
        handler.postDelayed(this, 100);     
        if (null == vv || null == callback || null == questions || questions.size() == 0 || index >= questions.size())
            return;
        if (vv.getCurrentPosition() < questions.get(index).getMsec())
            return;
        callback.call(questions.get(index++));
    }
};
private VideoView vv;
公共无效加载(字符串url){
if(null!=代理)
proxy.destory();
代理=新的HttpGetProxy1(9980);
this.url=proxy.getLocalURL(url,true);
vv.setVideoPath(this.url);
setOnCompletionListener(新的MediaPlayer.OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
Log.e(“未完成”);
state=VideoState.stop;
ivStart.setVisibility(View.VISIBLE);
ivStop.setVisibility(视图不可见);
ivPause.setVisibility(视图.不可见);
if(null!=回调)
callback.onComplete();
}
});
setOnPreparedListener(新的OnPreparedListener(){
@凌驾
已准备好公开作废(MediaPlayer mp){
}
});
vv.setOneRorListener(新的OneRorListener(){
@凌驾
公共布尔onError(MediaPlayer mp,int what,int extra){
Log.e(“SetOneErrorListener:“+what+”-“+extra”);
加载(ComponentVideo1.this.url);
返回false;
}
});
clearTimer();
if(null==callback | | null==questions | | questions.size()==0)
handler.post(可运行);
}
私有处理程序=新处理程序();
private Runnable Runnable=new Runnable(){
公开募捐{
setText(getTimeFormat(vv.getCurrentPosition())+“/”+getTimeFormat(vv.getDuration());
handler.postDelayed(这个,100);
if(null==vv | | null==callback | | null==questions | | questions.size()==0 | | index>=questions.size())
返回;
if(vv.getCurrentPosition()
为了实现这一点,在runnable中,后延迟时间从500减少到100(0.5s减少到0.1s),但每0.1s运行一次方法的压力很大。
更令人失望的是,我们需要对要播放的每个视频资源进行更改

此代码片段来自onCreate中的按钮单击侦听器。它用于查找和暂停少量时间,大约几百毫秒。它会更新一个文本框,直到视频视图在所需时间播放,然后暂停

    public void onClick(View v) {
        if (!checkBox1.isChecked()&&loaded1) {
            if (frame1Advanced) msec = videoView.getCurrentPosition();
            msec += msecAdd;
            videoView.requestFocus();
            videoView.start();
            while (videoView.getCurrentPosition() < (msec-20)) {
                textView1.setText(getMilliToString(videoView.getCurrentPosition())+ "+" + (int)(videoView.getCurrentPosition() - msec));
            }
            videoView.pause();
public void onClick(视图v){
如果(!checkBox1.isChecked()&&loaded1){
if(frame1Advanced)msec=videoView.getCurrentPosition();
msec+=msecAdd;
videoView.requestFocus();
videoView.start();
而(videoView.getCurrentPosition()<(msec-20)){
textView1.setText(getMilliToString(videoView.getCurrentPosition())+“+”+(int)(videoView.getCurrentPosition()-msec));
}
videoView.pause();

感谢您的回答,但不幸的是,我们必须在主视频上设置一个侦听器,并被动引导到新视频。自愿活动无法与之匹配。如果我们将“while”循环设置为runnable…这似乎是一个不错的选择,我们将尝试一下。