Comment définir l’image de prévisualisation en vidéo avant de jouer

J’ai créé un VideoView dans mon activité, VideoView le code.

 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(); } }); 

Maintenant, la vidéo commence à jouer lorsque l’activité est créée. Je veux faire mon activité comme suit

  1. La vidéo ne doit pas être lue lorsque l’activité est ouverte.
  2. Il devrait afficher l’image vidéo de départ (actuellement sa couleur noire)
  3. Il ne doit jouer que lorsque l’utilisateur clique sur la vidéo.
    Aidez-moi, s’il vous plaît.

Utilisez seekTo() pour afficher la première image.

Assurez-vous que le film est en pause, puis utilisez seekTo() pour afficher la première image de la vidéo:

 VideoView mVideoView = (VideoView) findViewById(R.id.video_preview); mVideoView.setVideoURI(yourVideoPath); mVideoView.seekTo(100); // 100 milliseconds (0.1 s) into the clip. 

Il a été répondu par @Lingviston dans une autre réponse.

Créer une vignette vidéo en utilisant cette

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

et mis à la vidéo

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

1) Retirez votre onPrepareListener. Je ne sais pas pourquoi votre vidéo commence à jouer après la création d’activité, mais onPrepareListener est appelé après videoView.start ().

2) Ajoutez un widget ImageView dans votre mise en page en haut de VideoView. Ensuite, définissez un autre onPrepareListener comme ceci:

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

J’ai remarqué que onPreparedListener se déclenche trop tôt, vous pouvez donc utiliser

new Handler().postDelay(Runnable, timeInMilis)

pour rejeter l’image d’aperçu.

3) Ajoutez OnTouchListener avec n’importe quelle détection de geste à VideoView. Voici un exemple de ce que j’utilise maintenant:

  @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; }; }; 

Il commence / arrête de jouer par un tapotement.

Je pensais partager ma solution. La méthode seekTo fonctionne très bien mais seulement pour certains appareils. Voici mon travail autour. Je gère cela dans la méthode onPrepared pour onPreparedListener mais c’est à vous.

 @Override public void onPrepared(MediaPlayer mp) { MediaMetadataResortingever mediaMetadataResortingever = new MediaMetadataResortingever(); mediaMetadataResortingever.setDataSource(uri.getPath()); try { Bitmap bitmap = mediaMetadataResortingever.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); } } 

Maintenant, lorsque vous jouez la vidéo, vous devrez supprimer cette image d’arrière-plan comme suit:

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

Prendre plaisir!

il suffit de chercher la vidéo à 100 millisecondes, il montre la vignette en utilisant la méthode seekTo ()

 videoView.seekTo(100); 

Vous pouvez le faire avec Glide 4.x Il ira chercher la première image de votre vidéo dans un ImageView

append à votre build.gradle

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

et dans votre classe

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

Je sais que c’est une vieille question, mais j’avais besoin de la même solution et je ne pouvais pas trouver la réponse ailleurs, alors j’ai fait la solution et je partage l’amour ici:

Je viens de créer un petit cours pour ça:

  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); } } } 

il demande simplement de commencer à jouer et met la vidéo en pause sur la première image dès qu’elle est jouée (ce qui signifie qu’elle a chargé le fichier et qu’il le rend déjà sur SurfaceView).

La remarque importante ici est de se rappeler d’appeler stop() sur cette classe pour qu’elle puisse nettoyer correctement et éviter toute fuite de mémoire.

J’espère que ça aide.

Pour que votre vidéo cesse de jouer lorsque l’activité commence, supprimez simplement la méthode video.start() .