一部のフィルタで設定できる動画時間が異なるファイルの挙動設定を行うframesyncの設定方法。以前は個別のフィルタ毎に設定していたがこれのおかげで設定内容が統一された。

記事にしているフィルタ。

オプション

ts_sync_mode2022年8月10日に追加された。track #9689

  • eof_action[int] 2ファイル目が終了したときの1ファイル目の挙動指定
    • 0, repeat:最終フレームを繰り返す。既定値
    • 1, endall:片方の入力が完了したら両方の入力を終わらせる
    • 2, pass:1ファイル目が終了したら2ファイル目に切り替える
  • shortest[boolean]
    時間の短いファイルが最後まで処理したら終了する
    既定値:0(終了しない)
  • repeatlast[boolean]
    時間の短いファイルが最後まで処理し、時間の長いファイルが最後まで処理し終わるまで、時間の短いファイルの最終フレームを繰り返す
    既定値:1(繰り返す)
  • ts_sync_mode[int]
    タイムスタンプの同期方法。nearestは2入力目のファイルがmkv、またはwebmコンテナで、1入力目のファイルがそれら以外の時にタイムスタンプを合わせる。確認したのはmp4、mov、tsコンテナ。1入力目もmkv、またはwebmコンテナのときはdefaultのままでよい
    • 0, default:1入力目のフレームに最も近い、または等しいタイムスタンプを持つ2入力目のフレーム。既定値
    • 1, nearest:1入力目のフレームに最も近い絶対値のタイムスタンプを持つ2入力目のフレーム

公式ドキュメント:
FFmpeg Filters Documentation : Options for filters with several inputs (framesync)

コマンド例

eof_actionの挙動について。以下のoverlayフィルタは1ファイル目(黒)の映像に2ファイル目(白)の映像が上に載る。5番目以降のコマンド例はoverlayフィルタの読み込み順を入れ換えている。

通常の使い方。2ファイル目(白)を最後まで読み込む。
ffmpeg -f lavfi -i color=c=black:d=2 -f lavfi -i color=c=white:d=4 -filter_complex [0][1]overlay,realtime -f sdl -

2ファイル目(白)を最後まで読み込む。上と同じ。
ffmpeg -f lavfi -i color=c=black:d=2 -f lavfi -i color=c=white:d=4 -filter_complex [0][1]overlay=eof_action=0,realtime -f sdl -

2コマンドとも2ファイル目(白)が開始2秒で止まる。
ffmpeg -f lavfi -i color=c=black:d=2 -f lavfi -i color=c=white:d=4 -filter_complex [0][1]overlay=eof_action=1,realtime -f sdl -
ffmpeg -f lavfi -i color=c=black:d=2 -f lavfi -i color=c=white:d=4 -filter_complex [0][1]overlay=eof_action=2,realtime -f sdl -

2秒まで1ファイル目(黒)でそれ以降は(黒)の最終フレームが4秒まで続く。
ffmpeg -f lavfi -i color=c=black:d=2 -f lavfi -i color=c=white:d=4 -filter_complex [1][0]overlay=eof_action=0,realtime -f sdl -

1ファイル目(黒)が2秒で止まる。
ffmpeg -f lavfi -i color=c=black:d=2 -f lavfi -i color=c=white:d=4 -filter_complex [1][0]overlay=eof_action=1,realtime -f sdl -

1ファイル目(黒)が2秒まで読み込み終わると2ファイル目(白)に切り替えてさらに4秒まで続く。
ffmpeg -f lavfi -i color=c=black:d=2 -f lavfi -i color=c=white:d=4 -filter_complex [1][0]overlay=eof_action=2,realtime -f sdl -

2 thoughts on “2ファイル入力するフィルタの挙動設定 framesync

  • youk

    はじめまして。
    いつもこちらの記事を参考にさせていただいています。

    一箇所、公式ドキュメントに書いてある内容と誤認しうる箇所があったので、僭越ながらご指摘させていただきます。

    > 両方のファイルを最後まで読み込む

    endallオプションを使うと、「片方の入力が完了したら両方の入力を終わらせる」と公式ドキュメントには書いてあるようです。
    > End both streams.

    ffmpeg 4.2.2 にて公式ドキュメント通りの挙動を確認できましたので、念の為ご報告まで。

    • admin

      youkさん指摘ありがとうございます。
      再度内容を確認し説明文を指摘されたように修正しました。

      またなにか間違い、不明点などありましたら遠慮無く指摘くださいませ。

コメントを残す

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

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