音声と動画の同期ズレを修正する — -itsoffset と adelay フィルタ
録画・配信・変換後に「口の動きと音声がズレている」「映像より音が遅い/早い」といった問題が起きることがあります。FFmpegにはこの同期ズレを修正するためのいくつかのアプローチがあります。本記事では代表的な手法を状況別に解説します。
動作確認: ffmpeg 6.1 で確認済み
ズレの方向を確認する
修正方法を選ぶ前に、どちらの方向にズレているかを確認します。
| 状態 | 意味 | 対処 |
|---|---|---|
| 音声が映像より遅い | 音が後から聞こえる | 音声を前にずらす、または映像を遅らせる |
| 音声が映像より早い | 音が先に聞こえる | 音声を後にずらす |
1. -itsoffset — 入力タイムスタンプをオフセットする
-itsoffset は次の -i で指定するファイルのタイムスタンプにオフセット値を加算します。
正の値 を指定すると、そのストリームの開始が遅れます(ストリームが後ろにずれる)。
音声が映像より遅い場合(音声を映像に合わせる)
同じファイルを2回入力し、映像は2番目の入力から、音声は1番目の入力(オフセット付き)から取ります。
ffmpeg -itsoffset 1.5 -i input.mp4 -i input.mp4 -map 1:v -map 0:a -c copy output.mp4
コマンドの解説:
-itsoffset 1.5— 次の-iのタイムスタンプを 1.5秒 遅らせる(音声ストリームが後ろにずれる)-i input.mp4(1番目)— オフセット付きの入力。音声 (0:a) を取る-i input.mp4(2番目)— 通常の入力。映像 (1:v) を取る-map 1:v— 映像は2番目の入力から-map 0:a— 音声は1番目の入力(オフセット適用済み)から-c copy— 再エンコードなしでコピー(高速・無劣化)
注意:
-itsoffsetは直後の-iに作用します。順序が重要です。
itsoffset の正負の意味
| 値 | 効果 |
|---|---|
+1.5(正) | そのストリームの開始を 1.5秒遅らせる(映像に対して音声を後ろにずらす) |
-1.5(負) | そのストリームの開始を 1.5秒早める(映像に対して音声を前にずらす) |
2. adelay フィルタ — 音声を遅らせる
音声が映像より早い場合、adelay フィルタで音声トラックを指定ミリ秒だけ遅らせることができます。
ffmpeg -i input.mp4 -filter:a "adelay=1500|1500" output.mp4
コマンドの解説:
adelay=1500|1500— 左チャンネルを 1500ms、右チャンネルを 1500ms 遅らせる- 区切り文字
|でチャンネルごとの遅延を指定します - ステレオ音声の場合は2チャンネル分指定するのが基本です
チャンネルごとに異なる遅延を設定する例
ffmpeg -i input.mp4 -filter:a "adelay=1000|500" output.mp4
(左チャンネル: 1000ms、右チャンネル: 500ms)— CI対象外(参考例)
3. -async オプション — 自動同期補正
-async は音声サンプルを自動的に伸縮させて映像と同期させるオプションです。
ffmpeg -i input.mp4 -async 1 output.mp4
-async 1— 音声を映像のタイムスタンプに自動的に合わせる- 小さなズレを自動補正したい場合に使いますが、ピッチが変わる可能性があります
- 大きなズレには不向きです(
-itsoffsetやadelayを使う方が精度は高い)
4. aresample と async の違い
| オプション/フィルタ | 動作 | 用途 |
|---|---|---|
-async N | タイムスタンプに基づき音声を間引き/補完 | 自動の小幅補正 |
aresample フィルタ | サンプルレートの再変換 | 微細な同期ずれの除去、サンプルレート統一 |
adelay フィルタ | 音声チャンネルに無音を追加して遅らせる | 固定遅延の付加 |
-itsoffset | タイムスタンプ自体をオフセット | ストリームレベルの同期調整 |
一般的な使い分け:
- 既知の固定ズレ(例: 1.5秒遅い) →
-itsoffsetまたはadelay - 小さな揺らぎ・ドリフト →
-async 1またはaresample - 再エンコードを避けたい →
-itsoffset+-c copy
よくある注意点
-c copyを使う場合、adelayフィルタは使えません(フィルタは再エンコードが必要)- ズレの量が大きい(5秒以上)場合は、録画設定の見直しやソースファイルの修復を先に検討してください
ffprobeでストリームのタイムスタンプを確認してからズレ量を決定すると正確です(ffprobeの使い方 を参照)
関連記事
動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-filters.html / trac.ffmpeg.org