MediaPlayer seekTo()不更新SurfaceView

Ser*_*iro 6 java video android android-mediaplayer

我已经看到很多关于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);
Run Code Online (Sandbox Code Playgroud)

/** 
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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 开始播放视频;

  • 打电话seekTo();

  • 暂停它onSeekComplete().

Jst*_*wll 4

来自[这个问题]:

\n\n
\n

“您无法使用 Android 提供的 MediaPlayer API 进行逐帧搜索。

\n\n

如果您确实想要实现逐帧搜索,那么您必须\n 使用 FFMPEG 等第 3 方多媒体框架,或者您需要\n 实现您自己的框架。”

\n
\n\n

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

\n\n

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

\n\n

总之,当视频暂停时,MediaPlayer 似乎会在每个 2 秒间隔中选择几个帧用作预览帧。

\n