编辑
很明显,这与多个活动无关,这与视频文件的编码有关。
我将尝试简化这个问题:我有一个处于暂停状态的MediaPlayer对象,当我调用mediaPlayer.getCurrentPosition()时,得到的结果是准确的。当我在这个对象上调用mediaPlayer.setSurface() (使用不同的曲面),然后调用mediaPlayer.play()时,视频播放的位置与getCurrentPosition()返回的位置不同。我正在API >= ICE_CREAM_SANDWICH上进行测试。
链接到视频文件:LuS3w7ctSZjB.mov.bs.mp4
我有两个活动,活动A和活动B。
Activity使用TextureView播放从远程流到MediaPlayer的视频,它还包含一个按钮,该按钮的目的是:
Activity还持有一个TextureView,它应该使用相同的MediaPlayer对象在其当前位置播放相同的视频。
活动--一种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);
}});活动-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似乎要从这个位置恢复,但对于不同的视频,我会得到不同的行为,每次我尝试播放活动中的视频时,大多数视频都是从同一帧开始的--B,一段视频是从一开始就开始的,另一段视频则是在另一个时间点开始的。
在Android的MediaPlayer.SetSurface()方法文档中:
This method can be called in any state and calling it does not change the object state.
任何帮助都将不胜感激。谢谢!
发布于 2013-10-17 13:03:19
似乎你的问题是这个特定的视频,更多的关键帧将帮助玩家更准确地恢复播放。
尝试再次重新编码,使用ffmpeg和libx264尝试添加以下参数:
-g=25 -keyint_min=25发布于 2013-10-17 01:50:46
尝试使用MediaPlayer将您的Intent.putExtra()位置从活动A传递到活动B。因此,基本上,在活动A中,您称之为启动活动B的意图,您可以这样做:
public void onClick(View v) {
Log.e("WHATEVER", ">>> pause video at " + MyApplication.getMediaPlayer().getCurrentPosition());
MyApplication.getMediaPlayer().pause();
int position = MyApplication.getMediaPlayer().getCurrentPosition(); //new line added
Intent intent = new Intent(getActivity(), ActivityB.class);
intent.putExtra("position", position); //another new line of code
startActivity(intent);
}现在,在活动B中,在调用start之前,要找到mediaplayer被暂停的位置,如下所示:
@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.seekTo(getIntent().getExtras().getInt("position"));// new line of code
mediaPlayer.start();
}https://stackoverflow.com/questions/19299412
复制相似问题