Comportamiento extraño con mediaplayer y seekTo

Estoy implementando un reproductor de video personalizado porque necesito controles de video personalizados. Tengo una aplicación con una sola actividad, que en el inicio comenzará a reproducir un video de inmediato.

Ahora, el problema que tengo es:

No quiero que el video empiece desde el principio, sino desde una posición posterior. Por lo tanto hago un seekTo (16867). Dado que seekTo es asíncrono, pongo la llamada de inicio del mediaplayer (player.start ()) en el onSeekComplete del onSeekCompleteListener.

El comportamiento extraño que experimento es que puedo ver / oír el video jugando desde el principio por unos milisegundos antes de que realmente juega desde / salta a la posición que buscaba. Pero – por otro lado – la salida de Log que llamo antes de que el jugador.start devuelve la posición correcta 16867, donde yo buscaba.

A continuación se muestra la sección de código correspondiente, la clase completa está 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); } 

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

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.