クリップの冒頭では音と映像が完璧に合っているのに、終わりに近づくと明らかにズレている——しかもスクラブして進めるほどひどくなる。これが 音ズレのドリフト で、固定の遅延とは根本的に異なる問題です。一定のオフセットは最初から最後まで進み・遅れが「同じ量」で、1回のタイムスタンプ移動で直せます。ドリフトは「累積」します。音声クロックと映像クロックがわずかに違う速度で進むため、両者の差がフレームごとに広がっていくのです。ドリフトを直すとは、一度きりのオフセットを足すことではなく「レート」を補正することです。本記事では原因を説明し、実行可能な解決法を示します。
動作確認: FFmpeg 8.1
この記事でわかること
- ドリフト(時間とともに悪化)と 一定のオフセット(全体で同じ量)の違い
- ドリフトが音声サンプルクロックと映像クロックの不一致、またはVFRソースから生じる理由
-itsoffsetのような一定オフセット用ツールでドリフトが 直せない 理由- 3つの実行可能な解決法:
aresampleの async(伸ばす・縮める・補填・切り詰め)、互換性のための固定サンプルレートへのリサンプル、固定フレームレート化
最初から「固定量」だけ音がズレている場合、この記事は対象外です。必要なのは1回のオフセットで、音声遅延を手動で直す方法 で扱います。同期オプション全般は 音声同期を直す方法 を参照してください。
ドリフトと一定オフセット: なぜ区別が重要か
必要な解決法は、どちらのパターンかで完全に決まります。まず症状を確認してください。
| パターン | 症状 | 原因 | 解決法の種類 |
|---|---|---|---|
| 一定のオフセット | 最初から最後まで同じ量だけズレる | 録画/マックス時の固定遅延 | 1回の移動(-itsoffset、adelay) |
| ドリフト | 冒頭は合い、終わりに向かって徐々にズレる | 2つのクロックが違うレートで進む、またはVFR | レート補正(リサンプル / CFR) |
ドリフトの決定的な見分け方: 音声を冒頭に合わせると、今度は「終わり」がさらにズレる——その逆も同様です。誤差がクリップの長さにわたって増えていくため、1つのオフセット値で両端を同時に満たすことはできません。
なぜ -itsoffset でドリフトが直せないのか
-itsoffset はストリーム全体のタイムスタンプを固定秒数だけ移動します。これは一定オフセットには完璧です——ストリーム全体が一緒に動くからです。しかしドリフトは一様な移動ではありません。1分地点では音声が100ミリ秒ズレ、10分地点では1秒ズレる、というように。1つのオフセットでは「1か所」だけが合い、それ以外のすべてがズレたまま残ります。
こう考えてください。-itsoffset は音声を硬いブロックとして左右にスライドさせます。ドリフトは、再生レートが映像に合うようにブロックを「伸縮」させる必要があります。これは移動ではなくリサンプル操作です。だからこそ以下の解決法はすべて、固定オフセットではなく音声のレートまたはフレームレートに作用します。
解決法①: aresample async — クロックに追従して伸縮・補填・切り詰め
aresample フィルタに async 値を付けると、音声をタイムスタンプに揃え続けるようFFmpegに指示します。値を1より大きくすると、サンプルの補填・切り詰めに加えて、音声を伸ばす・縮める(リサンプルする)こともできます。この数値は、ズレを埋めるためにFFmpegが毎秒追加・削除してよいサンプル数を設定します。大きい値ほど、より激しいドリフトを補正できます。
ffmpeg -i input.mp4 -af aresample=async=1000 -c:v copy output.mp4
-af aresample=async=1000— タイムスタンプに追従するため毎秒最大1000サンプルの伸縮・補填・切り詰めを許可-c:v copy— 映像はそのままコピー(高速・無劣化)- フィルタがサンプルを書き換えるため音声は再エンコードされる
async=1000 は聞こえるレベルのドリフトに対する妥当な出発点です。ドリフトが残れば値を上げ、ノイズが聞こえれば下げます。映像ストリームをコピーしたままにできるため、通常はこれを最初に試します。
解決法②: サンプルレートを標準化する(互換性)
-ar 48000 は出力のサンプルレートを設定し、音声をそのレートへリサンプルします(48000 Hz は映像と相性の良い標準)。何をして何をしないかを明確にしておきましょう。これはレートを標準化して出力をきれいにし互換性を広げますが、それ自体では、誤った実クロックや不正なタイムスタンプによる累積ドリフトを補正しません。実際にドリフトを補正するのは解決法①の async リサンプルです。もしファイルが誤った値で宣言されたサンプルレートを持っている(誤ったレートでタグ付けされている)なら、それを読み替えるツールは asetrate です。-ar は本当の解決法と組み合わせる標準化ステップと捉え、それ単体をドリフトの治療法とは考えないでください。
ffmpeg -i input.mp4 -ar 48000 -c:v copy output.mp4
-ar 48000— 出力音声を標準の48 kHzに設定・リサンプル-c:v copy— 映像はそのまま維持
きれいで予測可能な出力レートが欲しいときに使い、実際にドリフトを埋めるには解決法①と組み合わせてください——-af aresample=async=1000 -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— 出力を固定フレームレートに強制(FFmpeg 8.x のオプション)-r 30— 目標フレームレート。ソースの公称レートに合わせる-c:v libx264 -c:a aac— 安定したタイムライン上に両ストリームを再エンコード
補足: FFmpeg 8.x では
-fps_mode cfrを使ってください。旧来の-vsync cfrも動作しますが非推奨です。
VFRはドリフトの根本原因として非常に多く、ffprobe での検出手順を含む専用ガイドがあります: 可変フレームレートを固定に変換する。ドリフトが「変換ステップの直後に」現れた場合は 変換後に音ズレする原因と解決法 も参照してください。
どの解決法を使うべきか
| 状況 | 推奨する解決法 |
|---|---|
| 聞こえるドリフト、映像はコピーで残したい | -af aresample=async=1000 -c:v copy |
| きれいな標準出力レートが欲しい(asyncと併用) | -ar 48000 -c:v copy |
| ソースが画面/スマホ/ゲーム録画(VFR) | -fps_mode cfr -r 30(再エンコード) |
| 音声が「固定量」ズレ、増えていかない | ドリフトではない — 音声遅延を直す 参照 |
まず aresample=async から始めてください。映像をコピーしたまま、聞こえるドリフトの大半に対処できます——実際にレートを補正するのはこの部分です。出力を標準化したいなら -ar 48000 を追加し、根本原因がVFRソースならCFRへ切り替えます。
よくある質問
ドリフトと一定の遅延はどう見分けますか?
クリップの冒頭で音声を合わせてください。それで「終わり」がさらにズレるならドリフトです(誤差が時間とともに増える)。クリップ全体が一緒に動いて一様に揃ったままなら一定のオフセットで、音声遅延を手動で直す方法 で直します。
なぜ -itsoffset で私のドリフトが直らないのですか?
-itsoffset は音声ストリーム全体を固定量だけスライドさせます。硬いブロックを動かすようなものです。ドリフトは誤差が時間とともに増えるため、どの単一オフセットも1か所しか合わず、残りはズレたままです。ドリフトには移動ではなくレート補正(リサンプルまたはCFR)が必要です。
aresample=async=1000 の数値は何を意味しますか?
音声をタイムスタンプに揃え続けるため、FFmpegが毎秒挿入・削除してよいサンプルの最大数です。値が高いほど激しいドリフトを補正できますが、聞こえるノイズのリスクが増えます。低い値は穏やかです。1000 は妥当な出発点です。
ドリフトの原因が可変フレームレートの場合は?
再エンコードしながら -fps_mode cfr -r 30 で固定フレームレートに強制します。検出と完全な手順は 可変フレームレートを固定に変換する にあります。
リサンプルの解決法を組み合わせられますか?
はい。ffmpeg -i input.mp4 -af aresample=async=1000 -ar 48000 -c:v copy output.mp4 は async 追従と固定48 kHzレートへの強制を同時に適用しつつ、映像はコピーします。
関連記事
Tested with FFmpeg 8.1 — verified with our command-check script
一次ソース: ffmpeg.org/ffmpeg-filters.html#aresample / ffmpeg.org/ffmpeg.html