特定のフレーム間隔での出力なら trim. atrim
フィルタでもよいが、select
フィルタはピクチャータイプやインターレースタイプの指定でも出力できるがものすごく処理が遅い。
基本コマンド
select
フィルタを使いながら音声も同期しつつ出力するのは難しいので音声は無効化 -an している。
0(最初)から100フレーム目までの合計101フレームを出力する。
ffmpeg -i input -vf select="between(n\,0\,100)",setpts=PTS-STARTPTS -vsync 0 -an output
同じ出力結果を trim
フィルタで行う。こちらの方が処理が速い。
ffmpeg -i input -vf trim=start_frame=0:end_frame=101,setpts=PTS-STARTPTS -vsync 0 -an output
開始45秒から30フレーム分出力する。
ffmpeg -i input -vf select='gt(t,45)*lt(selected_n,30)',setpts=PTS-STARTPTS -vsync 0 -an output
ffmpeg -i input -vf trim=45,setpts=PTS-STARTPTS,trim=end_frame=30 -vsync 0 -an output
Iフレームだけ出力する。
ffmpeg -i input -vf select='eq(pict_type\,I)' -an -vsync 0 output.mp4
ffmpeg -i input -vf select='eq(pict_type\,I)' -an -vsync 0 output-%03d.png
キーフレームだけ出力する。
ffmpeg -i input -vf select='eq(key\,1)' -an -vsync 0 output.mp4
ffmpeg -i input -vf select='eq(key\,1)' -an -vsync 0 output-%03d.png
ffmpeg -skip_frame nokey -i input -an -vsync 0 output.mp4
ffmpeg -skip_frame nokey -i input -an -vsync 0 output-%03d.png
映像の変化が8割以上を出力する
ffmpeg -i input -vf select='gte(scene\,0.8)' -an -vsync 0 output.mp4
ffmpeg -i input -vf select='gte(scene\,0.8)' -an -vsync 0 output-%03d.png
画像を1フレームに複数枚並べるには tile
フィルタを使う。
1フレームに複数のフレームを表示する tile
条件の設定には以下の評価式を使う。
ffmpeg で使える計算書式
公式ドキュメント:FFmpeg Filters Documentation : select_002c-aselect
オプション
音声のカットはあまり正確ではないらしいのと、使い方がよく分からない。
- n
連続したフレーム。0 から始まる - selected_n
選択された連続フレーム。0 から始まる。条件で範囲を狭めて最初以外からの連続フレームを選択するときに使う - prev_selected_n
選択された連続フレームの最後のフレーム。選択されてなければ NAN - TB
タイムスタンプのタイムベース - pts
映像の PTS - t
映像の PTS 秒。pts*TB = t になる - prev_pts
映像の PTS。pts との違いは1フレーム次の pts までのフレームを対象とする - prev_selected_pts
最後にフィルタが当たった映像フレームの PTS。固定値。不明ならば NAN。使い方が分からない - prev_selected_t
選択された最後の映像フレームの PTS 。固定値。不明ならば NAN。使い方が分からない - start_pts
最初の映像フレームの PTS。一般的には 0 になることが多い。固定値。不明ならば NAN - start_t
最初の映像フレームの PTS 秒。一般的には 0 になることが多い。固定値。不明ならば NAN - pict_type (video only)
ピクチャータイプの指定 - I
I フレーム - P
P フレーム - B
B フレーム - S
スイッチフレーム。詳細不明。VC-1で使われているらしい - SI
スイッチングIフレーム - SP
スイッチングPフレーム - BI
スペシャルイントラフレーム - interlace_type (video only)
フィールドタイプの指定 - PROGRESSIVE
- TOPFIRST
- BOTTOMFIRST
- consumed_sample_n (audio only)
- samples_n (audio only)
- sample_rate (audio only)
- key
キーフレームなら 1、それ以外なら 0。I フレームより出力が少なくなる。つまりキーフレームはすべてIフレームだが、Iフレームのすべてがキーフレームではない。ffprobe の key はこれのこと - pos
position の値。分からなければ -1 になる。showinfo
フィルタで調べられる - scene (video only)
変化率。小さい値ほど変化が小さく、大きい値ほど変化が大きいフレームだけを検出する。一般的には大きな値になるほどIフレームだけになる。0 は完全一致 - concatdec_select