繁体   English   中英

从n0个初始帧开始每N帧采样一次视频

[英]Sampling video every N frames starting at n0 initial frame

我想弄清楚如何从n_i帧开始,每N帧对视频流x[n]进行采样, i < N ,以便最终得到N长度为len(x) / N新视频。

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

这里是我要实现的目标图: 采样

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

实作

最后,我设法编写了最终实现,为了完整起见,在此报告。
它的确将最小尺寸缩放到256 ,处理的max_frames不超过max_frames ; k帧执行一次采样,将第一个k - 1样本发送到一个文件夹,将第k个样本发送到另一个文件夹。 还将输出帧频设置为输入平均帧频,否则,某些视频将以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的选择过滤器,该过滤器允许您使用顺序帧号评估表达式,并决定是否跳过它(以及不跳过时将其发送到哪个输出)。

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

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。

暂无
暂无

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

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