我正在制作一个应用,其中视频以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)上测试它
答案 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