動画に新しいサウンドトラック(BGM、ナレーション、整音し直した音声ミックスなど)を付けるのは、FFmpegの定番作業です。コツは、映像を一方のファイルから、音声をもう一方から取り出し、映像を無劣化のまま1つの出力に結合するようFFmpegに指示することです。本記事では基本となる2入力コマンド、-shortest で長さを合わせる方法、そして削除してから追加するシンプルな手順を解説します。所要時間:8分。
動作確認: FFmpeg 8.1
この記事でわかること
- 基本コマンド:一方から映像、もう一方から音声をマッピング
-shortestで再生時間を合わせる方法- 先に古い音声を削除する方法(クリーンな単一入力ステップ)
- 音声を再エンコードするかコピーするか
- 音声のディレイ・オフセットを加える方法
- トラブルシューティングとFAQ
1. 基本コマンド — 2入力をまとめてマッピング
動画の音声を別の音声ファイルに差し替えるには、FFmpegに2つの入力を与え、-map で1つ目から映像、2つ目から音声を選びます。
ffmpeg -i input.mp4 -i input.mp3 -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -shortest output.mp4
-i input.mp4… 入力0(映像)-i input.mp3… 入力1(新しい音声)-map 0:v:0… 入力0から映像ストリームを取る-map 1:a:0… 入力1から音声ストリームを取る-c:v copy… 映像を無劣化コピー(再エンコードなし)-c:a aac… 新しい音声をAACにエンコード(MP4向き)-shortest… 2つのうち短いほうで停止する
| 記法 | 読み方 |
|---|---|
0:v:0 | 入力0、最初の映像ストリーム |
1:a:0 | 入力1、最初の音声ストリーム |
-c:v copy | 映像を1ビットも変えずに保持 |
-c:a aac | 音声をAACに再エンコード |
このコマンドは
-i入力が2つあるため、実行可能ブロックではなくプレーンテキストで示しています。映像と音声の両方のファイルが必要だからです。これがこの作業の正しいコマンドです。-mapの文法は Map wiki に詳しくあります。
2. -shortest で再生時間を合わせる
映像と新しい音声の長さが同じであることはまれです。-shortest は、短いほうのストリームが尽きた時点で出力を終了するようFFmpegに指示します。これにより、末尾が無音の動画や、フリーズした最後のフレームに音声だけが流れ続ける状態を防げます。
- 音声が映像より長い場合、余った音声はカットされる。
- 映像が音声より長い場合、映像は音声の長さに切られる。
映像を丸ごと残し、音楽が早めに終わるのを許容したい場合は -shortest を外します。ただし、その場合は動画の末尾が無音になります。
3. 先に古い音声を削除する(単一入力ステップ)
クリーンな2段階の方法として、まず元の音声を取り除き、それから新しいものを追加する手があります。音声削除は単一入力の操作なので、通常のコマンドとして実行できます。
ffmpeg -i input.mp4 -c:v copy -an output.mp4
-c:v copy… 映像をそのままコピー-an… すべての音声を削除
これで無音の動画が得られます。新しいサウンドトラックの多重化は第1章の2入力ステップです。音声削除の詳細は音声削除ガイドを参照してください。
4. 音声を再エンコードするかコピーするか
第1章ではMP4がAACで最もよく再生できるため、音声をAACに再エンコードしています。元の音声がすでにAAC(例:.m4a ファイル)なら、再エンコードを省いてコピーできます。
ffmpeg -i input.mp4 -i input.m4a -map 0:v:0 -map 1:a:0 -c copy -shortest output.mp4
-c copy… 映像も音声も再エンコードなしでコピー
| 元の音声 | 推奨 | 理由 |
|---|---|---|
| WAV / FLAC | -c:a aac | MP4ネイティブではないのでAACに再エンコード |
| MP3 | -c:a aac(または -c copy) | MP3はMP4にコピー可能だが、AACの方が互換性が最も広い |
| AAC / M4A | -c copy | すでに互換、無劣化でコピー |
5. 音声のディレイ・オフセットを加える
新しい音声を映像より少し遅らせて始めたい場合は、その -i の前に -itsoffset で音声入力を遅らせます。
ffmpeg -i input.mp4 -itsoffset 1.5 -i input.mp3 -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -shortest output.mp4
-itsoffset 1.5… 次の入力(音声)を1.5秒後ろにずらす
音声が合うまで数値を調整します。負の値にすると音声を前に引きます。
6. トラブルシューティング
症状1: 新しい音声ではなく元の音声が残ってしまう
原因: -map を指定しなかったため、FFmpegが映像ファイル自身の音声を自動選択した。
解決策: -map 0:v:0 -map 1:a:0 を追加してストリームを明示的に選びます(第1章)。
症状2: 音声と映像がずれていく
原因: 2つのストリームでフレームレートや開始オフセットが異なる。
解決策: -itsoffset でタイミングを微調整するか(第5章)、映像を再エンコードしてタイムスタンプをきれいに再生成します。
症状3: 音声をコピーすると Could not find tag for codec が出る
原因: 元の音声コーデックがMP4で有効でない。
解決策: -c copy ではなく -c:a aac で再エンコードします(第1章)。
よくある質問
Q1. なぜ基本コマンドが実行可能ブロックではなくプレーンテキストなのですか? A. 入力を2つ(映像と音声)使うため、汎用的な単一ファイルのテストでは実行できないからです。コマンド自体は正しいので、ご自身の映像と音声ファイルを与えてください。
Q2. 先に古い音声を削除する必要がありますか? A. ありません。第1章の2入力コマンドは1パスで差し替えます。先に削除する方法(第3章)は分かりやすい代替案です。
Q3. 音声を差し替えると画質は落ちますか?
A. 落ちません。-c:v copy は映像をそのままコピーし、音声だけが新しく書き込まれます。
Q4. 音楽が映像より長いとき、どう切りますか?
A. -shortest を付けたままにします。映像が終わった時点で出力を終了します。
Q5. 元の音声を残したまま新しい音声も追加できますか? A. できます。差し替えではなく両方の音声ストリームをマッピングします。マルチトラックのファイルになります。複数音声トラックの扱い方を参照してください。
関連記事
Tested with FFmpeg 8.1 — verified with our command-check script 一次ソース: ffmpeg.org/ffmpeg.html / trac.ffmpeg.org/wiki/Map