【问题标题】:use of ffmpeg select filterffmpeg 选择过滤器的使用
【发布时间】:2019-08-22 04:41:32
【问题描述】:

我坚持使用 ffmpeg 选择过滤器,因为我只想获取输入视频的结束帧,但我无法弄清楚过滤器的选择表达式以完成工作, 我的代码如下所示:

ffmpeg -i in.mp4  -filter_complex  "select=expr_selecting_lastest_frame, overlay=overlay_expr"  out.jpg

现在我该如何编码 expr_selecting_lastest_frame ? 你们有想法吗? 还有其他方法可以完成工作吗?请帮忙,谢谢!

【问题讨论】:

  • 您只有一个输入。你在覆盖什么?
  • 嗨,Gyan,感谢您的评论,我会在实际工作中使用更复杂的过滤器链表达式,但在我的问题中,请只关注“选择”过滤器
  • 您无法使用选择过滤器执行此操作。选择过滤器有不同的应用,它用于比较视频中的后续帧并计算它们的差异值。我认为您必须按帧号或持续时间提取帧。

标签: video ffmpeg video-encoding video-editing


【解决方案1】:

使用 ffprobe 获取总帧数并将其分配给 var

$frame_count="$(ffprobe -v 0 -select_streams v:0 -count_frames -show_entries stream=nb_read_frames -of csv=p=0 in.mp4)";

在选择过滤器中使用 var

ffmpeg -i in.mp4 -filter_complex "select='eq(n,$frame_count)'" -vframes 1 out.jpg

或倒数第二帧

ffmpeg -i in.mp4 -filter_complex "select='eq(n,$frame_count-1)'" -vframes 1 out.jpg

【讨论】:

  • 我期待找到一种方法,只需编写一行命令即可完成目标,但似乎是不可能的,谢谢大家。
【解决方案2】:

对于具有已知持续时间和全局标头的格式,例如 MP4 或 MKV,您可以这样做

ffmpeg -sseof -3 -i file -vsync 0 -q:v 1 -update true out.jpg

sseof 从末尾开始搜索 - 我使用了 3 的值来说明具有较长音频流的文件。 -update 是一个 image2 复用器选项,它告诉 ffmpeg 覆盖输出文件。所以最后一次覆盖输出的时间是处理最后一帧的时候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2019-06-15
    • 1970-01-01
    • 2017-06-25
    • 2016-02-11
    • 1970-01-01
    相关资源
    最近更新 更多