【问题标题】:Quickly extract multiple frames from multiple videos从多个视频中快速提取多个帧
【发布时间】:2019-05-11 18:02:16
【问题描述】:

我有一个包含视频文件的文件夹,需要在 Linux 上使用 bash 脚本从每个文件中提取 2+ 帧。目前我正在循环中为每个视频文件执行此操作:

ffmpeg -nostdin -loglevel fatal -ss 15 -i "${filename}" -frames:v 1 "${out1}"
ffmpeg -nostdin -loglevel fatal -sseof -15 -i "${filename}" -frames:v 1 "${out2}"

这会从末尾提取一帧 15s 和另一帧 15s。对于 N 个视频文件,我需要 2N 个 ffmpeg 调用。我尝试了-vf select,正如here 所问的那样,但这要慢得多,尤其是需要从头到尾选择帧。另外,我已经在使用 GNU 并行,这有很大的不同。

性能其实还不错。但我的问题是,这可以进一步改进吗?我希望有一种方法来

  • 在一个 ffmpeg 调用中提取两个帧(比两个单独的调用更快),或者
  • 每次调用为 ffmpeg 提供多个文件(以减少进程启动开销)

【问题讨论】:

    标签: bash performance video ffmpeg


    【解决方案1】:

    您可以多次提取相同的输入,也可以在同一命令中提取多个输入。

    基本命令结构是

    ffmpeg -nostdin -loglevel fatal
           -ss 15     -i "${filename}"
           -sseof -15 -i "${filename}"
           -ss 15     -i "${filename2}"
           -sseof -15 -i "${filename2}"
           -map 0:v:0 -frames:v 1 "${file1-head}"
           -map 1:v:0 -frames:v 1 "${file1-tail}"
           -map 2:v:0 -frames:v 1 "${file2-head}"
           -map 3:v:0 -frames:v 1 "${file2-tail}"
    ...
    

    我怀疑这会为一小部分文件带来很大的改进。

    【讨论】:

    • 正是我想要的,谢谢。如果我每次 ffmpeg 调用处理 15 个文件,则 1000 个视频文件所需的时间减少 1/3。这当然只是针对我的脚本,在 8 核机器上使用 GNU 并行并包括额外处理所需的一些恒定时间,因此它不是通用基准。但速度提升非常显着。
    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多