【发布时间】:2017-03-30 21:39:56
【问题描述】:
问题
我正在尝试弄清楚如何从 n_i、i < 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