我是Android开发的新手。我的原始文件夹中有一个视频,我想在不同的部分播放它,例如20-40秒或1:20-2.30秒。问题在于视频时间的同步。假设我的视频从1:34(整数94秒)秒开始。在小于23的api上可以正常工作,并且可以在我期望的时间准确播放视频,但是在大于23的api上可以从1:32秒(92 int)播放。如何解决这个问题呢 ?任何帮助和建议,将不胜感激。谢谢
case "Exer2":
{
mPlayBtn.setVisibility(View.INVISIBLE);
mVideo.postDelayed(onExer2ForEverySecond,1000);
Log.i(TAG,"Exer2 Case");
mStartTime=94*1000;
mVideo.seekTo(mStartTime);
mVideo.start();
break;
}
Runnable onExer2ForEverySecond=new Runnable() {
@Override
public void run() {
mVideo.postDelayed(onExer2ForEverySecond,1000);
if(mVideo.isPlaying())
{
if(mVideo.getCurrentPosition()==153*1000){
mVideo.pause();
}
}
}
};
答案 0 :(得分:0)
关键帧
视频由通常每秒30帧的帧(图片)组成。框架可以是两种类型:
关键帧包含完整图片,而非关键帧包含上一个关键帧的更改。因此,如果您查看任何非关键帧,您只会看到一部分的完整图像。没有关键帧,没有关键帧毫无意义。
关键帧占用更多空间,而非关键帧占用较少的匹配空间。该算法提供了减小视频文件大小的功能。
要点是:
这里是the Wiki link,以获取更多详细信息。
寻找视频
VideoView,您似乎正在使用MediaPlayer .seekTo()方法。此方法将以毫秒为单位查找您设置的视频。但是,如果在此毫秒内的视频中包含非关键帧,则 seekTo()方法将搜索到a previous key-frame(因为对于用户而言,非关键帧没有意义观看视频)。
返回上一个关键帧将减少您在seekTo()方法中设置的毫秒。这就是为什么您的视频从1:32秒而不是1:34(整数94秒)秒开始播放的原因。而且它完全不依赖于Android API级别。
解决方案
实际上,没有简单的解决方案可以在代码中实现,而所有解决方案都取决于要使用的视频。
视频的关键帧频率应该为每秒1次或更频繁。在这种情况下,您可以毫无问题地找到想要的视频。
如果关键帧的频率小于每秒1(例如,每2秒1个),则您将需要重新转换视频以使关键帧的频率达到1 /秒。以编程方式进行操作并非易事,因此,最好在Adobe Premier或任何其他视频工具中准备视频。