gpt4 book ai didi

java - MediaPlayer seekTo() 不更新 SurfaceView

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:04:45 28 4
gpt4 key购买 nike

我已经看到很多关于 Android 的 MediaPlayer 的问题。 ,其中大部分是因为 seekTo() 函数。现在我尝试使用它,它的工作正如预期的那样:糟糕!

这个功能看起来很不协调,特别是当我们想在视频暂停时提供它的功能。在我的例子中,我有 30 到 60 帧的视频,我想一个一个地播放它们——没有延迟 MediaMetadataRetriever.getFrameAtTime()提供。

我面临的问题是当我调用 seekTo() 时,它不会更新 SurfaceView。它只在第一次工作,之后 SurfaceView 保持不变,它再也不会更新。

我听说 seekTo() 只能在最小间隔为 1 秒的情况下工作,但我用更长的视频进行测试,逐秒搜索也不起作用。

代码

mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mSurfaceHolder.addCallback(this);

mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDisplay(mSurfaceHolder);

mMediaPlayer.setOnSeekCompleteListener(new OnSeekCompleteListener() {
@Override
public void onSeekComplete(MediaPlayer mp) {
// Need this postDelayed(), otherwise the media player always
// returns 0 in getCurrentPosition(), don't know why...
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
mMediaPlayer.pause();
}
}, 100);
}
});

mMediaPlayer.setDataSource(localfile_source);
mMediaPlayer.prepare();

// Set the initial position.
mMediaPlayer.start();
mMediaPlayer.seekTo(500);

/** 
We're assuming that targetMs is within 0 and the video's duration.
Also, targetMs is calculated to always move to the next/previous frame:

Example: currentMs + ( 1000 / framerate)
(if framerate = 20, then it will exist a frame in each 50ms)
*/
private void seekTo(int targetMs) {
mMediaPlayer.start();
mMediaPlayer.seekTo(targetMs);
}

请注意,由于在视频暂停时使用此功能存在一个已知错误,因此使用了一种解决方法:

  • 开始视频;

  • 调用seekTo();

  • onSeekComplete() 上暂停它。

最佳答案

来自 [ this question ]:

"You cannot do frame by frame seeking by using the MediaPlayer API's provided by Android.

If you really want implement frame by frame seeking then you will have to use a 3rd party multimedia framework like FFMPEG or you will need to implement your own."

我创建了一些测试代码来尝试一下。在使用 seekTo() 之前,我没有start() 视频——我只是在暂停时使用了 seekTo()

当我以 50 毫秒 的增量向前移动时,我看到一系列大约 4-5 帧重复,直到大约 2 秒过去;然后,预览帧集更改为新的 4-5 帧系列。这似乎与我之前的试验一致,在该试验中,我以 2000 毫秒 的增量向前移动,并看到每个 seekTo() 调用都有一个独特的帧。

总而言之,当视频暂停时,MediaPlayer 似乎会在每 2 秒的时间间隔内挑选几帧用作预览帧。

关于java - MediaPlayer seekTo() 不更新 SurfaceView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232827/

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