MediaPlayer seekTo () no actualiza SurfaceView
Ya vi un montón de preguntas con respecto a los problemas de MediaPlayer de Android, la mayoría de ellos debido a la función seekTo()
. Ahora traté de usarlo, y funcionó como se esperaba: ¡mal!
Esta función parece ser muy incoherente, especialmente cuando queremos proporcionar su funcionalidad mientras el video está pausado. En mi caso, tengo videos de 30 a 60 fotogramas y quiero reproducirlos uno por uno, sin el retraso que proporciona MediaMetadataRetriever.getFrameAtTime () .
- Android en vivo de vídeo - El audio no funciona
- Cómo obtener HTML5 video URI en HTML5VFullScreen $ SurfaceVideoView en Android 4.0?
- Los archivos de video locales no se reproducirán en la aplicación para Android de Cordova
- Android :: VideoView dentro de un ScrollView
- Buscando en YouTube HTML5 video sobre Android WebView
El problema que estoy enfrentando es cuando llamo a seekTo()
, no actualiza el SurfaceView
. Sólo funciona en la primera vez, después de que el SurfaceView
permanece igual, nunca se actualiza de nuevo.
He oído un rumor de que seekTo()
sólo funciona con un intervalo mínimo de 1 segundo, pero probé con un video más largo y buscar segundo por segundo tampoco funcionó.
Código
mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mSurfaceHolder.addCallback(this); mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDisplay(mSurfaceHolder); mMediaPlayer.setOnSeekCompleteListener(new OnSeekCompleteListener() { @Override public void onSeekComplete(MediaPlayer mp) { // Need this postDelayed(), otherwise the media player always // returns 0 in getCurrentPosition(), don't know why... Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { mMediaPlayer.pause(); } }, 100); } }); mMediaPlayer.setDataSource(localfile_source); mMediaPlayer.prepare(); // Set the initial position. mMediaPlayer.start(); mMediaPlayer.seekTo(500);
/** We're assuming that targetMs is within 0 and the video's duration. Also, targetMs is calculated to always move to the next/previous frame: Example: currentMs + ( 1000 / framerate) (if framerate = 20, then it will exist a frame in each 50ms) */ private void seekTo(int targetMs) { mMediaPlayer.start(); mMediaPlayer.seekTo(targetMs); }
Tenga en cuenta que debido a un error conocido con respecto al uso de esta función mientras el video está en pausa, se utiliza una solución:
-
Iniciar el video;
-
Llamar
seekTo()
; -
onSeekComplete()
en pausa enonSeekComplete()
.
- Elemento HTML5 <video> en Android
- Vídeo de escala de matriz en TextureView Android
- Problema de transmisión en vivo de Android RTSP
- ¿Cómo obtener vídeo de la intención de la cámara y guardarlo en un directorio?
- Grabación de vídeo en Android usando JavaCV (Actualizado 2014 02 17)
- ¿Qué es AwesomePlayer en android?
- La función VideoView seekto () es extremadamente incoherente
- Android: onSeekCompleteListener con VideoView
De [ esta pregunta ]:
"No se puede realizar la búsqueda de fotograma a fotograma mediante el uso de la API de MediaPlayer proporcionada por Android.
Si realmente quieres implementar marco por cuadro buscando, entonces tendrás que usar un marco multimedia de terceros como FFMPEG o tendrás que implementar tu propio ".
He creado un código de prueba para probarlo de todos modos. No empecé start()
el vídeo antes de usar seekTo()
seekTo()
usar seekTo()
mientras estaba en pausa.
Cuando me moví hacia adelante en incrementos de 50 ms , vi una serie de aproximadamente 4-5 marcos repetir hasta que aproximadamente 2 segundos habían transcurrido; Entonces, el conjunto de fotogramas de vista previa cambió a una nueva serie de 4-5 marcos. Esto parece alinear con mi ensayo anterior en donde moví adelante en incrementos de 2000ms y vi un marco único para cada llamada de seekTo()
.
En resumen, parece que MediaPlayer selecciona varios fotogramas en cada intervalo de 2 segundos para utilizarlos como fotogramas de previsualización cuando el vídeo se pausa.
- Compartir datos entre usuarios en Android multiusuario (4.2 o posterior)
- Factores que afectan a FPS en dispositivos móviles en Unity