Подтвердить что ты не робот

Как установить предварительный просмотр в видеообъявлении перед воспроизведением

В моей работе я создал VideoView, ниже - код.

VideoView vvVideos = (VideoView) rootView.findViewById(R.id.videoView);
MediaController mediacontroller = new MediaController(ctx);
mediacontroller.setAnchorView(vvVideos);
    Uri video = Uri.parse("android.resource://" + packageName +"/"+R.raw.sample);
    vvVideos.setMediaController(mediacontroller);

    LayoutParams params=vvVideos.getLayoutParams();
    params.height=150;
    vvVideos.setLayoutParams(params);

    vvVideos.setVideoURI(video);
    vvVideos.requestFocus();
    vvVideos.setOnPreparedListener(new OnPreparedListener() {
        public void onPrepared(MediaPlayer mp) {
            vvVideos.start();
        }
    });

Теперь видео начинает играть, когда создается активность. Я хочу сделать свою деятельность следующим образом

  • Видео не должно воспроизводиться, когда активность открывается.
  • Отображает начальное видеоизображение (в настоящее время отображается черный цвет)
  • Он должен воспроизводиться только тогда, когда пользователь нажимает на видео.
    пожалуйста, помогите мне.
4b9b3361

Ответ 1

Используйте seekTo() для отображения первого кадра.

Убедитесь, что фильм приостановлен, а затем используйте seekTo(), чтобы отобразить первый кадр видео:

VideoView mVideoView = (VideoView) findViewById(R.id.video_preview);

mVideoView.setVideoURI(yourVideoPath);

mVideoView.seekTo(100);                 // 100 milliseconds (0.1 s) into the clip.

Чтобы играть, когда нажимал, был ответ от @Lingviston в другом ответе.

Ответ 2

Создайте эскиз видео с помощью этого

Bitmap thumb = ThumbnailUtils.createVideoThumbnail("file path/url",
                            MediaStore.Images.Thumbnails.MINI_KIND);

и установите для просмотра видеоролик

BitmapDrawable bitmapDrawable = new BitmapDrawable(thumb);
            mVideoView.setBackgroundDrawable(bitmapDrawable);

Ответ 3

1) Удалите свой onPrepareListener. Я не знаю, почему ваше видео начинает играть после создания активности, но onPrepareListener вызывается после videoView.start().

2) Добавьте виджет ImageView в макет поверх VideoView. Затем установите другой onPrepareListener следующим образом:

vvVideos.setOnPreparedListener(new OnPreparedListener() {
            public void onPrepared(MediaPlayer mp) {
                previewImage.setVisibility(View.GONE);
            }
        });

Я заметил, что onPreparedListener срабатывает слишком рано, поэтому вы можете использовать

new Handler().postDelay(Runnable, timeInMilis)

чтобы закрыть изображение предварительного просмотра.

3) Добавьте OnTouchListener с любым обнаружением жестов к вам VideoView. Вот пример того, что я использую сейчас:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_video);

    mGestureDetector = new GestureDetector(this, mGestureListener);

    ((VideoView) findViewById(R.id.activity_video_videoview)).setOnTouchListener(mTouchListener);
}
    private OnTouchListener mTouchListener = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mGestureDetector.onTouchEvent(event);
        return true;
    }
};
private SimpleOnGestureListener mGestureListener = new SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    if(mVideoView.isPlaying())
        mVideoView.pause();
    else
        mVideoView.start();
    return true;
};
};

Он запускает/останавливает воспроизведение нажатием.

Ответ 4

Думаю, я поделюсь своим решением. Метод seekTo отлично работает, но только для некоторых устройств. Вот моя работа. Я обрабатываю это в методе onPrepared для onPreparedListener, но это зависит от вас.

@Override
public void onPrepared(MediaPlayer mp) {
  MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
  mediaMetadataRetriever.setDataSource(uri.getPath());
  try {
    Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(currentPosition);
    videoView.setBackgroundDrawable(new BitmapDrawable(bitmap));
  } catch (OutOfMemoryError outOfMemoryError) {
    //Not entirely sure if this will ever be thrown but better safe than sorry.
    videoView.seekTo(currentPosition);
  }
}

Теперь, когда вы воспроизводите видео, вам нужно будет удалить это фоновое изображение так:

private void play() {
  ...
  videoView.setBackgroundDrawable(null);
  ..
}

Наслаждайтесь!

Ответ 5

Я знаю, что это старый вопрос, но мне нужно было то же самое решение, и я не мог найти ответ нигде, поэтому я сделал это решение, и я разделяю эту любовь здесь:

Я просто создал для него небольшой класс:

   public class LoadFirstVideoFrame implements Runnable {

      private static Handler uiHandler = new Handler(Looper.getMainLooper());
      private VideoView videoView;

      private LoadFirstVideoFrame(VideoView videoView) {
         this.videoView = videoView;
         videoView.start();
         videoView.resume();
         uiHandler.post(this);
      }

      public void stop() {
         videoView = null;
         uiHandler.removeCallbacks(this);
      }

      @Override public void run() {
         if (videoView == null) return;
         if (videoView.isPlaying()) {
            videoView.pause();  
            videoView.seekTo(0);

            videoView = null;
         } else {
            uiHandler.post(this);
         }
      }
   }

он просто просит начать воспроизведение и приостанавливать воспроизведение видео в первом кадре сразу после его фактического воспроизведения (это означает, что он загрузил файл и уже отобразил его на SurfaceView).

Важное замечание здесь состоит в том, чтобы помнить о вызове stop() для этого класса, чтобы он мог корректно очищать, а не терять память.

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

Ответ 6

просто искать видео до 100 миллисекунд, он показывает эскиз с помощью метода seekTo()

videoView.seekTo(100);

Ответ 7

Вы можете сделать это с помощью Glide 4.x. Он отобразит первый кадр вашего видео, показывая его в ImageView

добавьте в свой build.gradle

compile 'com.github.bumptech.glide:glide:4.3.1'

и в вашем классе

GlideApp.with(context)
                .load("your video URL")
                .into(videoImageView);;