Видео застревает (зависает) при слишком быстром пролистывании ViewPager

#android #android-viewpager #android-videoview

#Android #android-viewpager #android-видеообзор

Вопрос:

У меня возникает проблема с зависанием видео при быстром пролистывании viewpager.

Проблема:

У меня есть одно видео с расширением типа webm (12 секунд), и я проигрываю его в режиме просмотра видео.

Из этого видео я получаю текущую позицию из этого видео и приостанавливаю это видео с интервалом в 4 секунды. Для этого я использую обработчик, и он отлично работает, когда я медленно провожу пальцем, но когда я провожу быстро, видео застревает (зависает) и не работает должным образом.

Код:

  ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrollStateChanged(int arg0) {
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
    }

    @Override
    public void onPageSelected(int position) {

        currentPosition = position;


        if (viewPager.getCurrentItem() == 0) {
            videoPlayPause(0);
        }

        if (viewPager.getCurrentItem() == 1) {
            videoPlayPause(5);
        }

        if (viewPager.getCurrentItem() == 2) {
            videoPlayPause(9);
        }
    }
};


void playVideo() {
    String path = "android.resource://"   getPackageName()   "/"   R.raw.welcome;
    autoFitVideoView.setVideoURI(Uri.parse(path));
    autoFitVideoView.requestFocus();
    autoFitVideoView.setBackgroundColor(Color.WHITE);

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

            autoFitVideoView.setBackgroundColor(Color.TRANSPARENT);
        }
    });
}

 public void videoPlayPause(final int seekto) {


    autoFitVideoView.seekTo(seekto * 1000);

    autoFitVideoView.start();

    autoFitVideoView.post(new Runnable() {
        @Override
        public void run() {

            videoCurrentPosition = autoFitVideoView.getCurrentPosition();

            if (currentPosition == 0) {
                if (videoCurrentPosition == 0) {
                    pauseVideo(3000);
                }
            }

            if (currentPosition == 1) {
                if (videoCurrentPosition == 5000) {
                    pauseVideo(3000);
                }
            }

            if (currentPosition == 2) {
                if (videoCurrentPosition == 9000) {
                    pauseVideo(4000);
                }
            }
        }
    });
}

void pauseVideo(long delayTime) {

    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            autoFitVideoView.pause();
        }
    }, delayTime);

}
  

Также ViewPager содержит только текстовый массив, и с помощью текста для пролистывания я показываю видео с интервалом в 4 секунды. Но видео зависает.

XML:

  <FrameLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="0dp"
    android:layout_marginTop="32dp"
    android:layout_marginBottom="32dp"
    android:overScrollMode="never"
    app:layout_constraintBottom_toTopOf="@ id/txt_desc"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@ id/txt_title">

    <in.hammerapps.view.CustomViewPager
        android:id="@ id/viewPager"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never"></in.hammerapps.view.CustomViewPager>


    <VideoView
        android:id="@ id/videoView"
        android:layout_gravity="center"
        android:layout_marginTop="16dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</FrameLayout>
  

Итак, любая дополнительная помощь была бы оценена!

Комментарии:

1. Попробуйте включить аппаратное ускорение в файле манифеста

2. Нет. Это не работает

3. @Mani Наконец-то я решил это

Ответ №1:

Наконец я решил проблему, используя CountDownTimer вместо Handler .

 CountDownTimer countDownTimer; // This is globally declared


void pauseVideo(final long delayTime) {

    countDownTimer = new CountDownTimer(delayTime, 1000) {

        public void onTick(long millisUntilFinished) {
        }

        public void onFinish() {

            if (autoFitVideoView.isPlaying()) {
                autoFitVideoView.pause();
            }
        }

    };
    countDownTimer.start();
}
  

В onPageSelected методе ViewPager вам нужно отменить предыдущий countDownTimer . Это самая важная вещь, которая вам нужна, иначе она не будет работать.

  @Override
    public void onPageSelected(int position) {

        currentPosition = position;

        if (countDownTimer != null) {
            countDownTimer.cancel();    // Most important thing
        }


        if (viewPager.getCurrentItem() == 0) {

            videoPlayPause(0);

        }

        if (viewPager.getCurrentItem() == 1) {

            videoPlayPause(5);
        }

        if (viewPager.getCurrentItem() == 2) {

            videoPlayPause(9);

        }
    }