Android синхронизировать видео с таймером - PullRequest
0 голосов
/ 25 января 2011

Я использую Android для создания видеоплеера, используя VideoView . Мне удалось запустить видеоплеер, и теперь я устанавливаю счетчик, используя хронометр , который начинает тикать, когда я выбираю файл.
Однако запуск видеоклипа занимает несколько секунд, в то время как таймер уже начал считать несколько секунд, когда начинается клип.

Как мне написать код для синхронизации счетчика с медиафайлом?
Я проверил, но не могу найти ответ.

    video = (VideoView) findViewById(R.id.video);
    play = (Button) findViewById(R.id.play);
    pause = (Button) findViewById(R.id.pause);
    stop = (Button) findViewById(R.id.stop);
    reset = (Button) findViewById(R.id.reset);
    Chronometer counter = (Chronometer) findViewById(R.id.chrono);
    startTime = SystemClock.elapsedRealtime();
    time = (TextView) findViewById(R.id.time);

        try {
        video.setVideoPath(link);
        video.start();
        video.requestFocus();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    }

    play.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            video.start();
            video.requestFocus();
        }
    });
    pause.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            video.pause();
        }
    });
    stop.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            try {
                video.stopPlayback();
                video.setVideoPath(link);
            } catch (IllegalStateException e) {
                e.printStackTrace();
            }
        }
    });
    reset.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            try {
                video.seekTo(0);
                video.start();
                video.requestFocus();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            }
        }
    });

counter.setOnChronometerTickListener(new OnChronometerTickListener(){
        public void onChronometerTick(Chronometer arg0) {
            countUp = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
            duration = video.getDuration();
            if (countUp % 60 <= 9) {
                countText = (countUp / 60) + ":0" + (countUp % 60);
            } else {
                countText = (countUp / 60) + ":" + (countUp % 60);           
            } 
            if (duration % 60000 <= 9) {
                durationText = (duration / 60000) + ":0" + (duration % 60000);
            } else {
                durationText = (duration / 60000) + ":" + (duration % 60000);           
            }
            time.setText(countText + " / " + durationText);
        }
    });
    counter.start();

Ответы [ 2 ]

0 голосов
/ 02 сентября 2013

Я дам свои два цента за это, поскольку это может помочь другим.

Вы можете настроить onPreparedListener, где вы сможете получить MediaPlayer.MediaPlayer имеет onInfoListener, который сообщит вам, когда мультимедиа буферизируется, или даже первый кадр, который фактически отображается, MEDIA_INFO_VIDEO_RENDERING_START (только API 17+).Я использую это для обновления локальной переменной состояния (что-то вроде: enum VideoPlayerState (BUFFERING, PLAYING, STOPPED, OPEN, PAUSED)) в переопределенном классе VideoView.Вы можете переопределить его установщик, чтобы получить обратный вызов при изменении состояния.Этот обратный вызов может запустить / приостановить ваш таймер.

setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(final MediaPlayer mp) {
            mp.setOnInfoListener(new OnInfoListener() {

                @Override
                public boolean onInfo(MediaPlayer mp, int what, int extra) {
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START) {
                        setPlayerState(VideoPlayerState.BUFFERING);
                    } else if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) {
                        if (mp.isPlaying()
                                && mPlayerState == VideoPlayerState.BUFFERING) {
                            setPlayerState(VideoPlayerState.PLAYING);
                        }
                    }
                    return false;
                }
            });
});

Вы также можете переопределить эти методы в VideoView, чтобы переключить состояние:

@Override
public void pause() {
    super.pause();
    setPlayerState(VideoPlayerState.PAUSED);
}

@Override
public void start() {
    super.start();
    setPlayerState(VideoPlayerState.PLAYING);
}

@Override
public void stopPlayback() {
    super.stopPlayback();
    setPlayerState(VideoPlayerState.STOPPED);
}

Надеюсь, это поможет.

0 голосов
/ 26 января 2011

Не беспокойтесь, я нашел способ использовать VideoView getCurrentPosition () в хронометре.Теперь он всегда видит правильное текущее время и его легче контролировать.

counter.setOnChronometerTickListener(new OnChronometerTickListener(){
        public void onChronometerTick(Chronometer arg0) {
            countUp = video.getCurrentPosition();
            countUp = Math.round(countUp / 1000);
            duration = video.getDuration();
            duration = duration / 1000;
            long a = (long) countUp;
            if (countUp % 60000 <= 9) {
                countText = (a / 60000) + ":0" + (a % 60000);
            } else {
                countText = (a / 60000) + ":" + (a % 60000);           
            } 
            if (duration % 60000 <= 9) {
                durationText = (duration / 60000) + ":0" + (duration % 60000);
            } else {
                durationText = (duration / 60000) + ":" + (duration % 60000);           
            }
            time.setText(countText + " / " + durationText);
        }
    });
    counter.start();
...