web-dev-qa-db-ja.com

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

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

最初に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を使用するようにクリッピングを変更し、良好な(問題のある)結果を出しました。

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

別のビデオエンコーダーで試してみますか? libx264の最良の代替策は何ですか?念頭に置いて、私はおそらくこれを公開ウェブサイトに掲載したいと思うでしょう。

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

10
Pete Oakey

-ssの動作は、入力オプションまたは出力オプションのどちらとして使用されているかによって変化し、多くの場合遅くなりますが、出力オプションとして使用するとより正確になる可能性があります。詳細と例については、回答 ffmpegが指定された期間のビデオをゆっくりと変換する を参照してください。

source.mp4の出力品質を変更するには、-crfオプションを18〜28の値(デフォルトは23)で使用します。例については、 FFmpegおよびx264エンコーディングガイド のCRFセクションを参照してください。

トリミングコマンドは簡略化できます。

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つの例の違いの説明については、最初のリンクの回答のリンクを参照してください。

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

9
llogan