7

我正在开发一个应用程序,其中视频以 3 个不同的时间间隔暂停。在第二次暂停之后,如果单击按钮,它应该从上一个位置开始。

例如。如果它当前在 1:30 暂停,然后单击按钮,它会转到上一个书签,即 00:45。

我认为使用 MediaPlayer.seekTo() 将帮助我实现这一目标。但是, seekTo() 根本不寻找位置。即使在调用 seekTo(); 之后 currentPosition 也保持不变;

这是我的代码。

mediaPlayer.setOnSeekCompleteListener(new OnSeekCompleteListener() {
    @Override
    public void onSeekComplete(MediaPlayer mp) {
        Log.d("VID_PLAYER","Seek Complete. Current Position: " + mp.getCurrentPosition());
        mp.start();
    }
});

在下面的某个地方,我有这个......

mediaPlayer.seekTo(45000);

问题是什么?为什么不是 seekTo(); 在职的?任何帮助,将不胜感激。

我目前正在 Android v4.0.3 (ICS) 上测试它

4

4 回答 4

3

Android 无法做到这seekTo一点的原因之一是视频的奇怪编码。例如,在 MP4 格式中,可以在文件的开头和结尾指定所谓的“搜索点”(即搜索索引)。如果在文件开头指定了它们,那么它们的seekTo行为将正确。但是如果在文件末尾指定了它们,则 seekTo 将什么都不做,视频将从seekTo.

这是在 Android 4.4.2 中确认的错误或功能。

PS在 Youtube 上,所有视频都在文件开头使用“搜索点”进行编码。因此,如果您在应用程序中遇到此问题,seekTo请首先使用 Youtube 中的一些视频文件检查您的应用程序。也许你需要重新编码你的视频......

于 2014-12-26T00:51:05.893 回答
3

尝试下面给出的代码片段,以更准确地寻找媒体的特定位置。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
    mediaPlayer.seekTo(seekPosition,MediaPlayer.SEEK_CLOSEST);
else 
    mediaPlayer.seekTo((int)seekPosition);

请记住 - 随着准确性的提高,搜索速度会降低。因此,在播放高分辨率视频时,建议不要MediaPlayer.SEEK_CLOSEST更频繁地使用。

于 2020-01-18T08:54:27.907 回答
1

您的问题是否与此错误有关: https ://code.google.com/p/android/issues/detail?id=4124

我记得大约一年前遇到过这种情况。我认为我当时没有找到解决方法。

于 2013-04-18T07:38:11.923 回答
1

从 API 26 开始,Android 添加了一个

seekTo(long msec, int mode);

通过指定 a mode,我们可以告诉我们MediaPlayer如何寻找:

  • SEEK_PREVIOUS_SYNC: 具有与 相同的行为seekTo(int msec)。它向后寻找最近的“搜索点”(即同步帧)。
  • SEEK_NEXT_SYNC: 与 相同PREVIOUS,但向前看。
  • SEEK_CLOSEST_SYNC:这会寻找给定msec时间最近的同步帧。
  • SEEK_CLOSEST:这会寻找给定msec时间最近的帧。

几天前我遇到了类似的问题,通过使用SEEK_CLOSEST模式,这个问题得到了解决。

作为参考,请查看以下链接:https://developer.android.com/reference/android/media/MediaPlayer.html#seekTo(long,%20int)

https://en.wikipedia.org/wiki/Video_compression_picture_types

于 2018-09-25T14:43:27.527 回答