2以上の映像をPTSに即して連続した映像で出力するinterleaveフィルタの使い方。フィルタを使ってエンコードするときは出力オプションに-rで動画のフレームレートを指定する。selectフィルタを併用するとシーンチェンジやフレームタイプ別にフィルタを使い分けられる。

関連フィルタ:
フィールドを足したり引いたりする tinterlace
ピクチャーをインターリーブ、デインターリーブするil

基本コマンド

selectフィルタで偶数と奇数フレームに分けて合わせている。適宜nullフィルタを変更。このコマンドでは何も変化しない。
ffmpeg -i input -vf "split[0][1];[0]select='mod(n-1,2)',null[0a];[1]select='mod(n,2)',null[1a];[0a][1a]interleave=2" -r 24000/1001 output
ffplay -i input -vf "split[0][1];[0]select='mod(n-1,2)',null[0a];[1]select='mod(n,2)',null[1a];[0a][1a]interleave"

上と同じ方法を2出力にするとコマンドが短くなる。
ffplay -i input -vf "select='1*mod(n-1,2)+2*mod(n,2)':n=2,interleave"
ffplay -i input -vf "select='1*mod(n-1,2)+2*mod(n,2)':n=2[0][1];[0][1]interleave"

selectフィルタでフレームタイプ別にフィルタを当てる。Iフレームにはsabフィルタ、Pフレームにはbm3dフィルタ。Bフレームにはnlmeansフィルタを当てる。
ffplay -i input -vf select='1*eq(pict_type,I)+2*eq(pict_type,P)+3*eq(pict_type,B)':n=3[i][p][b];[i][p][b]interleave=3
ffplay -i input -vf select='1*eq(pict_type,I)+2*eq(pict_type,P)+3*eq(pict_type,B)':n=3[i][p][b];[i]sab[i0];[p]bm3d=1[p0];[b]nlmeans[b0];[i0][p0][b0]interleave=3

boxblurフィルタをランダムに当てる。n=2で2出力している。
ffplay -i input -vf select='if(gt(random(0),0.2),1,2)':n=2[1],boxblur=2:2,[1]interleave

公式ドキュメント:FFmpeg Filters Documentation : interleave, ainterleave

オプション

  • nb_inputs, n[int]
    入力数の指定
    既定値:2
    範囲:1 から INT_MAX まで
  • duration[int]
    ファイルの時間が異なるときにどちらの出力を優先するか
    • 0, longest:長い方。既定値
    • 1, shortest:短い方
    • 2, first:最初に入力した方

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)