注: 私は間違ってこの質問をしたスタックオーバーフローで
私は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
同期の問題が発生しません。なぜでしょうか? わかりません。しかし、動作します。確認のために数回試してみましたが、パラメータの順序を変更するだけで問題は解決します。