2010-06-16 12 views
5

Estoy implementando un reproductor de video personalizado porque necesito controles de video personalizados. Tengo una aplicación con una sola actividad, que al inicio comenzará a reproducir un video de inmediato.Comportamiento extraño con mediaplayer y seekTo

Ahora, el problema que tengo es:

no quiero el video para empezar desde el principio, pero desde una posición posterior. Por lo tanto, hago un seekTo (16867). Como seekTo es asincrónico, coloco la llamada de inicio del reproductor de medios (player.start()) en el onSeekComplete del onSeekCompleteListener.

El extraño comportamiento que experimento es que puedo ver/escuchar el video reproducido desde el principio durante unos milisegundos antes de que realmente reproduzca desde/salte a la posición que buscaba. Pero, por otro lado, la salida de registro que invoco antes de player.start devuelve la posición correcta 16867, donde busqué.

A continuación se muestra la sección de código correspondiente, la clase completa se encuentra en http://pastebin.com/jqAAFsuX

(estoy en Nexus One/2.2 Stagefright)

private void playVideo(String url) { 
    try { 
     btnVideoPause.setEnabled(false); 
     if (player==null) { 
      player=new MediaPlayer(); 
      player.setScreenOnWhilePlaying(true); 
     } 
     else { 
      player.stop(); 
      player.reset(); 
     } 
     url = "/sdcard/myapp/main/videos/main.mp4"; // <--- just for test purposes hardcoded here now  
     player.setDataSource(url); 
     player.setDisplay(holder); 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.setOnCompletionListener(this); 
     player.setOnPreparedListener(this); 

     player.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() { 
      public void onSeekComplete(MediaPlayer mediaPlayer) { 
        Log.d("APP", "current pos... "+ player.getCurrentPosition()); 
        player.start();   // <------------------ start video on seek completed 
        player.setOnSeekCompleteListener(null); 
       } 
     });    
     player.prepareAsync(); 
    } 
    catch (Throwable t) { 
     Log.e(TAG, "Exception in btnVideoPause prep", t); 
    } 
} 

public void onPrepared(MediaPlayer mediaplayer) { 
    width=player.getVideoWidth(); 
    height=player.getVideoHeight(); 
    if (width!=0 && height!=0) { 
     holder.setFixedSize(width, height); 
     progressBar.setProgress(0); 
     progressBar.setMax(player.getDuration()); 
     player.seekTo(16867);     // <------------------ seeking to position 
    } 
    btnVideoPause.setEnabled(true); 
} 
+0

btw: experimento lo mismo cuando uso VideoView del SDK, en lugar de mi propio reproductor multimedia + implementación de superficie. También me pregunto por qué VideoView no proporciona un setOnSeekCompletionListener, aunque proporciona un seekTo. ¿No es asincrónico también el seekTo? –

+0

Presentó un informe de error en http://code.google.com/p/android/issues/detail?id=9135 –

+0

¿Alguna suerte con las soluciones hasta ahora? Sé que tengo 2 años pero esto ahora me está molestando en mi aplicación – Slartibartfast

Respuesta

4

Desde Tampoco he recibido ninguna respuesta de la lista de desarrolladores de Android y encontré problemas similares en la web, concluyo que es un error. Archivé un informe de error en http://code.google.com/p/android/issues/detail?id=9135

+1

2 años después Todavía tengo este problema - ¡maldita sea! – Slartibartfast

+3

@Slartibartfast lol bienvenido a la programación de Android. Google simplemente no se preocupa por los desarrolladores. – StackOverflowed

Cuestiones relacionadas