
一連のビデオにスローモーション効果を適用しようとしています。さらに、これらのビデオは拡大縮小、パディング、クロスフェードされます。以下はスローモーションを適用するために使用しているコマンドです。
ffmpeg -i 1.mp4 -filter_complex "
[0:v]trim=0:5,setpts=PTS-STARTPTS[tv1];
[0:v]trim=5:7,setpts=PTS-STARTPTS[tv2];
[0:v]trim=start=7,setpts=PTS-STARTPTS[tv3];
[tv2]setpts=PTS*2[slow];
[tv1][slow][tv3]concat=n=3:v=1:a=0[out]" -map [out] -c:v libx264 test.mp4
質問が2つあります。
- スローモーション効果は5秒目からトリミングして適用しているのに
[tv2]
、実際は4秒目から適用されています。これはなぜでしょうか?
以下は、上記のコマンドの連結直後に他の処理に使用しているコマンドです。
[concat0]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=out:st=16:d=2:alpha=1,setpts=expr=PTS-STARTPTS+10/TB[va0];
そこで、 を指定する必要がありsetpts
、現在のビデオの前のビデオの累積期間を使用しています。こここれは私が使用している完全なコマンドです。
- スローモーション効果を適用した後、ビデオの継続時間を計算するにはどうすればよいでしょうか? たとえば、ここで説明した最初のコマンドによるビデオ結果の継続時間は、秒単位またはマイクロ秒単位でどのくらい増加しますか?
答え1
質問1- コマンドが不完全です。考慮されていないためです。オーディオトラックでは、PTSのみを変更しましたビデオトラック。違いを確認するには、これを試してください。
# no-good, starts from 4th second audio with a frozen video frame
ffmpeg -i in.mp4 -vf trim=5:7 out.mp4
#
# works as expected, both audio and video start at 5th second
ffmpeg -i in.mp4 -vf trim=5:7 -af atrim=5:7 out.mp4
質問2- これも、同じ理由で期待どおりには機能しませんが、前の問題を修正したら、"前" と "後" の時間を相関させる、あまりエレガントではないが効果的なトリックがあります。
# overlay the input video with a timer, pulled to the right 200 pixels
ffmpeg -i in.mp4 -f lavfi -i testsrc=n=3 -vf overlay=x=200 in-with-time.mp4
#
# do all your manipulation, and finaly overlay with another timer at x=0
ffmpeg -i in-with-time.mp4 -f lavfi -i testsrc=n=3 -filter_complex "..stuff...,overlay[out]" out.mp4
これにより、フレームごとに元の時間と結果の時間が 1 ミリ秒の精度で提供されます。