可変時間スケールを実行するにはどうすればいいですか?

可変時間スケールを実行するにはどうすればいいですか?

ファイルから読み込んだ比率に基づいてビデオの時間スケールを変更したいビデオがあります。

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

関連情報