视频所需的开始时间同步



我是Android开发的新手。 我的 Raw 文件夹中有一个视频,我想以不同的部分播放它,例如 20-40 秒或 1:20-2.30 秒。问题出在视频时间同步上。假设我的视频从 1:34(整数为 94(秒开始,在小于 23 的 API 上,它工作正常,并且完全在我想要的时间播放视频,但在高于 23 的 API 上,它从 1:32 秒(int 为 92(开始播放。如何解决这个问题?任何帮助和建议将不胜感激。谢谢

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();
}
}
}
};

关键帧

视频由帧(图片(组成,通常每秒 30 帧。帧可以有两种类型:

  • 关键帧、同步帧或帧内
  • 不是关键帧

关键帧包含完整图片,而非关键帧包含前一个关键帧的更改。因此,如果你看任何非关键帧,你不会看到一个完整的图像只是一部分。 没有关键帧就没有关键帧就没有意义。

关键帧占用更多空间,非关键帧占用的空间更少。此算法提供了减小视频文件大小的功能。

要点是:

  • 如果一个关键帧每秒出现一次,则意味着此秒中其他 29 个帧不是关键帧。
  • 不同视频中关键帧的频率可能不同,例如,一个视频每秒有 1 个关键帧
  • ,另一个视频每 3 秒有 1 个关键帧。

这是维基链接以获取更多详细信息。

搜索视频

VideoView,你似乎正在使用什么,在引擎盖下使用MediaPlayer .seekTo((方法。此方法将查找您的视频以毫秒为单位设置。但是,如果在此毫秒的视频中包含非关键帧,seekTo((方法将搜索到上一个关键帧(因为非关键帧对于观看视频的用户没有意义(。

返回到上一个关键帧将减少您在 seekTo(( 方法中设置的毫秒数。这就是为什么您的视频从 1:32 秒而不是 1:34(int 为 94(秒播放的原因。它完全不依赖于Android API级别。

溶液

实际上,没有简单的解决方案可以在代码中实现,完全取决于您将使用的视频。

视频的关键帧频率应为每秒 1 个或更高频率。在这种情况下,您将毫无问题地将视频搜索到所需的秒数。

如果关键帧的频率低于每秒 1 个(例如每 2 秒 1 个(,则需要重新转换视频以达到 1/秒的关键帧频率。以编程方式执行此操作并非易事,因此最好在Adobe Premier或任何其他视频工具中准备视频。

最新更新