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().来自[这个问题]:
\n\n\n\n\n“您无法使用 Android 提供的 MediaPlayer API 进行逐帧搜索。
\n\n如果您确实想要实现逐帧搜索,那么您必须\n 使用 FFMPEG 等第 3 方多媒体框架,或者您需要\n 实现您自己的框架。”
\n
我创建了一些测试代码来尝试一下。我在使用\xe2\x80\x94之前没有start()播放视频,我只是在暂停时使用。seekTo()seekTo()
当我以50 毫秒的增量向前移动时,我看到一系列大约 4-5 帧重复,直到大约 2 秒过去;然后,预览帧集更改为新的 4-5 帧系列。这似乎与我之前的试验一致,其中我以2000 毫秒的增量前进,并看到每个seekTo()调用都有一个独特的帧。
总之,当视频暂停时,MediaPlayer 似乎会在每个 2 秒间隔中选择几个帧用作预览帧。
\n| 归档时间: |
|
| 查看次数: |
1967 次 |
| 最近记录: |