web-dev-qa-db-ja.com

AviSynth ChangeFPS:異なるフレームレートのビデオを組み合わせる

同じシーンの2つのビデオ録画がありますが、フレームレートが異なり、AviSynthスクリプトを使用して結合したいと思います。 1つのビデオは30fpsで記録され、もう1つのビデオは120fpsで記録されます。私がやりたいのは、それらを時間的に同期させておくことです。つまり、30 fpsビデオの各フレームについて、出力は120fpsビデオから4フレームを表示する必要があります。最終出力ビデオを30fpsで再生して、再生時間が元の録画の4倍になるようにします。

AviSynthのドキュメントから、ChangeFPSはフレームを削除して複製するために必要な関数のようですが、「AssumeFPS」は再生速度を変更するだけです(私の計画は基本的に30fpsクリップのすべてのフレームを4倍にすることです) )。ただし、フィルターはその内容を実行していないようです。

私が試してみると:

clip30 = AviSource("0326.avi").ChangeFPS(120)
clip120 = AviSource("0326-120fps.avi")

30fpsクリップの再生速度やフレーム数にはまったく影響しませんが、120fpsクリップから4フレームごとに削除されますが、これは私が望んでいることではありません。残念ながら、.ChangeFPS(7.5)をclip120に追加しても、同じ逆効果はありません。その場合、期待どおりの結果が得られます。または、試してみると:

clip30 = AviSource("0326.avi").AssumeFPS(7.5)
clip120 = AviSource("0326-120fps.avi")

効果はまったくありません。両方のクリップが30fpsで再生されます。つまり、30fpsクリップが終了するまでに120fpsクリップの4分の1しか表示されていません。

では、これら2つのクリップを希望どおりに組み合わせるにはどうすればよいでしょうか。それを行うのに役立つ他の内部または外部フィルターを見つけることができませんでした。 ChangeFPSがマニュアルに書かれていることを実行した場合、それはその仕事に適したものになると私には思えます。

4
Daniel Saner

質問の最初のスニペット(30fpsクリップのフレームレートを120fpsに変更)を使用して問題を解決しましたが、最後の最後にその関数を追加して、最終的な結合ビデオにAssumeFPS(30)を設定しました。私が使用したフィルター。したがって、たとえば:

_clip30 = AviSource("0326.avi").ChangeFPS(120)
clip120 = AviSource("0326-120fps.avi")
StackHorizontal(clip30, clip120).AssumeFPS(30)
_

正常に動作します。これで、120fpsクリップの長さが30fps(元の記録時間の4倍)で、30fpsのすべてのフレームが4倍になったビデオができました。

最後のAssumeFPS(30)が必要だった理由はよくわかりません。それなしで取得したクリップも、30fpsであるためです。 AviDemuxで出力をフレームごとに確認しましたが、AssumeFPSを最後に呼び出さないと、_clip30_のフレームが4倍になりません。

2
Daniel Saner