web-dev-qa-db-ja.com

X秒ごとに最初のXフレームをFFmpegでPNGにキャプチャする方法は?

コマンドラインを使用するのは初めてです。学ぶことはかなりクールでエキサイティングですが、私は立ち往生しています。

たとえば、5秒ごとに最初の8フレームを画像にキャプチャしたいビデオがあります。

私はこのコマンドを書きました:

ffmpeg -i video.mp4 -vf fps=8/20 out%04d.png

最初の8フレームではなく、20秒ごとに8フレームをキャプチャしていることがわかります。コマンドでこれを指定する方法はありますか?

1
AFG

これは、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_。

3
Gyan

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を取得します。

1
slhck