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


10

私が提供するソースビデオからユーザーが自分のクリップを正確に作成できるように、自分の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ビデオ要素のいずれかに問題があることを示唆していますか?または、サポートされていないエンコーディングなどを使用していますか?


これは、キーフレームのタイミングと関係がある場合があります。いずれにしても、これはSuperUser.comに移動する必要があります。
ブラッド

こんにちは、ffmpegはどの時点でもビデオをカットできません。キーフレームでのみカットできます。このため、オーディオはほぼ正確ですが、ビデオは正確ではありません。

自分で移動できますか?-force_key_frames 00:00:00.2を使用してソースファイルにキーフレームを追加してみます
ピートオーキー

回答:


9

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

出力品質を変更source.mp4するには、-crf18〜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つの例の違いの説明については、最初のリンクの回答のリンクを参照してください。

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


ヒントを+1しましたが、ffmpeg -i source.mp4 -ss 577.92 -t 011.980 -c copy -map 0 clip1.mp4を試しましたが、ビデオは見逃され、オーディオは問題ありません。
ピートオーキー

@PeteOakeyビットストリームのコピーなしでカットを試みましたが、実際に再エンコードしましたか?
slhck

ビットストリームのコピーなしで試してみました-私の質問に結果が追加されました。
ピートオーキー

3
-ss入力オプションの代わりに出力オプションとして使用すると、問題が修正されました。最初のビデオフレームは出力ビデオで約1秒で、その前にオーディオのみが含まれていました(でも確認されましたffprobe -show_frames)。移動-ss-iのフレーム0から始まる作って出力オーディオおよびビデオフレーム
CodeManX
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.