Algorithm 从n0初始帧开始,每N帧采样一次视频 问题:
我试图弄清楚如何在每一帧中对视频流进行采样,从帧开始,从帧开始,这样我就可以得到长度为Algorithm 从n0初始帧开始,每N帧采样一次视频 问题:,algorithm,video,ffmpeg,sampling,Algorithm,Video,Ffmpeg,Sampling,我试图弄清楚如何在每一帧中对视频流进行采样,从帧开始,从帧开始,这样我就可以得到长度为len(x)/n的新视频 在公式中,这很简单:y\u i[n]=x[n\u i+n*n] 下面是我试图实现的目标的示意图: 贪婪的解决方案是简单地将帧转储到文件夹中,然后用适当索引的帧创建新的视频。 我希望有一些更优雅的解决方案与ffmpeg,因为我必须处理数百个视频 实施 最后,我成功地编写了最终的实现,为了完整起见,我在这里报告它。 它将最小尺寸缩放到256,处理的帧数不超过max_;每k帧执行一次采样,
len(x)/n的新视频
在公式中,这很简单:y\u i[n]=x[n\u i+n*n]
下面是我试图实现的目标的示意图:
贪婪的解决方案是简单地将帧转储到文件夹中,然后用适当索引的帧创建新的视频。
我希望有一些更优雅的解决方案与ffmpeg
,因为我必须处理数百个视频
实施
最后,我成功地编写了最终的实现,为了完整起见,我在这里报告它。
它将最小尺寸缩放到256
,处理的帧数不超过max_
;每k
帧执行一次采样,将第一个k-1
样本发送到一个文件夹,将第k个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"
)
k=5
kk=$(awk“开始{print 1/$k}”)
ffmpeg\
-i$src\u视频\u路径\
-一个\
-日志级错误\
-过滤复合物\
“设定值=$kk*PTS\
比例=w=2*trunc(128*max(1\,iw/ih)):h=2*trunc(128*max(1\,ih/iw))[m]\
[m] 选择=n=$k:e=(mod(n\,$k)+1)*lt(n\,$max\u帧)\
$(对于((i=1;一种溶液的离子)
您可以使用ffmpeg的选择过滤器,该过滤器允许您使用序列帧编号计算表达式,并决定是否跳过它(如果未跳过,则将其发送到哪个输出)
例如,要生成第二个视频,其中每次将拆分为四个视频,请执行以下操作:
ffmpeg -i input_video -vf select='not(mod(n-1\,4)), setpts=0.25*PTS' -an output_video
如果要拆分为不同的数字,请更改4
,如果需要不同的选择,请更改1
(因此,对于四个,您将运行四次,从不减去任何内容开始,到减去三结束)
-vf…-一个
片段是为了让视频以正确的速度播放,并具有正确的长度(这需要删除任何音频曲目)
一次性解决方案
选择过滤器还可以分割文件并分别保存每个输出。下面是一个命令,该命令将文件分割为k个输出(如果需要不同的扩展名,请更改.mp4)
k=4;ffmpeg-i输入文件-an-filter\u complex“setpts=`bc-l逐个解决方案
您可以使用ffmpeg的选择过滤器,该过滤器允许您使用序列帧编号计算表达式,并决定是否跳过它(如果未跳过,则将其发送到哪个输出)
例如,要生成第二个视频,其中每次将拆分为四个视频,请执行以下操作:
ffmpeg -i input_video -vf select='not(mod(n-1\,4)), setpts=0.25*PTS' -an output_video
如果要拆分为不同的数字,请更改4
,如果需要不同的选择,请更改1
(因此,对于四个,您将运行四次,从不减去任何内容开始,到减去三结束)
-vf…-一个
片段是为了让视频以正确的速度播放,并具有正确的长度(这需要删除任何音频曲目)
一次性解决方案
选择过滤器还可以分割文件并分别保存每个输出。下面是一个命令,该命令将文件分割为k个输出(如果需要不同的扩展名,请更改.mp4)
k=4;ffmpeg-i INPUT_FILE-an-filter_complex”setpts=`bc-l这应该可以使用ffmpeg中的'select'过滤器。我将尝试编写一个答案。Aww❤️ 类似于select='not(mod($i+n\,100))'
,i={0..$n}
。谢谢!我现在正在尝试。是的,没错。看起来应该可以一次完成所有视频,只需调用ffmpeg
,而不调用进行循环?是的。我正在阅读关于多个输出的文档。这应该可以使用ffmpeg中的“选择”过滤器。我会尝试写一篇文章回答,啊❤️ 类似于select='not(mod($i+n\,100))'
,i={0..$n}
。谢谢!我现在正在尝试一下。是的,没错。看起来应该可以一次完成所有视频,只需调用ffmpeg
,而不调用进行循环?是的。我正在阅读关于多个输出的文档。n-1
,n+1
?这有关系吗?为什么要减法?求和对我来说,ing更符合逻辑。我想它不会改变任何东西。如果你减去,那么数字与输出的顺序匹配。如果你加,那么你得到的是相反的顺序。在一个接一个的解决方案中,第二个VF将覆盖第一个。你必须链接过滤器。我刚刚尝试了你发布的第一行。我得到帧1 5 9 13 1721…
。因此,我认为仍然存在一些问题,因此,一切都很好,但每个视频的第二帧都是复制的。因此,我有0 4 4 8…
,1 5 9…
,2 6 6 10…
和3 7 11…
。VLC不喜欢视频长度,不允许我逐帧240
的292
,但目前这不是问题。(我的测试视频有294
帧。)n-1
,n+1
?这有关系吗?为什么要减法?对我来说,求和更符合逻辑。我想这不会改变任何事情。如果减法,则数字与输出顺序匹配。如果相加,则以相反顺序获得。在逐个解决方案中,第二个VF将覆盖第一个VF。您必须链接filters。我刚刚试过你发布的第一行。我得到了帧1 5 9 13 17 21…
。所以,我认为仍然存在一些问题,所以,一切都很好,但第二帧,每一个视频,都是复制的。所以,我有<