MediaPlayer.seekTo()没有寻求在Android上定位

时间:2013-04-18 07:32:14

标签: android android-mediaplayer

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

EG。如果它当前在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 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

我记得大约一年前遇到这个问题。我当时认为我没有找到解决方法。

答案 2 :(得分:1)

请尝试使用下面给出的代码段,以提高查找媒体特定位置的准确性。

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

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

答案 3 :(得分:0)

自API 26起,Android添加了一个

seekTo(long msec, int mode);

通过指定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