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

时间:2016-01-25 07:14:40

标签: java android android-videoview

在这里,我们想播放一些其他视频,其中主要视频来到某个确切的时间点。由于videoview.seek无法达到我们想要的效果,我们必须通过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++));
    }
};

为了达到这个目的,在runnable中,postDelay时间从500减少到100(0.5s到0.1s)。但每0.1秒运行一次方法的压力很大。 更令人失望的是我们需要对我们要播放的每个视频资源进行更改

1 个答案:

答案 0 :(得分:0)

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

    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();