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 () .

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 en onSeekComplete() .

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.

  • ¿Por qué cambia la resolución de vídeo al transmitir desde Android a través de WebRTC
  • ¿Reproduce vídeos de vimeo usando el reproductor nativo de android?
  • configuración de vídeo opencv a pantalla completa android
  • Reproducción de un video local de aplicación (.mp4) en una vista web
  • Limitaciones de la captura de video en la brecha del teléfono + complementos nativos
  • Vídeo HTML5 Muestra una pantalla negra en carga
  • Descifrar audio / video sobre la marcha a MediaPlayer
  • Cómo utilizar un solo jugador para los anuncios y el vídeo con google android Exoplayer
  • Cómo reproducir vídeos de YouTube en WebView en Amazon Fire TV?
  • reproductor de vídeo android se bloquea reproduciendo archivos locales
  • Reproducción automática de video como facebook, Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.