PTSを変更することで再生速度を上げたり下げたり、複数のファイルを合わせたりするときにPTSを揃えたりするのに使うsetpts、asetptsフィルタの使い方。音声の速度変更にはrubberband フィルタを使う方法もある。

サンプリング周波数を変えずにテンポとピッチを変える rubberband

基本コマンド

再生速度を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
    フレームレート。固定フレームレートだけを定義する。固定値。音声はNaN
  • PTS
    PTS(Presentation Timestamp)秒。PTS*TBでよく見る秒時間になる
  • 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

trim, atrimフィルタで10秒から20秒までカットする。
trim=10:20,setpts=PTS+10/TB;atrim=10:20,asetpts=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

動画の途中、ここでは10秒から12秒までをカットして前後をつなげる。
ffmpeg -i input -vf select='not(between(t,10,12))',setpts=N/FRAME_RATE/TB -af aselect='not(between(t,10,12))',asetpts=N/SR/TB output

コメントを残す

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

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