我想从视频的每一秒中提取第一张图像。我有一个基于视频时间码的命令行,当视频是逐行扫描时它可以正常工作,但在隔行扫描时则不行(在这种情况下只输出第一个字段,从而创建半高图像)。我尝试了各种组合,bwdif
但select
我创建的过滤器链要么导致错误,要么仍然返回半尺寸图像。有人可以帮我解释语法吗?
以下是我对渐进式视频源正常工作的过滤器的调用:
ffmpeg -i $infile -vf "select='if(eq(n\,0),1,floor(t)-floor(prev_selected_t))" -vsync 0 $outfile
以下仍然只返回隔行源的半高图像:
... -vf "bwdif=0,select='if(eq(n\,0),1,floor(t)-floor(prev_selected_t))'"
... -vf "bwdif=0,select='between(mod(n\,$ips)\,1\,2)'"
--$ips
是每秒的图像数量
... -vf "select='between(mod(n\,$ips)\,1\,2)',bwdif=0"
...并且在相关说明中,是否有关于select
过滤器的真正完整,详尽的文档?(不,我不认为“ffmpeg 过滤器”第 16.16 章是详尽的)。
谢谢。
答案1
解决方案是使用交织首先过滤。这会导致半高帧重新隔行,然后再使用 bwdif 将它们反隔行成完整帧。对我有用的完整命令行是:
ffmpeg -i $infile -vf "tinterlace=mode=merge,bwdif=0,select='if(eq(n\,0),1,floor(t)-floor(prev_selected_t))" -vsync
非常感谢 stackoverflow 的一个帖子中名为 Gyan 的回复者(可能就是从事 ffmpeg 开发的人?)。