Как определить, когда VideoView начинает играть (Android)? - PullRequest
8 голосов
/ 03 апреля 2011

Вот проблема, я хочу изменить кнопку воспроизведения на кнопку паузы, когда видеопоток начинает воспроизводиться в видеовиде, но я не знаю, как обнаружить это событие?

Ответы [ 7 ]

13 голосов
/ 14 сентября 2015

Здесь есть отличная статья о MediaPlayer - http://www.malmstein.com/blog/2014/08/09/how-to-use-a-textureview-to-display-a-video-with-custom-media-player-controls/

Вы можете установить infoListener в VideoView

setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {

        if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
            // Here the video starts
            return true;
        }
        return false;
    }
11 голосов
/ 06 апреля 2011

Я закончил с помощью VideoView.setOnPreparedListener. Этого было достаточно, чтобы покрыть мою проблему (кнопка воспроизведения изменялась на паузу)

5 голосов
/ 01 марта 2017

принятый ответ здесь не на 100% точен.

иногда onprepared - это вызов за 3 секунды до визуализации первого кадра.я предлагаю сделать обратный вызов для этого события (MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START)

mMediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mediaPlayer, int i, int i1) {
        if (i == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START){
            //first frame was bufered - do your stuff here
        }
        return false;
    }
});

см. документацию по информации о СМИ для дополнительных обратных вызовов информации / предупреждения: https://developer.android.com/reference/android/media/MediaPlayer.html#MEDIA_INFO_VIDEO_RENDERING_START

1 голос
/ 03 апреля 2011

Насколько я знаю, при запуске воспроизведения видео в VideoView событие не отправляется, но я могу придумать два варианта:

  1. Создать версию VideoView самостоятельно, которая отправляет событие вэти случаи.
  2. Используйте MediaController (который используется по умолчанию в VideoView)

Если вы хотите следовать первому варианту - вы можете получить источник VideoView здесь

0 голосов
/ 26 апреля 2015

Пожалуйста, попробуйте это:

final Handler h = new Handler();
                h.postDelayed( new Runnable() {
                    public void run() {
                            if (videoView.getCurrentPosition() != 0) {
                                ((ProgressBar) rootView.findViewById(R.id.pgStreaming)).setVisibility(View.GONE);
                            } else {
                                h.postDelayed(this, 250);
                            }
                    }
                }, 250);
0 голосов
/ 04 марта 2014

Еще один способ определить, запущен ли videoview, - это использовать videoView.getCurrentPosition (). getCurrentPosition () возвращает 0, если потоковая передача не началась.

    protected Runnable playingCheck = new Runnable() {
        public void run() {
            while (true) {
                if (vw.getCurrentPosition() != 0) {
                    // do what you want when playing started
                    break;
                } else {
                    try {
                        Thread.sleep(250);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    };

Тогда звоните:

new Thread(playingCheck).start();
0 голосов
/ 03 апреля 2011

isPlaying () можно вызвать, чтобы проверить, находится ли объект MediaPlayer в Started

Android MediaPlayer.isPlaying ()

...