gpt4 book ai didi

java - ffmpeg 从修剪的视频中获取帧的时间

转载 作者:行者123 更新时间:2023-12-04 23:26:03 24 4
gpt4 key购买 nike

我在我的应用程序中使用 FFmpeg 从视频中提取帧,这些帧将被添加到修剪视频 View 中,您可以在其中了解视频中特定时间视频中发生的情况。所以每一帧都需要代表视频中的一些时间。

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

"-i",
videoCroppedFile.getAbsolutePath(),
"-vf",
"fps=1/" + frameSeperation,
mediaStorageDir.getAbsolutePath() +
"/%d.jpg"

我的应用程序允许您录制最长 20 秒的视频。从视频中提取的帧数取决于捕获的视频的长度。 frameSeparation 是通过以下代码计算的。
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

    所以我做了你在评论中所说的:
     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在我将 vFrames 放入 cmd 的同一点。它似乎根本不起作用,现在没有从视频中提取帧

    最佳答案

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

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

    在您的情况下,我建议尽可能避免舍入或去除小数值。或者在最后做。

    关于java - ffmpeg 从修剪的视频中获取帧的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47320219/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com