コマンドラインを使用するのは初めてです。学ぶことはかなりクールでエキサイティングですが、私は立ち往生しています。
たとえば、5秒ごとに最初の8フレームを画像にキャプチャしたいビデオがあります。
私はこのコマンドを書きました:
ffmpeg -i video.mp4 -vf fps=8/20 out%04d.png
最初の8フレームではなく、20秒ごとに8フレームをキャプチャしていることがわかります。コマンドでこれを指定する方法はありますか?
これは、5秒ごとに8フレームを選択する選択フィルターの一般化されたバージョンです。
_ffmpeg -i in.mp4 -vf "select='if(not(floor(mod(t,5)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+8),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 out%d.png
_
これは、任意のフレームレート、定数、または可変のビデオで機能します。
mod(t,5)
の_5
_を間隔(秒単位)で変更します。そして、選択するフレーム数のld(2)+8
の_8
_。
select
フィルタを使用して、式に一致するフレームを選択できます。式がゼロ以外の数値またはtrue
と評価された場合、それらのフレームが選択されます。たとえば、フィルタが-vf select="between(n\, 0\, 7)"
の場合、最初の8フレームが選択されます。フレーム番号はn
で、ゼロから始まります。
これをmod
(モジュロ)演算子と組み合わせると、たとえば24フレームのすべてのグループの最初の8フレームを選択できるため、24fpsのビデオでは毎秒次のようになります。
ffmpeg -i input.mp4 -vf "select=between(mod(n\, 24)\, 0\, 7), setpts=N/24/TB" output.mp4
setpts
フィルタは、ビデオにギャップがないようにフレームのタイムスタンプを調整するために必要です。
5秒ごとに最初の8フレームを取得するには、24に5を掛けます。
ffmpeg -i input.mp4 -vf "select=between(mod(n\, 120)\, 0\, 7), setpts=N/24/TB" output.mp4
すべてをPNGに出力するには、出力をoutput.mp4
からoutput-%04d.png
に変更します—順番に番号が付けられたPNGを取得します。