Как установить предварительный просмотр в видеообъявлении перед воспроизведением
В моей работе я создал 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();
}
});
Теперь видео начинает играть, когда создается активность. Я хочу сделать свою деятельность следующим образом
- Видео не должно воспроизводиться, когда активность открывается.
- Отображает начальное видеоизображение (в настоящее время отображается черный цвет)
- Он должен воспроизводиться только тогда, когда пользователь нажимает на видео.
пожалуйста, помогите мне.
Ответы
Ответ 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);;