ファイルから読み込んだ比率に基づいてビデオの時間スケールを変更したいビデオがあります。
setpts
動画全体の速度を2倍にするには、フィルターを使用できることがわかりましたがsetpts=2*PTS
、私がやりたいのは、時間の経過とともにスケールを変更して、動画が
- 1倍速でスタート
- 5.7564秒の時点で1.4倍速に切り替わります
- 10.2571秒の時点で0.983333倍速に切り替わります
- 15.6251 秒の時点で、ビデオの残りの部分は 1 倍速に切り替わります。
読み取り可能なスクリプト ファイルを作成する必要があることはわかりました-filter_script:v
が、必要な動作を得るために何を使用すればよいかわかりません。
私の最初の素朴なアプローチは
setpts='
if(lt(T,5.7564),
1*PTS,
if(lt(T,10.2571),
1.4*PTS,
if(lt(T,15.6251),
0.983333*PTS,
1*PTS
))))'
しかし、これにより、ビデオがカットポイントで飛び回り、ビデオの一部がスキップされたり、繰り返されたりする可能性があります。なぜこれが起こるのかはわかりましたが、代わりに何をすべきかわかりません。
おそらく最善の方法は、ビデオを 4 つのセグメントに分割し、setpts=#*PTS
セグメントごとに 1 つだけ使用することですが、そのスクリプトの作成方法がわかりません。
答え1
あなたがおっしゃったように、1 つのアプローチは、入力を 4 つの個別のセグメントに切り分け、そのうちの 2 つに setpts フィルターを適用し、最後にすべてを連結することです。そのためのコマンドは次のとおりです。
ffmpeg -i input.mp4 -lavfi "[0:v]trim=0:5.7564[firstpart];[0:v]trim=start=5.7564:10.2571,setpts=PTS-STARTPTS[secondpart];[0:v]trim=10.2571:15.6251,setpts=PTS-STARTPTS[thirdpart];[0:v]trim=15.6251,setpts=PTS-STARTPTS[forthpart];[secondpart]setpts=PTS/1.4[second];[thirdpart]setpts=PTS/0.983333[third];[firstpart][second][third][forthpart]concat=n=4:v=1:unsafe=1[out]" -map '[out]' output.mp4