ffmpeg で mp4 ファイルをセグメントに分割する…最初のセグメントの後、オーディオが同期されない

ffmpeg で mp4 ファイルをセグメントに分割する…最初のセグメントの後、オーディオが同期されない

注: 私は間違ってこの質問をしたスタックオーバーフローで

私はffmpegのコマンドラインを使用しました。この質問長い間、MKV ファイルを完璧に分割しようとしてきました。今、分割したい MP4 ファイルがいくつかありますが、最初はうまくいっているように見えましたが、最初のセグメント以降のすべてのセグメントでオーディオが同期されていません。しかも、数秒ずれています。

キーフレームを強制してみましたが(他のサイトで見つけたアドバイス)、効果はありませんでした。

まったく別のプログラム (Avidemux) を試してみたところ、適切な出力でファイルを分割できましたが、かなり遅く、ffmpeg では 2 秒未満だったのに対し、3 分以上かかりました。Avidemux では、分割したい i-frame の正確な位置を特定できたので、それが同期の問題かもしれないと思い、その正確な位置 (つまり、00:12:16 ではなく 00:12:17.111 など) を試しましたが、それでも効果はありませんでした。

分割時にオーディオをビデオに適切に同期させるための ffmpeg のオプションが欠けているのでしょうか?

注記: 私は ffmpeg の 2013 バージョンを使用していました。これを最新の 2.6 に更新しましたが、問題は解決しません。

答え1

ドキュメントによると、-ssフラグはコマンド内の場所によって異なる動作をする。

-ss 位置 (入力/出力) 入力オプションとして使用する場合 (-i の前)、この入力ファイルで位置までシークします。ほとんどの形式では正確にシークできないため、ffmpeg は位置の前に最も近いシーク ポイントまでシークします。トランスコード時に -accurate_seek が有効になっている場合 (デフォルト)、シーク ポイントと位置の間のこの余分なセグメントはデコードされ、破棄されます。ストリームのコピーを実行する場合、または -noaccurate_seek が使用されている場合は、保持されます。

出力オプションとして使用した場合 (出力ファイル名の前)、タイムスタンプが位置に到達するまで入力をデコードしますが破棄します。

位置は秒またはhh:mm:ss[.xxx]形式のいずれかになります。

つまり、あなたの答えからすると、最初のコマンドは出力にロジックを適用し、2番目のコマンドは入力に適用します。

答え2

理由はよく分かりませんが、問題はパラメータの順序でした。

リンクされた例では、コマンドは次のようになります。

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi

もちろん、私は avi ではなく mp4 を使用していますが、それ以外は上記とまったく同じコマンドを入力しており、(mp4 では) オーディオ結果が同期していませんでした。偶然この「修正」に遭遇しました...代わりに次のようにコマンドを入力すると:

ffmpeg -ss 00:30:00 -i input.mp4 -vcoded copy -acodec copy -t 00:30:00 output2.mp4

同期の問題が発生しません。なぜでしょうか? わかりません。しかし、動作します。確認のために数回試してみましたが、パラメータの順序を変更するだけで問題は解決します。

関連情報