【问题标题】:Sampling video every N frames starting at n0 initial frame从 n0 初始帧开始每 N 帧采样一次视频
【发布时间】:2017-03-30 21:39:56
【问题描述】:

问题

我正在尝试弄清楚如何从 n_ii < N 帧开始,每 N 帧对视频流 x[n] 进行采样,以便我最终得到 N 长度为 @987654328 的新视频@。

在公式中,这很简单:y_i[n] = x[n_i + n * N]

这里有一张我想要实现的图表:

贪婪的解决方案是将帧简单地转储到文件夹中,然后从适当索引的帧中创建新视频。 我希望ffmpeg 有一些更优雅的解决方案,因为我必须处理数百个视频。

实施

最后,我设法编写了最终实现,为了完整起见,我在此报告。
它确实将最小尺寸缩放到256,不处理超过max_frames;每k 帧执行一次采样,将第一个k - 1 样本发送到一个文件夹,将k-th 发送到另一个文件夹。它还将输出帧速率设置为输入平均帧速率,否则某些视频将以 120 Hz 的频率播放...

k=5
kk=$(awk "BEGIN{print 1/$k}")
ffmpeg \
    -i $src_video_path \
    -an \
    -loglevel error \
    -filter_complex \
        "setpts=$kk*PTS, \
        scale=w=2*trunc(128*max(1\, iw/ih)):h=2*trunc(128*max(1\, ih/iw))[m]; \
        [m]select=n=$k:e=(mod(n\,$k)+1)*lt(n\,$max_frames) \
        $(for ((i=1; i<=$k; i++)); do
            echo -n "[a$i]"
        done)" \
    $(for ((i=1; i<$k; i++)); do
        echo -n "-r $fps -map [a$i] $dst_video_path/$i.mp4 "
    done
    echo -n "-r $fps -map [a$k] $val_video_path/$k.mp4"
    )

【问题讨论】:

  • 这应该可以使用 ffmpeg 中的“选择”过滤器。我会试着写一个答案。
  • Aww ❤️ select='not(mod($i + n\,100))', i={0..$N}。谢谢!我现在正在尝试。
  • 是的,没错。看起来也应该可以一次性完成所有视频
  • 只打一次ffmpeg 没有for 循环?
  • 是的。我只是在阅读有关多个输出的文档。

标签: algorithm video ffmpeg sampling


【解决方案1】:

一对一解决方案

您可以使用 ffmpeg 的选择过滤器,它允许您使用顺序帧号评估表达式,并决定是否跳过它(以及如果不跳过则将其发送到哪个输出)。

例如,要生成第二个视频,您每次将其分成四个,您可以执行以下操作:

ffmpeg -i input_video -vf select='not(mod(n-1\,4)), setpts=0.25*PTS' -an output_video

如果您要拆分为不同的数字,请更改4,如果您想要不同的选择,请更改1(因此对于四个,您将运行它四次,从不减去任何内容开始,并以减去三结束。

-vf ... -an 片段是为了让视频以正确的速度播放,并具有正确的长度(这需要删除任何音轨)。

一次性解决方案

选择过滤器还可以拆分文件并分别保存每个输出。这是一个将文件拆分为 k 个输出的命令,(如果您想要不同的扩展名,请更改 .mp4)。

k=4;ffmpeg -i INPUT_FILE -an -filter_complex "setpts=`bc -l <<< 1/$k`*PTS[m];[m]select=n=$k:e=mod(n\,$k)+1`for ((i=1; i<=$k; i++)); do echo -n "[a$i]"; done`" `for ((i=1; i<=$k; i++)); do echo -n "-map [a$i] out$i.mp4 "; done`

命令中的循环只是写出[a1][a2]...-map [a1] out1.mp4...。除此之外的修改是使用filter_complex,它在处理多个输出时需要,并更改过滤器以将每个帧定向到自己的输出mod k。

【讨论】:

  • n-1, n+1?有关系吗?你为什么要减法?对我来说,求和更合乎逻辑。我想它不会改变任何东西。
  • 如果减去,则数字与输出的顺序相匹配。如果添加,则以相反的顺序获得它们。
  • 在一对一解决方案中,第二个 VF 将覆盖第一个。您必须链接过滤器。
  • 我刚刚尝试了您发布的第一行。我得到帧1 5 5 9 13 17 21 ...。所以,我觉得还是有一些问题?
  • 所以,一切都很好,但是每个视频的第二帧都被复制了。所以,我有0 4 4 8 ...1 5 5 9 ...2 6 6 10 ...3 7 7 11 ...。 VLC 不喜欢视频长度,并且不允许我逐帧逐帧 240292,但这暂时不是问题。 (我的测试视频有294 帧。)
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多