我正在寻找一种方法提取每一秒(第二)i-帧使用ffmpeg,并保存作为一个新的时间间隔视频。
到目前为止,我通过以下命令保存了所有i帧:
ffmpeg -i $FILE -vf "select='eq(pict_type,I)',setpt=N/FRAME_RATE/TB“-r 29.97 -vcodec libx264 -b:v 62M -an ./enc/${FILE}_cnv.mp4
但我需要减少两倍的I-帧的结果视频。例如,如果原始视频中的i帧是1-8-16-24-32-40.,我只需要1-16-32-48.有没有一种方法可以不制作带有所有关键帧的临时视频来提取它们?
更新:由于没有找到通用解决方案,我决定使用:-vf "select='eq(pict_type,i)* no (mod(n,16))‘,setpts=N/FRAME/TB“进行欺骗。
发布于 2022-11-27 07:13:24
乍一看,您应该可以在筛选器中使用第二步来选择偶数或奇数i帧,但经过测试后,这似乎是不可能的。
在查看帧号时,我们有两个选择:n
(似乎是绝对帧号)和selected_n
(似乎是过滤的帧号)。对于如何定义这些值,ffmpeg过滤器文档并不十分清楚。
在我的测试中,如果您使用这样的过滤器:
select='eq(pict_type,I)*not(mod(n,2))'
如果省略了*not(mod(n,2))
,您将得到相同的帧数,我假设这是因为由于编码的工作方式,我的帧总是落在奇数n
上。
但是,如果我们尝试使用selected_n
,我发现只有一个帧被选中。这是有意义的,因为过滤器永远不能匹配偶数选定的帧,所以它将永远只匹配第一个。
鉴于此,我认为您唯一的选择是使用两阶段的方法,使用一次运行的ffmpeg获得您的iframes,然后第二次运行ffmpeg来删除所有其他帧。类似于:
ffmpeg -i $FILE -vf "select='eq(pict_type,I)' $TMPFILE
ffmpeg -i $TMPFILE -vf "select='not(mod(n,2))' $CONVERTED_FILE
https://stackoverflow.com/questions/74587943
复制相似问题