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
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秒進める。
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