首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从裁剪视频中获取帧的时间

问从裁剪视频中获取帧的时间
EN

Stack Overflow用户
提问于 2017-11-16 01:45:06
回答 1查看 689关注 0票数 0

我在我的应用程序中使用FFmpeg从视频中提取帧,这些帧将被添加到一个修剪视频视图中,在该视图中,您可以得到在视频中特定时间发生的视频中发生的事情。因此,每一帧都需要在视频中表示一段时间。

我不太明白FFmpeg是如何产生这些帧的。这是我的代码:

代码语言:javascript
复制
"-i",
videoCroppedFile.getAbsolutePath(),
"-vf",
"fps=1/" + frameSeperation,
mediaStorageDir.getAbsolutePath() +
"/%d.jpg"

我的应用程序允许你录制一个最大长度为20岁的视频。从视频中提取的帧数取决于所捕获的视频的长度。frameSeperation是根据以下代码计算的。

代码语言:javascript
复制
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
    long videoLength = Long.parseLong(time) / 1000;
    double frameSeperationDouble = (double) videoLength;
    // Divide by 11 because there is a maximum of 11 frames on trim video view
    frameSeperationDouble /= 11;
    frameSeperationDouble = Math.ceil(frameSeperationDouble);
    int frameSeperation = (int) frameSeperationDouble;

也许上面的逻辑很糟糕,如果有更好的方法,请有人告诉我。

总之,我运行了代码,下面是一些测试用例:

  • 一段长达6秒的视频有7帧。
  • 一段长达2秒的视频有3帧。
  • 以10秒的长度拍摄的视频有12帧。
  • 一段长达15秒的视频有9帧。
  • 一段长达20秒的视频有11帧。

没有一致性,因此我发现很难在每一个框架上设置时间戳。我觉得我的逻辑是错误的,或者我不理解。任何帮助都非常感谢。

更新1

所以我照你在评论中说的做了:

代码语言:javascript
复制
 final FFmpeg ffmpeg = FFmpeg.getInstance(mContext);
        final File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
                + "/Android/data/"
                + mContext.getPackageName()
                + "/vFrames");

    if (!mediaStorageDir.exists()){
        mediaStorageDir.mkdirs();
    }

    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    retriever.setDataSource(mContext, Uri.fromFile(videoCroppedFile));
    String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
    long videoLength = Long.parseLong(time) / 1000;
    double frameSeperationDouble = (double) videoLength / 8;

    retriever.release();

    final String cmd[] = {

            "-i",
            videoCroppedFile.getAbsolutePath(),
            "-vf",
            "fps=1/" + frameSeperationDouble,
            "-vframes," + 8,
            mediaStorageDir.getAbsolutePath() +
            "/%d.jpg"
    };

我还在将"-vframes=" + 8放在cmd中的同一点上尝试了vFrames。它似乎根本不起作用,现在没有从视频中提取任何帧

EN

回答 1

Stack Overflow用户

发布于 2017-11-16 08:21:15

这是fps=x的有效流,使用默认的舍入方法near,

生成1/x秒的间隔,例如,对于x=1/3,间隔为0-3s,3-6s,6-9s.在每个间隔内,选择一个时间戳最近于该间隔中点的早期帧。这可能导致重复帧,当最近的帧属于较早的间隔,并且已经为该间隔选择了。如果源是可变帧速率,则很可能发生。

在您的情况下,我建议避免舍入或剥离小数值,如果可能的话。或者在最后再做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47320219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档