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);
}
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? –
Presentó un informe de error en http://code.google.com/p/android/issues/detail?id=9135 –
¿Alguna suerte con las soluciones hasta ahora? Sé que tengo 2 años pero esto ahora me está molestando en mi aplicación – Slartibartfast