影片所需的开始时间同步

时间:2018-08-15 09:28:04

标签: java android

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

    }
};

1 个答案:

答案 0 :(得分:0)

关键帧

视频由通常每秒30帧的帧(图片)组成。框架可以是两种类型:

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

关键帧包含完整图片,而非关键帧包含上一个关键帧的更改。因此,如果您查看任何非关键帧,您只会看到一部分的完整图像。没有关键帧没有关键帧毫无意义。

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

要点是:

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

这里是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或任何其他视频工具中准备视频。