繁体   English   中英

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

[英]ffmpeg Get time of frames from trimmed video

我在应用程序中使用FFmpeg从视频中提取帧,这些帧将被添加到修剪视频视图中,在该视图中您可以了解视频在特定时间段内视频的情况。 因此,每个帧都需要代表视频中的某个时间。

我不太了解FFmpeg是如何产生帧的。 这是我的代码:

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

我的应用程序允许您录制视频的最大长度为20秒。 从视频中提取的帧数取决于所捕获视频的时长。 通过以下代码计算frameSeperation。

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"
    };

在将vFrame放入cmd的同一点,我也尝试了"-vframes=" + 8 现在似乎根本不起作用,没有从视频中提取帧

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM