webdevqa.jp.net

ffmpegでビデオのFPSと速度を正しく上げる方法は?

Keyint120が2.5時間の5fpsビデオがあり、6倍高速化して、fps = 30にします。

私はこのウェブサイトのどこかで見つけたこのコマンドでそれをしました

ffmpeg -i "...local_Record.mkv"  -filter:v "fps=30, setpts=PTS/6" "...output1.mkv"

出力が遅くなり、3〜5秒間再生された後、フリーズしました。前後にジャンプすると、さらに3〜5秒間フリーズが解除され、その後再びフリーズします。それをyoutubeにアップロードした後、私はそれがそこに遅れていないことに気づきました、しかしyoutubeはその長さを元の2.5時間として示しています。また、処理率がすでに12時間以上95%であることも示しています(つまり、この動画は100%バグがあり、90 mbと20分の長さであるため、処理されません。YouTubeは5GBと1時間の動画を処理できます。 10分で長い)

次に、このコマンドで取得したビデオを再エンコードしようとしました

ffmpeg -i "...mkv" -c:v libx264 -crf 18 -preset veryfast -max_muxing_queue_size 1024 output.mp4

これにより、133 mbの結果が得られました。これは、YouTubeでも2.5時間の長さで表示され、処理が終了することはありません(再生できますが、ビデオマネージャーでは表示されません。両方のビデオで95%が処理されたと表示されます)

ビデオが遅れず、YouTubeが正しくその長さを取得できるように、それを正しく行う方法は?

編集-私は何が問題であるかを見つけました-まったく音がないはずなのにコンテナに音がありました(私は音を有効にせずにobsで録音しました)。そのため、mmgでそのサウンドを削除した後、mpcが正しく開いて、26分の長さで、youtubeが数分で正常に処理したことを示しました。

1
jstq

順序を逆にする必要があります。

ffmpeg -i in -filter:v "setpts=PTS/6,fps=30" out

最初にfpsフィルターを使用すると、ffmpegは5 fpsを30に変換するために毎秒25の重複フレームを挿入し、次にそれを6倍高速化します。正しい順序で、ffmpegはストリームを1秒あたり30のソースフレームを持つように圧縮します。その後、すべてのfpsフィルターが実行します*。ストリームのメタデータを30fpsに変更します。

*一定のフレームレートソースを想定しています。

また、YTはすべての動画を再エンコードするため、エンコードされたkeyintはYTに引き継がれないことに注意してください。

オーディオがある場合は、その速度も上げる必要があります。

ffmpeg -i in -vf "setpts=PTS/6,fps=30" -af "atempo=6" out

最近までのアテンポには2の制限があったため、古いバージョンのffmpegでは次を使用することに注意してください。

ffmpeg -i in -vf "setpts=PTS/6,fps=30" -af "atempo=2,atempo=2,atempo=1.5" out
2
Gyan