2017-03-28 417 views
0

幀的確切數目我想從(對於精靈表和瓷磚它們)的視頻創建最多30個圖像的。FFMPEG - 從視頻中提取

我試過用'選擇'與'國防部',但如果幀的總數不適合整齊地放入所需數量的圖像(30),那麼我有時會以更多的圖像結束,有時更少。

例如,如果我的視頻是72幀長,我的「MOD」將是72/30,其爲2.4。

我從一個Python腳本,所以我做類似的過濾器下面運行以下命令:

select='not(mod(n\," + str(mod) + "))' 

我認爲國防部必須是一個整數,所以我既可以圓(?)下來,用2,給了我36倍的圖像或圓了,給了我24幅圖像

最新最好的方式來獲得正好是30? - 顯然這個間隔不會一樣,但那很好。

也許我可以使用for循環,以產生最接近所需間隔的幀的列表,然後通過在作爲選擇濾波器?

例如獲取幀我會做這樣的事情:

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做類似的事嗎?

回答

1

如果你有幀的列表,你可以只運行

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幀可以分解,截至1開出3 + 1出12。因爲在這種情況下,後者將與前者一致的選擇,我們可以挑選一幀早期即第11每12幀。

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+cn-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 

其中選擇條款的總數等於從每個組X個幀的所需要的幀的數量。


在任何情況下,你可以粗略地通過添加-vframes 30

+0

這是偉大的限制幀的總數,非常感謝你。我想我會用你的第一個建議,它有點笨重,但是有道理,而且很簡單,再加上我不確定'mod'會是什麼。再次感謝 –