pts を処理することで再生速度を上げたり下げたり、複数のファイルを合わせたりするときに pts を揃えたりするのに使う setpts, asetpts フィルタの使い方。

基本コマンド

再生速度を2倍にする。
ffmpeg -i input -filter_complex setpts=(PTS-STARTPTS)/2;atempo=2 output

再生速度を半分にする。
ffmpeg -i input -filter_complex setpts=2*(PTS-STARTPTS);atempo=0.5 output

【ffmpeg】倍速再生できる動画にエンコードする

2つの映像の pts を 0 開始に揃えて縦に並べる。
ffmpeg -i input1 -i input2 -filter_complex [0:v]setpts=PTS-STARTPTS[v0];[1:v]setpts=PTS-STARTPTS[v1];[v0][v1]vstack output

公式ドキュメント:FFmpeg Filters Documentation : setpts, asetpts

オプション

評価式のオプション

  • FRAME_RATE
    フレームレート。固定フレームレートだけを定義する
  • PTS
    PTS(presentation timestamp)
  • N
    0 から始まる映像フレーム数、または音声サンプル数
  • NB_CONSUMED_SAMPLES
    累積の音声サンプル数
  • NB_SAMPLES, S
    現在の音声サンプル数
  • SAMPLE_RATE, SR
    音声サンプルレート
  • STARTPTS
    入力した映像の pts
  • STARTT
    最初のフレームの動画時間
  • INTERLACED
    現在のフレームがインターレースかどうか。インターレースなら 1。そうでなければ 0
  • T
    現在のフレームの動画時間(秒)
  • POS
    現在のフレーム数。分からなければ未定義になる
  • PREV_INPTS
    1つ前フレームの PTS
  • PREV_INT
    1つ前フレームの T
  • PREV_OUTPTS
  • PREV_OUTT
  • RTCTIME
    RTC のマイクロ秒。現在は非推奨。代わりに time(0) を使う
  • RTCSTART
    RTC のマイクロ秒。マイクロ秒で動く
  • TB
    タイムスタンプのタイムベース

応用例

pts を 25fps に修正する。映像がそれよりも高fpsなら再生速度が遅くなり、低fpsなら再生速度が速くなる。
ffplay -f lavfi -i testsrc2=r=60,setpts=N/(25*TB)
ffplay -f lavfi -i testsrc2=r=10,setpts=N/(25*TB)

開始 pts を10秒進める。用途は動画の開始 pts が 0 開始でない場合に修正する。利用例
setpts=PTS+10/TB

フレーム数から現在のタイムスタンプ秒に変換しタイムスタンプを振り直す。
setpts=N/FRAME_RATE/TB

音声サンプル数から現在のタイムスタンプ秒に変換しタイムスタンプを振り直す。
asetpts=N/SR/TB

タイムスタンプを振り直すのは trim, select フィルタなどで複数に分割、特定フレームだけ出力する場合に使う。振り直さなければ元映像の pts で分割されるので、出力されなかった映像は動かなくなる。
ffmpeg -i input -an -vf select=eq(pict_type\,I) -vsync 0 -t 5 output.mp4
ffmpeg -i input -an -vf select=eq(pict_type\,I),setpts=N/FRAME_RATE/TB -vsync 0 -t 5 output.mp4

trim フィルタの使い方
特定の映像フレームや音声サンプルを出力する select, aselect

コメントを残す

メールアドレスが公開されることはありません。

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