android - tamaño - Cómo configurar la imagen de vista previa en video antes de jugar
vista previa youtube android (8)
Use seekTo( 1 )
para mostrar el primer cuadro.
Asegúrese de que la película esté en pausa y luego use seekTo()
para mostrar el primer fotograma del video:
VideoView mVideoView = (VideoView) findViewById( R.id.video_preview );
mVideoView.setVideoURI( yourVideoPath );
mVideoView.seekTo( 1 ); // 1 millisecond (0.001 s) into the clip.
NOTA: usamos .seekTo( 1 )
porque la configuración de .seekTo( 0 )
no funcionó en Android 9.
Para que se reproduzca cuando se hace clic, @Lingviston ha respondido en otra respuesta.
He creado un VideoView
en mi actividad, a continuación es el código.
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();
}
});
Ahora el video comienza a reproducirse cuando se crea la actividad. Quiero hacer mi actividad de la siguiente manera.
- El video no debe reproducirse cuando la actividad se abre.
- Se debe mostrar la imagen de video inicial (actualmente se muestra en color negro)
- Se debe reproducir solo cuando el usuario haga clic en el video.
por favor, ayúdame.
1) Retire su onPrepareListener. No sé por qué su video comienza a reproducirse después de la creación de la actividad, pero se llama a onPrepareListener después de videoView.start ().
2) Agregue un widget de ImageView en su diseño en la parte superior de VideoView. A continuación, establezca otro onPrepareListener como este:
vvVideos.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
previewImage.setVisibility(View.GONE);
}
});
Me he dado cuenta de que OnPreparedListener se activa demasiado pronto, por lo que puede usar
new Handler().postDelay(Runnable, timeInMilis)
para descartar la imagen de vista previa.
3) Agregue OnTouchListener con cualquier detección de gestos a su VideoView. Aquí hay un ejemplo de lo que estoy usando ahora:
@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;
};
};
Se inicia / detiene la reproducción con un toque.
Crear miniatura de video usando este
Bitmap thumb = ThumbnailUtils.createVideoThumbnail("file path/url",
MediaStore.Images.Thumbnails.MINI_KIND);
y listo para video
BitmapDrawable bitmapDrawable = new BitmapDrawable(thumb);
mVideoView.setBackgroundDrawable(bitmapDrawable);
Para hacer que el video deje de reproducirse cuando comience la actividad, simplemente elimine el método video.start()
.
Pensé en compartir mi solución. El método seekTo
funciona muy bien pero solo para algunos dispositivos. Aquí está mi trabajo alrededor. Yo manejo esto en el método onPrepared para onPreparedListener pero depende de usted.
@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);
}
}
Ahora, cuando reproduzca el video, tendrá que eliminar esta imagen de fondo así:
private void play() {
...
videoView.setBackgroundDrawable(null);
..
}
¡Disfrutar!
Puedes hacerlo con Glide 4.x
Obtendrá el primer cuadro de tu video, lo muestra en un ImageView
añadir a tu build.gradle
compile ''com.github.bumptech.glide:glide:4.3.1''
y en tu clase
GlideApp.with(context)
.load("your video URL")
.into(videoImageView);;
Sé que es una pregunta antigua, pero necesitaba la misma solución y no podía encontrar la respuesta en ningún otro lugar, así que hice la solución y estoy compartiendo el amor aquí:
Acabo de crear una pequeña clase para ello:
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);
}
}
}
simplemente le pide que comience a reproducir y pausa el video nuevamente en el primer cuadro tan pronto como se está reproduciendo (lo que significa que cargó el archivo y ya lo está renderizando en SurfaceView).
La nota importante aquí es recordar llamar a stop()
en esta clase para que pueda limpiarse correctamente y no que la memoria pierda nada.
Espero que ayude.
solo busque el video a 100 milisegundos; muestra la miniatura usando el método seekTo ()
videoView.seekTo(100);