Select ffmpeg-从视频中提取准确的帧数

Select ffmpeg-从视频中提取准确的帧数,select,video,ffmpeg,frames,Select,Video,Ffmpeg,Frames,我想从一个视频中创建最多30个图像,并将它们平铺为一张精灵表 我试过用'select'和'mod'一起使用,但是如果总帧数与所需的图像数量不匹配,那么我有时会得到更多的图像,有时会更少 例如,如果我的视频是72帧长,我的“mod”将是72/30,即2.4 我是从python脚本运行此脚本的,因此我对过滤器执行以下操作: select='not(mod(n\," + str(mod) + "))' 我认为mod必须是一个整数,所以我可以向下取整并使用2,这给了我36幅图像,或者向上取整,这给了我

我想从一个视频中创建最多30个图像,并将它们平铺为一张精灵表

我试过用'select'和'mod'一起使用,但是如果总帧数与所需的图像数量不匹配,那么我有时会得到更多的图像,有时会更少

例如,如果我的视频是72帧长,我的“mod”将是72/30,即2.4

我是从python脚本运行此脚本的,因此我对过滤器执行以下操作:

select='not(mod(n\," + str(mod) + "))'
我认为mod必须是一个整数,所以我可以向下取整并使用2,这给了我36幅图像,或者向上取整,这给了我24幅图像

获得30分的最佳方式是什么很明显,间隔时间不会完全相同,但这很好

也许我可以使用for循环生成最接近所需间隔的帧列表,然后将其作为select过滤器传入

e、 g.为了获得框架,我会做如下操作:

nframes = 72 # number of frames in video
outImages = 30 # number of images I want
mod = float(nframes) / outImages # 2.4

frames = []

idx = 1

while i < nframes:
    print str(idx) + ": " + str(math.floor(i+0.5)) 
    frames.append(int(math.floor(i+0.5)))
    idx += 1
    i += mod

那么我是否能够将帧列表传递到ffmpeg命令中?或者我可以告诉ffmpeg做类似的事情吗?

如果你有一个帧列表,你可以直接运行

ffmpeg -i in.mp4 -vf select='eq(n,5)+eq(n,11)+eq(n,15)..' -vsync 0 frames%d.jpg
如果你能把频率分解成一个有理数并做一点数学运算,有一种方法可以直接用选择滤波器来实现

让我们假设f=2.4,与12/5相同。这意味着每12帧需要5帧。你可以将其分解为3分之一+12分之一。由于在这种情况下,后一帧将与前一帧的选择一致,因此我们可以提前选择一帧,即每12帧中的第11帧

ffmpeg -i in.mp4 -vf select='not(mod(n,3))+not(mod(n+1,12))' -vsync 0 frames%d.jpg
这个想法是把你的频率表示为一个倒数的和,1/f=1/m+1/n+1/p。如果分母之一是其他分母的倍数,则可以使用偏移设备n+c或n-c

一个更粗糙的方法是

ffmpeg -i in.mp4 -vf select='not(mod(n,12))+not(mod(n+3,12))+not(mod(n+5,12))+not(mod(n+7,12))+not(mod(n+11,12))` -vsync 0 frames%d.jpg
其中select子句的总数等于每组X帧所需的帧数


在任何情况下,您都可以通过添加-vframes 30来粗略地限制总帧数

太好了,非常感谢。我想我会使用你的第一个建议,它有点笨重,但有意义而且简单,而且我并不总是确定“mod”是什么。再次感谢