我目前正在尝试找到解决同一问题的方法。到目前为止,我想出的最好的如下。
在 4.2 上,我注意到收到以下回调:
1) onVideoSizeChanged() - 高度和宽度 = 0
2) onPrepared()
3) onVideoSizeChanged() - 适当的高度和宽度
您不能在 (1) 中调用 seekTo,因为玩家还没有准备好。
如您所述,如果您在 (2) 中调用 seekTo,媒体播放器会生成警告“尝试查找文件末尾”
如果 MediaPlayer.start() 已被调用,您只会收到 (3),但此时您可以成功调用 seekTo()。
MediaPlayer mMediaPlayer = new MediaPlayer(); // + some initialisation code
boolean mVideoSizeIsSet = false;
boolean mMediaPlayerIsPrepared = false;
public void onPrepared(MediaPlayer mediaplayer) {
Log.d(TAG, "onPrepared called");
mMediaPlayerIsPrepared = true;
if (mVideoSizeIsSet) {
mMediaPlayer.seekTo();
}
mMediaPlayer.start()
}
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
Log.d(TAG, "onVideoSizeChanged called");
if (width == 0 || height == 0) {
Log.d(TAG, "invalid video width(" + width + ") or height(" + height + ")");
} else {
mVideoSizeIsSet = true;
if (mMediaPlayerIsPrepared) {
mMediaPlayer.seekTo();
}
}
}
(我个人不喜欢使用布尔值守卫,但如果您查看随 sdk 提供的媒体播放器示例,它会做类似的事情)。
跨一系列设备/操作系统版本进行测试,这提供了一个通用的解决方案。但是,4.2 有一个错误。对 mMediaPlayer.start() 的调用似乎导致视频的前几帧在 seekTo() 发生之前开始播放,这在我的情况下几乎看不到,但对你来说可能更明显。我目前正在考虑以某种方式隐藏我的表面视图,直到我收到 onSeekComplete() 事件,但这并不理想。
如果有人有一个适用于所有操作系统版本的更好的解决方案,我很想听听。