Android MediaPlayer setSurface im angehaltenen Zustand
Anscheinend hat dies also nichts mit mehreren Aktivitäten zu tun, und dies hat auch etwas mit der Kodierung der Videodatei zu tun.
Ich werde versuchen, die Frage zu vereinfachen: Ich habe ein MediaPlayer-Objekt in einem angehaltenen Zustand, wenn ich aufrufemediaPlayer.getCurrentPosition()
Ich erhalte ein genaues Ergebnis. Wenn ich anrufemediaPlayer.setSurface()
(mit einer anderen Oberfläche) gefolgt vonmediaPlayer.play()
Auf diesem Objekt wird das Video an einer anderen Position als der von getCurrentPosition () zurückgegebenen wiedergegeben. Ich teste auf API> = ICE_CREAM_SANDWICH.
Link zur Videodatei:http://wpc.4ba9.edgecastcdn.net/804BA9/testenvmedia/m_8705_LuS3w7ctSZjB.mov.bs.mp4
Ich habe zwei Aktivitäten, Aktivität A und Aktivität B.
Aktivität-A spielt Videos von einem Remote-Stream auf einen abTextureView
Verwendung einerMediaPlayer
, es enthält auch einen Knopf, der dazu bestimmt ist:
Rufen Sie mediaPlayer.pause () auf.
Öffnen Sie Aktivität-B.
Aktivität B enthält auch aTextureView
welches dasselbe Video an seinem aktuellen Ort mit dem gleichen abspielen sollMediaPlayer
Objekt.
Activity-A onCreate-Methode:
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);
}});
Activity-B onCreate-Methode:
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) {
}
});
LogCat-Ausgabe:
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
Auch wenn es so aussieht, als würde der MediaPlayer an genau dieser Position fortgesetzt, verhalte ich mich bei verschiedenen Videos unterschiedlich. Die meisten davon beginnen bei jedem Versuch, die in Aktivität B wiederzugeben, genau im selben Frame. Ein Video beginnt bei Ganz am Anfang beginnt jedes Mal ein anderer an einem anderen Punkt.
Aus der Android-Dokumentation vonMediaPlayer.SetSurface()
Methode:
This method can be called in any state and calling it does not change the object state.
Jede Hilfe wäre sehr dankbar. Vielen Dank!