FFmpeg を使用して、6 秒ごとに 1 フレームずつビデオから画像を抽出しています。
Normal command on Dos ( Windows 8 OS) > ffmpeg -i in.mkv -r 1/6 %4d.png
速度が 15 ~ 20 程度と非常に遅いため、時間がかかりすぎます。
そこで私はskip_frame nokey
ffmpeg -skip_frame nokey -i "in.mkv" -vsync 0 -frame_pts true -r 1/6 %4d.png
これにより、約 200 倍 (10 倍高速) で抽出されます。
ただし、多くの画像がスキップされ、エラーが発生するという問題があります。
アプリケーションはストリーム内のマルチプレクサに無効な非単調増加 dts を提供しました
そこで私は次のコマンドを使用しました:
ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png
(ここに提供 -FFmpeg を使用して、X 秒ごとに最初の X フレームを PNG にキャプチャするにはどうすればよいですか?)
これにより、速度は 25 ~ 30 になります。
でより高速化できる方法はありますか-skip_frame
?
答え1
上記の元の投稿で投稿したコードは、これまで私が見つけた、より高速な画像抽出のための唯一のソリューションです。速度が最大 50 まで上がることもあります。
ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png
より高速な処理を実現するためにランダムな画像抽出 (キーフレームに基づく) を行う場合は、-skip_frame nokey を使用します。