Luk*_*cek 5 android seek media-player
我的问题似乎只发生在android 4.2.2上
我这样走空闲状态 - >初始化状态 - > prepareAsync() - >并在onPrepared中调用seekTo,但是在这个android版本上,mediaplayer返回
"尝试寻找文件的末尾:request = {int> 0},durationMs = 0"
并且从头开始玩,因为我无法捕捉到这一点,也没有任何听众,它只是将此消息写入日志,我无法对此做出真正的反应.
更奇怪的是,如果我在onPrepared()中调用mediaPlayer.getDuration(),它将返回正确的值而不是0.
你认为这是一个媒体播放器的bug还是有更好的地方可以调用seekTo?或者也许是一种如何知道seekTo失败的方法?我想避免定期检查当前位置,如果它小于所需位置并尝试调用搜索,因为这种方法有很多不同的问题.
这是一个流畅的流媒体视频内容
小智 5
我目前正试图找到解决同样问题的方法.到目前为止,我提出的最好的是如下.
在4.2我注意到收到了以下回调:
1)onVideoSizeChanged() - 其中height和width = 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
(我个人不喜欢使用布尔警卫,但是如果你看一下sdk提供的媒体播放器示例,它会做类似的事情).
通过一系列设备/ OS版本进行测试,这提供了一种通用解决方案.但是,4.2中存在一个错误.对mMediaPlayer.start()的调用似乎会导致视频的前几帧在seekTo()发生之前开始播放,这对我的情况几乎不可见,但对您来说可能更明显.我目前正在寻找以某种方式隐藏我的表面视图,直到我收到onSeekComplete()事件,但这并不理想.
如果有人有更好的解决方案适用于所有操作系统版本,我很乐意听到它.
| 归档时间: |
|
| 查看次数: |
6423 次 |
| 最近记录: |