ffmpeg によるビデオ (+ オーディオ) の正確なカット

ffmpeg によるビデオ (+ オーディオ) の正確なカット

私のウェブサイトでは、私が提供するソース ビデオからユーザーが独自のクリップを正確に作成できるようにしたいと考えています。

まず、Web サイトに適した形式に変換したいソース ビデオ ファイルがあります。

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

ffmpeg を使用して次のように変換します。

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

このビデオをもう一度見ると、私のニーズを満たす十分な品質と小さいファイル サイズがあり、Web サイトで読み込まれて再生されます。

ユーザーがこのビデオの開始と終了を選択してクリップを作成できる Web ページがあります。以下は、そのために私が使用する ffmpeg コマンドの例です。

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

問題は、クリップが必ずしも時間的に正確ではないことです。通常、オーディオは十分に正確ですが、ビデオは 0.5 秒ほど早く停止します。

これを 0.2 秒単位で正確に同期させる方法はあるでしょうか?

編集: 追加しても-force_key_frames 00:00:00.2効果はありませんでした。

-c:v libx264 -c:a aac -strict experimental編集: の代わりにを使用するようにクリッピングを変更したところ-codec:v copy -codec:a copy、良い (ish) 結果が得られました。

ファイルは問題なく外部で再生できますが、html5 ビデオ要素に読み込んで再生すると、ビデオの最後の部分 (オーディオは正常) がフリーズします。フリーズする最後の部分は 1 秒未満です。

別のビデオ エンコーダーで試してみるべきでしょうか? libx264 の最適な代替手段は何でしょうか? これを公開 Web サイトに公開したいと思うでしょう。

しかし、ちょっと待ってください。MPC や Windows Media Player などのプレーヤーでは問題なく正確に再生されるという事実は、Google Chrome または HTML ビデオ要素に問題があることを示唆しているのではないでしょうか。それとも、サポートされていないエンコードを使用しているのでしょうか。

答え1

の動作は、-ss入力オプションとして使用するか出力オプションとして使用するかによって変わり、出力オプションとして使用すると遅くなることが多いですが、より正確になります。ffmpegは指定された期間のビデオをゆっくりと変換します詳細と例についてはこちらをご覧ください。

出力品質を変更するには、18~28(デフォルトは23)の値でオプションsource.mp4を使用します。-crfFFmpeg と x264 エンコーディング ガイドたとえば。

トリミング コマンドは次のように簡略化できます。

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

-codec:v copy -codec:a copyを に置き換えました-c copy -map 0。これにより、最初のビデオ ストリームとオーディオ ストリームだけでなく、すべてのストリームがコピーされます。ただし、前のコマンドにより、入力には 2 つのストリームしかありません。再エンコードせずにスケーリングすることはできないため、 と相互に排他的であり-codec:v copy、入力はすでに設定サイズにスケーリングされているため、フィルター オプションを削除しました。

それでも精度が十分でない場合は、次の操作を試してください。

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

遅くなりますが、おそらくより正確になります。これら 2 つの例の違いの説明については、私が提供した最初のリンクの回答のリンクを参照してください。

最後に、(ffmpeg ソースのツール ディレクトリにある) を実行するか、オプションを使用しますsource.mp4。これにより、一部のデータがファイルの先頭に再配置されるため、完全にダウンロードされる前に再生を開始できます。qt-faststart-movflags faststart

関連情報