gpt4 book ai didi

android mediaplayer seekTo inside onPrepared

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:27:17 24 4
gpt4 key购买 nike

我的问题似乎只发生在 android 4.2.2 上

我这样做空闲状态 -> 初始化状态 -> prepareAsync() -> 并在 onPrepared 中调用 seekTo,但在这个 android 版本上媒体播放器返回

“试图寻找到文件末尾:request = {int>0},durationMs = 0”

然后从头开始播放,因为我无法捕捉到它,也没有任何听众,它只是将这条消息写入日志,我无法对此做出真正的 react 。

更奇怪的是,如果我在 onPrepared() 中调用 mediaPlayer.getDuration(),它会返回正确的值而不是 0。

您认为这是一个媒体播放器错误,还是有更好的地方调用 seekTo ?或者也许是一种如何知道 seekTo 失败的方法?如果当前位置小于所需位置,我想避免定期检查当前位置并尝试调用 seek ,因为这种方法有很多不同的问题。

这是一个流畅的流媒体视频内容

最佳答案

我目前正在尝试找到解决同一问题的方法。到目前为止,我想到的最好的方法如下。

在 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();
}
}
}

(我个人不喜欢使用 boolean guards,但如果你看一下 sdk 提供的媒体播放器示例,它会做类似的事情)。

跨一系列设备/操作系统版本进行测试,这提供了一个通用的解决方案。但是,4.2 有一个错误。对 mMediaPlayer.start() 的调用似乎导致视频的前几帧在 seekTo() 发生之前开始播放,这在我的情况下几乎看不到,但对您来说可能更明显。我目前正在考虑以某种方式隐藏我的表面 View ,直到我收到 onSeekComplete() 事件,但这并不理想。

如果有人有更好的解决方案,适用于所有操作系统版本,我很乐意听到。

关于android mediaplayer seekTo inside onPrepared,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15898089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com