MediaPlayer setSurface de Android en estado de pausa
Aparentemente, esto no tiene nada que ver con múltiples actividades, y esto tiene que ver con la codificación del archivo de video.
Intentaré simplificar la pregunta: tengo un objeto MediaPlayer en estado de pausa cuando llamomediaPlayer.getCurrentPosition()
Obtengo un resultado que es preciso. Cuando llamomediaPlayer.setSurface()
(usando una superficie diferente) seguido demediaPlayer.play()
en este objeto, el video se reproduce en una posición diferente a la que devuelve getCurrentPosition (). Estoy probando en API> = ICE_CREAM_SANDWICH.
Enlace al archivo de video:http://wpc.4ba9.edgecastcdn.net/804BA9/testenvmedia/m_8705_LuS3w7ctSZjB.mov.bs.mp4
Tengo dos actividades, Actividad-A y Actividad-B.
Activity-A reproduce video desde un flujo remoto a unTextureView
usando unMediaPlayer
, también tiene un botón, cuyo propósito es:
Llame a mediaPlayer.pause ();
Abrir actividad-B.
La actividad B tiene también unaTextureView
que se supone que debe reproducir el mismo video en su ubicación actual utilizando el mismoMediaPlayer
objeto.
Actividad-Un método onCreate:
textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int w, int h) {
try {
final MediaPlayer mediaPlayer = MyApplication.getMediaPlayer();
mediaPlayer.setDataSource(context, videoURI);
mediaPlayer.setSurface(new Surface(surfaceTexture));
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setLooping(shouldLoop);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; }
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {}
});
btnFullScreen.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Log.e("WHATEVER", ">>> pause video at " + MyApplication.getMediaPlayer().getCurrentPosition());
MyApplication.getMediaPlayer().pause();
Intent intent = new Intent(getActivity(), ActivityB.class);
startActivity(intent);
}});
Actividad-B método onCreate:
textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int w, int h) {
MediaPlayer mediaPlayer = MyApplication.getMediaPlayer();
mediaPlayer.setSurface(new Surface(surface));
Log.e("WHATEVER", ">>> resume video at " + mediaPlayer.getCurrentPosition());
mediaPlayer.start();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
});
Salida LogCat:
10-10 17:33:15.966 13886-13886/com.whatever.android.debug E/WHATEVER﹕ >>> pause video at 1958
10-10 17:33:16.817 13886-13886/com.whatever.android.debug E/WHATEVER﹕ >>> resume video at 1958
Entonces, aunque parece que MediaPlayer va a reanudarse desde esa posición exacta, tengo un comportamiento diferente para diferentes videos, la mayoría de ellos comienza en el mismo cuadro cada vez que intento reproducirlos en la Actividad-B, un video comienza en desde el principio, el otro comienza en algún otro punto cada vez.
De la documentación de Android deMediaPlayer.SetSurface()
método:
This method can be called in any state and calling it does not change the object state.
Cualquier ayuda sería muy apreciada. ¡Gracias!