Android MediaPlayer setSurface в состоянии паузы
Таким образом, очевидно, это не имеет никакого отношения к нескольким действиям, и это имеет отношение к кодированию видеофайла.
Я попытаюсь упростить вопрос: у меня объект MediaPlayer в состоянии паузы, когда я вызываюmediaPlayer.getCurrentPosition()
Я получаю результат, который является точным. Когда я звонюmediaPlayer.setSurface()
(используя другую поверхность) с последующимmediaPlayer.play()
на этом объекте видео воспроизводится в другой позиции, чем та, которую возвращает getCurrentPosition (). Я тестирую на API> = ICE_CREAM_SANDWICH.
Ссылка на видео файл:http://wpc.4ba9.edgecastcdn.net/804BA9/testenvmedia/m_8705_LuS3w7ctSZjB.mov.bs.mp4
У меня есть два вида деятельности, активность-A и деятельность-B.
Activity-A воспроизводит видео из удаленного потока вTextureView
с помощьюMediaPlayer
Он также содержит кнопку, целью которой является:
Вызовите mediaPlayer.pause ();
Откройте Activity-B.
Деятельность-B также содержитTextureView
который должен воспроизводить то же видео в своем текущем местоположении, используя тот жеMediaPlayer
объект.
Метод Activity-A 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);
}});
Метод Activity-B 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) {
}
});
Выход 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
Поэтому, даже если кажется, что MediaPlayer возобновит работу с той же позиции, я получаю различное поведение для разных видео, большинство из которых начинается с одного и того же кадра каждый раз, когда я пытаюсь воспроизвести их в Activity-B, одно видео начинается с самое начало, другой начинается каждый раз в какой-то другой точке.
Из документации Android поMediaPlayer.SetSurface()
метод:
This method can be called in any state and calling it does not change the object state.
Любая помощь будет принята с благодарностью. Спасибо!