この記事でわかること
adelayフィルタで音声に遅延を追加するコマンド-itsoffsetで映像または音声を前後にシフトする方法- 音声が映像より早い・遅いケースの対処法
- ffprobe を使って音声遅延量を確認する方法
テスト済みバージョン: FFmpeg 6.1(ubuntu-latest / CI検証済み)
対象 OS: Windows / macOS / Linux
音声遅延の種類
音ズレには大きく 2 種類あります:
| パターン | 症状 | 原因例 |
|---|---|---|
| 音声が映像より 遅れている | 口パクより音が後から出る | マイク遅延、録画設定 |
| 音声が映像より 早い | 音が出てから口が動く | キャプチャデバイスの遅延差 |
方法 1: adelay — 音声に遅延を追加する
音声が映像より 早すぎる 場合に、音声を遅らせます。
ステレオ音声に 500ms の遅延を追加する
ffmpeg -i input.mp4 \
-af "adelay=500|500" \
-c:v copy \
output.mp4
500|500 はステレオの左チャンネル・右チャンネルそれぞれに 500ms の遅延を指定します。
モノラル音声の場合
ffmpeg -i input.mp3 \
-af "adelay=300" \
output.mp3
adelay パラメータ詳細
adelay=delays[|delays...]
- 遅延量はチャンネルごとにパイプ(
|)で区切って指定します - 単位はミリ秒(ms)
0で遅延なし
# 2チャンネル(ステレオ)に異なる遅延
ffmpeg -i input.mp4 -af "adelay=200|400" -c:v copy output.mp4
# 5.1chに対応する場合(6チャンネル)
ffmpeg -i input.mp4 -af "adelay=300|300|300|300|300|300" -c:v copy output.mp4
方法 2: -itsoffset — 入力ファイルのタイムスタンプをずらす
-itsoffset は入力ファイルのタイムスタンプをオフセットします。音声だけ、または映像だけを別入力として指定することで細かい制御ができます。
音声を 0.5秒 遅らせる(映像より音声が早い場合)
ffmpeg -i input.mp4 -itsoffset 0.5 -i input.mp4 \
-map 0:v -map 1:a \
-c:v copy -c:a copy \
output.mp4
0:v— 1本目のファイルの映像(タイムスタンプそのまま)1:a— 2本目のファイルの音声(0.5秒オフセットあり)
音声を 0.5秒 早める(音声が映像より遅れている場合)
ffmpeg -itsoffset 0.5 -i input.mp4 -i input.mp4 \
-map 0:v -map 1:a \
-c:v copy -c:a copy \
output.mp4
今度は映像(0:v)の方に itsoffset を適用します。映像の再生開始が 0.5秒 遅れる = 相対的に音声が 0.5秒 早まります。
方法 3: -ss で音声だけを前にトリムする
音声が映像より遅れている場合、音声の開始位置をトリムして合わせる方法もあります。
ffmpeg -i input.mp4 \
-vf "setpts=PTS-STARTPTS" \
-af "atrim=start=0.3,asetpts=PTS-STARTPTS" \
-c:v libx264 \
output.mp4
atrim=start=0.3 で音声を 0.3 秒分前にずらします。
ffprobe で音声遅延を確認する
ffprobe -v quiet -print_format json -show_streams input.mp4 2>&1 | grep "start_time"
映像ストリームと音声ストリームの start_time の差が遅延量の目安になります。
映像と音声の start_time を揃える
一部の動画ファイルは映像と音声の start_time がずれています。以下のコマンドで統一できます:
ffmpeg -i input.mp4 -c:v copy -c:a copy -avoid_negative_ts make_zero output.mp4
-avoid_negative_ts make_zero でタイムスタンプのゼロ点を揃えます。
実用的なワークフロー
ステップ 1: ズレを確認する
動画プレイヤー(VLC など)で映像と音声のズレを秒単位で確認します。
ステップ 2: 方向を判断する
- 口が先に動いて音が後から来る → 音声が遅れている →
adelayで音声を遅らせる必要はなく、-itsoffsetで映像を遅らせる - 音が先に出て口が後から動く → 音声が早い →
adelayで音声を遅らせる
ステップ 3: コマンドを実行する
# 例: 音声が300ms早い場合 (adelayで音声を遅らせる)
ffmpeg -i input.mp4 -af "adelay=300|300" -c:v copy output.mp4
NG例
NG例: adelayにステレオファイルで単一チャンネル値を指定
ffmpeg -i input.mp4 -af "adelay=500" -c:v copy output.mp4
ステレオファイルに adelay=500(単一値)を指定した場合、左チャンネルのみに適用され右チャンネルはズレたままになることがあります。必ずチャンネル数に合わせた値を指定してください。
注意点
adelayは音声に遅延を追加するフィルタであり、早める(引き算)ことはできません。- 音声を早めたい場合は
-itsoffsetまたはatrimを使います。 - コピー(
-c:a copy)は音声を再エンコードしないため、音質が劣化しません。ただしadelayを使う場合は再エンコードが必要です。
関連フィルタ
関連リソース
長時間のエンコードや大量のバッチ処理を手元のPCで回すのが重い場合は、時間課金で使えるレンタルサーバーやVPSを検討する一案もあります。