クリップの冒頭では音と映像が合っているのに、後半へ進むほどズレが大きくなる場合、それは 音ズレのドリフト です。固定の遅延とは別の問題です。一定のオフセットは最初から最後まで進み・遅れが「同じ量」で、1回のタイムスタンプ移動で直せます。ドリフトは「累積」します。音声クロックと映像クロックがわずかに違う速度で進むため、両者の差がフレームごとに広がっていきます。ドリフトを直すには、一度きりのオフセットを足すのではなく「レート」を補正します。

最初から「固定量」だけ音がズレている場合は、ドリフトではありません。必要なのは1回のオフセットで、音声遅延を手動で直す方法 で直せます。同期オプション全般は 音声同期を直す方法 を参照してください。

ドリフトと一定オフセット: なぜ区別が重要か

どちらのパターンかで、使う解決法が決まります。まず症状を確認してください。

パターン 症状 原因 解決法の種類
一定のオフセット 最初から最後まで同じ量だけズレる 録画時や多重化(mux)時の固定遅延 1回の移動(-itsoffset、adelay)
ドリフト 冒頭は合い、終わりに向かって徐々にズレる 2つのクロックが違うレートで進む、またはタイムスタンプを無視するソフトでのVFR レート補正(音声の速度 / CFR)

ドリフトの見分け方: 音声を冒頭に合わせても、「終わり」はズレたままです(逆も同じです)。誤差がクリップの長さにわたって増えていくため、1つのオフセット値で両端を同時に合わせることはできません。

なぜ -itsoffset でドリフトが直せないのか

-itsoffset はストリーム全体のタイムスタンプを固定秒数だけ移動します。ストリーム全体が一緒に動くので、一定オフセットならこれで直ります。しかしドリフトのズレは一様ではありません。たとえば1分地点では音声が100ミリ秒、10分地点では1秒ズレます。1つのオフセットでは「1か所」だけが合い、それ以外はズレたまま残ります。

-itsoffset は音声を硬いブロックのように左右にスライドさせます。ドリフトを直すには、再生レートが映像に合うようにブロックを「伸縮」させる必要があります。これは移動ではなく速度の補正です。そのため以下の解決法はすべて、固定オフセットではなく音声のレートまたはフレームレートを調整します。

解決法①: 測った比率で音声の速度を変える

クリップの終わり近くで音がどれだけズレているかを測り、atempo フィルタで音声をわずかに速く(または遅く)します。たとえば10分地点(600秒)で音声が0.5秒遅れているなら、倍率は (600 + 0.5) / 600 = 1.00083 です。

ffmpeg -i input.mp4 -af atempo=1.00083 -c:v copy output.mp4
  • -af atempo=1.00083 — 音声を1.00083倍の速さで再生する
  • -c:v copy — 映像はそのままコピー(高速・無劣化)
  • フィルタがサンプルを書き換えるため音声は再エンコードされる

音声が逆に早い場合は、倍率が1より小さくなります: (600 - 0.5) / 600 = 0.99917。映像ストリームをコピーしたままにできるため、通常はこれを最初に試します。補正後は、もう一度クリップの終わりを確認してください。

aresample=async=1000 では、この種のドリフトは直りません。async は音声を自分のタイムスタンプに揃えるだけです。MP4の音声のタイムスタンプはふつうサンプル数から決まるため、クロックの不一致はタイムスタンプに現れません。async が役立つのは、タイムスタンプは正しいのにサンプルが欠けている場合です(録画中に音声が抜けた場合など)。このとき async は欠けた部分を無音で埋めます。

解決法②: サンプルレートを標準化する(互換性)

-ar 48000 は出力のサンプルレートを設定し、音声をそのレートへリサンプルします(48000 Hz は映像と相性の良い標準)。これはレートを標準化して出力をきれいにし互換性を広げますが、それ自体では、誤った実クロックや不正なタイムスタンプによる累積ドリフトを補正しません。実際にドリフトを補正するのは解決法①の速度変更です。ファイルのサンプルレートが誤った値で宣言されている(誤ったレートでタグ付けされている)なら、それを読み替えるツールは asetrate です。-ar は解決法①と組み合わせる標準化の手順で、単体ではドリフトは直りません。

ffmpeg -i input.mp4 -ar 48000 -c:v copy output.mp4
  • -ar 48000 — 出力音声を標準の48 kHzに設定・リサンプル
  • -c:v copy — 映像はそのまま維持

きれいで予測可能な出力レートが欲しいときに使い、実際にドリフトを直すには解決法①と組み合わせてください。-af atempo=1.00083 -ar 48000 -c:v copy output.mp4 なら、速度の補正とレートの標準化を同時に行えます。

解決法③: 固定フレームレートに強制する(編集ソフトが必要とする場合)

可変フレームレート(VFR)の動画は、フレームの間隔が一定しません。タイムスタンプが正しければ、VFRでも映像と音声は同期したままです。ただし、タイムスタンプを無視する編集ソフトやプレイヤーでは、映像が音声から徐々にずれていきます。そうしたソフトでだけズレる場合に、映像を固定フレームレート(CFR)に変換します。

ffmpeg -i input.mp4 -fps_mode cfr -r 30 -c:v libx264 -c:a aac output.mp4
  • -fps_mode cfr — 出力を固定フレームレートに強制
  • -r 30 — 目標フレームレート。ソースの公称レートに合わせる
  • -c:v libx264 -c:a aac — 安定したタイムライン上に両ストリームを再エンコード

補足: FFmpeg 8.x では -fps_mode cfr を使ってください。旧来の -vsync cfr も動作しますが非推奨です。

VFRかどうかの確認と変換の手順は 可変フレームレートを固定に変換する にあります。ドリフトが「変換ステップの直後に」現れた場合は 変換後に音ズレする原因と解決法 も参照してください。

どの解決法を使うべきか

状況 推奨する解決法
音声がだんだん遅れる・早まる、映像はコピーで残したい -af atempo=1.00083 -c:v copy(測った倍率)
タイムスタンプは正しいがサンプルが欠けている(録画中の音声の抜け) -af aresample=async=1000 -c:v copy
きれいな標準出力レートが欲しい(解決法①と併用) -ar 48000 -c:v copy
VFRのソースが、タイムスタンプを無視する編集ソフトでだけズレる -fps_mode cfr -r 30(再エンコード)
音声が「固定量」ズレ、増えていかない ドリフトではない — 音声遅延を直す 参照

まず解決法①の速度変更から試してください。映像をコピーしたまま、レートを補正できます。出力を標準化したいなら -ar 48000 を追加します。CFRへの変換は、タイムスタンプを無視する編集ソフトやプレイヤーでズレるときだけ行います。

よくある質問

ドリフトと一定の遅延はどう見分けますか?

クリップの冒頭で音声を合わせてください。それでも「終わり」がズレているならドリフトです(誤差が時間とともに増える)。クリップ全体が一緒に動いて一様に揃ったままなら一定のオフセットで、音声遅延を手動で直す方法 で直します。

なぜ -itsoffset で私のドリフトが直らないのですか?

-itsoffset は音声ストリーム全体を固定量だけスライドさせます。硬いブロックを動かすようなものです。ドリフトは誤差が時間とともに増えるため、どの単一オフセットも1か所しか合わず、残りはズレたままです。ドリフトには移動ではなく、解決法①のような速度の補正が必要です。

aresample=async=1000 の数値は何を意味しますか?

タイムスタンプに合わせるために、音声を伸ばしたり縮めたりしてよい量の上限です(毎秒のサンプル数)。1以上の値なら、欠けた部分を無音で埋めたり、余分なサンプルを切り詰めたりもします。async は音声自身のタイムスタンプに合わせるだけなので、タイムスタンプに現れないクロックの不一致は直せません。その場合は解決法①を使います。

ドリフトの原因が可変フレームレートの場合は?

タイムスタンプが正しければ、VFRの動画は同期したままです。タイムスタンプを無視する編集ソフトやプレイヤーでズレる場合は、再エンコードしながら -fps_mode cfr -r 30 で固定フレームレートに強制します。検出と完全な手順は 可変フレームレートを固定に変換する にあります。

解決法①と②を組み合わせられますか?

はい。ffmpeg -i input.mp4 -af atempo=1.00083 -ar 48000 -c:v copy output.mp4 なら、速度の補正と48 kHzへの固定を同時に行い、映像はコピーします。

関連記事