woo*_*oot 6 android android-video-player android-mediaplayer
显然这与多个活动无关,这与视频文件的编码有关.
我将尝试简化问题:我有一个处于暂停状态的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使用a的视频MediaPlayer,它还包含一个按钮,其目的是:
调用mediaPlayer.pause();
打开活动-B.
Activity-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);
}});
Run Code Online (Sandbox Code Playgroud)
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) {
}
});
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
因此即使看起来MediaPlayer将从那个确切的位置恢复,我对不同的视频也会有不同的行为,每次我尝试在Activity-B中播放时,大多数都从完全相同的帧开始,一个视频开始于一开始,其他人每次都从其他地方开始.
从Android的MediaPlayer.SetSurface()方法文档:
This method can be called in any state and calling it does not change the object state.
任何帮助将不胜感激.谢谢!
小智 8
看来你的问题在于这个特定的视频,更多关键帧将帮助玩家更准确地恢复播放.
尝试再次重新编码,使用ffmpeg和libx264尝试添加以下参数:
-g=25 -keyint_min=25
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2830 次 |
| 最近记录: |