動画に BGM を重ねる基本コマンド
「動画の音声 + BGM」の合成は amix フィルタで行います。-c:a copy では音声を再エンコードできないため必ず外し、AAC などで再エンコードします。
ffmpeg -i input.mp4 -i bgm.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:duration=shortest:dropout_transition=0[aout]" \
-map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k output.mp4
-filter_complex で 2 入力をマージし、-map 0:v:0 で動画ストリームを残し、-map "[aout]" で合成済み音声を選びます。映像は再エンコードしないので、-c:v copy で高速に処理できます。
amix の主要オプション
| オプション | 既定値 | 説明 |
|---|---|---|
inputs |
2 | 合成する入力の本数 |
duration |
longest |
longest/shortest/first から長さを決定 |
dropout_transition |
2 | 入力が終わった瞬間の音量フェード時間(秒) |
weights |
1 1 |
各入力の重み(音量比)。後述の volume と併用可 |
normalize |
1 | 1 のとき出力をクリップ防止のため自動正規化 |
amix と amerge の違い
2つは目的が異なります。
| フィルタ | 用途 | 出力 |
|---|---|---|
amix |
同じチャンネル数で音を重ねる(合算) | 入力と同じチャンネル数 |
amerge |
チャンネルを結合(モノラル 2 本→ステレオ) | 入力チャンネル数の合計 |
「動画 + BGM」は音を重ねたいので amix を使います。amerge は入力を別々のチャンネルのまま並べます。ステレオ 2 本なら 4 チャンネルに、モノラル 2 本なら左が音声・右が BGM のステレオになり、どちらも意図しない結果です。
元の音声を BGM で置き換える
元の音声を捨てて BGM だけにしたい場合は、-map で動画の映像と BGM だけを選びます。元の音声は出力に入りません(出力側に -an を付けると BGM まで消えます)。
ffmpeg -i input.mp4 -i bgm.mp3 \
-map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 192k -shortest output.mp4
-shortest は短い方の入力長で出力を打ち切るオプションで、BGM が動画より長くても自動で揃います。-c:a copy にすると MP3 のまま MP4 に入りますが、再生できないプレーヤーもあり得るため、-c:a aac で AAC に変換します。
音量バランスの調整
BGM で声が聞こえにくいときは、volume フィルタを amix の前段に挟み、BGM だけ音量を下げます。
ffmpeg -i input.mp4 -i bgm.mp3 \
-filter_complex "[1:a]volume=0.3[bgm];[0:a][bgm]amix=inputs=2:duration=shortest:dropout_transition=0[aout]" \
-map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k output.mp4
volume=0.3 は 30% の音量(約 -10dB)です。実用的な目安は次のとおりです。
| シーン | 元音声 | BGM |
|---|---|---|
| 解説・チュートリアル | 1.0 | 0.15〜0.25 |
| Vlog(環境音残し) | 0.7 | 0.30〜0.40 |
| サイレント映像にBGM | (無音) | 1.0 |
| 音楽メインの映像 | 0.20 | 1.0 |
dB 単位で指定したい場合は volume=-12dB のように書けます。amix は既定で normalize=1(自動正規化)が効き、すべての入力を同じだけ下げます(2 入力なら約 6dB)。比率はそのままですが全体の音量が下がり、入力の 1 本が終わると残りの音量が上がります。設定した音量のまま重ねたいときは normalize=0 を追加してください。
単一入力で BGM ミックスを検証する
音源が 1 本しかなくても、asplit で 2 本に分けてミックスすれば同じ手順を試せます。
ffmpeg -i input.mp3 -filter_complex "[0:a]asplit=2[a1][a2];[a1]volume=0.3[bgm];[a2]volume=1.0[voice];[bgm][voice]amix=inputs=2:duration=longest:dropout_transition=0[out]" -map "[out]" -c:a libmp3lame output.mp3
asplit=2 で同じ音を 2 本に複製し、片方だけ音量を下げて amix する練習用の例です。実際の作業では 2 入力に置き換えます。
BGM が動画より短い・長い場合の対処
動画 60 秒・BGM 30 秒のように長さが合わないとき、選択肢は 4 つあります。
| 状況 | 対処フィルタ | 効果 |
|---|---|---|
| BGM が短い → 無音で埋めたい | apad |
末尾を無音で延長 |
| BGM が短い → ループで埋めたい | aloop |
BGM をループ再生 |
| BGM が長い → 動画に合わせたい | amix=duration=shortest または -shortest |
短い方で打ち切り |
| BGM 終端をきれいに切りたい | atrim + afade |
任意秒で切ってフェードアウト |
BGM をループで動画長まで延ばす
ffmpeg -i input.mp4 -i bgm.mp3 \
-filter_complex "[1:a]aloop=loop=-1:size=2e+09[loop];[0:a][loop]amix=inputs=2:duration=first:dropout_transition=0[aout]" \
-map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k output.mp4
aloop=loop=-1 で無限ループします。size=2e+09 はループする最大サンプル数で、BGM 全体が収まる大きさです。duration=first で、1 本目の入力である元動画の音声の長さに揃えます。
BGM 末尾を無音で埋める
ffmpeg -i input.mp4 -i bgm.mp3 \
-filter_complex "[1:a]apad[pad];[0:a][pad]amix=inputs=2:duration=first:dropout_transition=0[aout]" \
-map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k output.mp4
apad は引数なしで「無限の無音を末尾に追加」します。amix 側で duration=first を指定しているので、元動画の音声の長さで自動的に止まります。
単一入力で apad の動作を確認
ffmpeg -i input.mp3 -af "apad=pad_dur=5,atrim=0:25" output.mp3
20 秒の音源に 5 秒の無音を足し、atrim=0:25 で 25 秒に整えます。BGM の長さ調整だけを試すときに使えます。
BGM のフェードイン / フェードアウト
BGM を突然鳴らすと聞き手に違和感を与えます。afade で開始 2 秒・終了 3 秒のフェードを入れます。
ffmpeg -i input.mp4 -i bgm.mp3 \
-filter_complex "[1:a]volume=0.3,afade=t=in:st=0:d=2,afade=t=out:st=57:d=3[bgm];[0:a][bgm]amix=inputs=2:duration=first:dropout_transition=0[aout]" \
-map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k output.mp4
afade=t=out:st=57:d=3 は「57 秒目から 3 秒かけてフェードアウト」の意味で、動画 60 秒なら末尾までに 0 まで下がります。-shortest を併用する場合は、st を動画長より少し前に設定します。
単一入力で BGM フェードチェーンを検証
ffmpeg -i input.mp3 -af "volume=0.3,afade=t=in:st=0:d=2,afade=t=out:st=15:d=5" output.mp3
20 秒の音源に対し、開始 2 秒のフェードイン+15 秒目から 5 秒のフェードアウトを 1 行で適用するチェーン例です。詳しくは 音声フェードイン・フェードアウト を参照。
複数の BGM をつなぐ(イントロ・メイン・アウトロ)
3 つの BGM を順番につないで 1 本にしたい場合は concat フィルタの音声モードを使います。
ffmpeg -i intro.mp3 -i main.mp3 -i outro.mp3 \
-filter_complex "[0:a][1:a][2:a]concat=n=3:v=0:a=1[bgm]" \
-map "[bgm]" -c:a libmp3lame combined_bgm.mp3
n=3 は入力本数、v=0:a=1 は「映像 0・音声 1」という意味です。出来上がった combined_bgm.mp3 をほかのコマンドの bgm.mp3 として使えば、イントロ→メイン→アウトロを動画に重ねられます。
単一入力で concat の動作を体験
ffmpeg -i input.mp3 -filter_complex "[0:a]asplit=3[a1][a2][a3];[a1]atrim=0:5,asetpts=PTS-STARTPTS[s1];[a2]atrim=0:10,asetpts=PTS-STARTPTS[s2];[a3]atrim=0:5,asetpts=PTS-STARTPTS[s3];[s1][s2][s3]concat=n=3:v=0:a=1[out]" -map "[out]" -c:a libmp3lame output.mp3
1 本の音源を 5 秒・10 秒・5 秒に切って再連結する練習例です。asetpts=PTS-STARTPTS は各セグメントのタイムスタンプを 0 に戻します。この例ではどれも 0 秒から始まるので結果は変わりませんが、atrim=10:15 のように途中から切ったセグメントには必要です。忘れると元の時刻のまま残り、concat の後で前のセグメントとの間に空白ができます。
元の音声に合わせて BGM を自動で下げる(ダッキング)
ナレーションが聞こえやすいように、声が出ている瞬間だけ BGM を自動で下げる「サイドチェインコンプレッサー」を使います。
ffmpeg -i input.mp4 -i bgm.mp3 \
-filter_complex "[0:a]aformat=fltp:44100:stereo,asplit=2[voice1][voice2];[1:a]aformat=fltp:44100:stereo,volume=0.5[bgm];[bgm][voice1]sidechaincompress=threshold=0.02:ratio=6:attack=200:release=1000[ducked];[voice2][ducked]amix=inputs=2:duration=first:dropout_transition=0[aout]" \
-map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k output.mp4
仕組みは「声が来る → コンプレッサーが BGM を圧縮 → 声が止まる → BGM が元に戻る」です。声はサイドチェインと最終 amix の両方に使います。1 つのフィルタ出力は 1 つのフィルタにしかつなげないので、asplit で複製しています。詳しい解説とパラメータの意味は sidechaincompress でナレーション時に BGM を自動で下げる を参照してください。
ストリーミングマップの落とし穴
-filter_complex を付けただけで自動選択がすべて無効になるわけではありません。ラベルのないフィルター出力は最初の出力ファイルへ追加される場合があります。[aout] のように名前を付けた出力は -map "[aout]" で1回だけ選択し、残す映像も -map 0:v で明示してください。公式のストリーム選択規則を参照してください。
| パターン | 結果 |
|---|---|
-map 0:v:0 -map "[aout]" |
✅ 動画 + 合成音声(正解) |
-map "[aout]" のみ |
❌ 音声だけの出力(映像が消える) |
-map 0 のみ |
❌ [aout] がどこにも使われず、エラーで止まる |
| 何もマップしない | ❌ 同じエラーで止まる |
# 間違い
ffmpeg -i input.mp4 -i bgm.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:duration=shortest[aout]" \
-c:v copy -c:a aac output.mp4
上記は -map を書いていないため [aout] がどこにも使われず、Filter 'amix:default' has output 0 (aout) unconnected というエラーで止まります。-filter_complex を使うときは、-map も必ず指定してください。
バッチ処理:複数動画に同じ BGM
ディレクトリ内の .mp4 全部に同じ BGM を当てる Bash スクリプト例です。
mkdir -p out
for f in *.mp4; do
ffmpeg -i "$f" -i bgm.mp3 \
-filter_complex "[1:a]volume=0.3,afade=t=in:st=0:d=2[bgm];[0:a][bgm]amix=inputs=2:duration=first:dropout_transition=0[aout]" \
-map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k "out/${f%.mp4}_bgm.mp4"
done
Windows PowerShell なら Get-ChildItem *.mp4 | ForEach-Object { ffmpeg ... } の形に置き換えます。-c:v copy で映像の再エンコードは省けますが、所要時間は動画の長さ、音声処理、ストレージに依存します。まず1本で出力と所要時間を確認してください。
トラブルシューティング
コマンドがエラーで止まる
-map "[aout]" を書き忘れると、Filter 'amix:default' has output 0 (aout) unconnected というエラーで止まります。-filter_complex の後に追加してください。-c:a copy も使えません。合成した音声は再エンコードが必要なので、Streamcopy requested for output stream fed from a complex filtergraph. Filtering and streamcopy cannot be used together. というエラーで止まります。-c:a aac を使ってください。
BGM がクリップ(音割れ)する
amix の自動正規化が効きすぎて低い、または逆に重ねた結果がクリップしている場合は次のように調整します。
ffmpeg -i input.mp4 -i bgm.mp3 \
-filter_complex "[0:a]volume=0.8[v];[1:a]volume=0.3[bgm];[v][bgm]amix=inputs=2:duration=first:dropout_transition=0:normalize=0,alimiter=limit=0.95:level=0[lim]" \
-map 0:v:0 -map "[lim]" -c:v copy -c:a aac -b:a 192k output.mp4
normalize=0 で自動正規化を切り、alimiter でピークを 0.95(約 -0.45dB)に抑えます。level=0 を付けないと、alimiter は抑えた後に音量を 0dB まで戻します。最終出力の音圧を整えるなら 音量の正規化(loudnorm/LUFS) も検討してください。
動画と BGM が同期しない(だんだんズレる)
サンプルレートが違うだけで必ずドリフトするわけではありません。FFmpegは必要に応じて形式を変換します。aformat で混合する形式を明示できますが、元の時刻のズレは別の問題です。冒頭・中間・末尾でズレが一定か増えるかを確認してください。
ffmpeg -i input.mp4 -i bgm.mp3 \
-filter_complex "[0:a]aformat=fltp:44100:stereo[v];[1:a]aformat=fltp:44100:stereo,volume=0.3[bgm];[v][bgm]amix=inputs=2:duration=first:dropout_transition=0[aout]" \
-map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k output.mp4
よくある質問
BGM が大きすぎて声が聞こえない
まず volume=0.2〜0.3 を amix の手前で掛けます。それでも声に被るなら自動ダッキング(sidechaincompress)を使ってください。
BGM が動画の長さに合わない
短いなら aloop でループ、長いなら amix=duration=first または -shortest で切ります。両方の併用も可能です。
自動でダッキングしたい
詳細パラメータと自然なアタック/リリースの設定例は、sidechaincompress でナレーション時に BGM を自動で下げる にあります。
元の音声を残したい?消したい?
残すなら amix、消すなら -map で映像と BGM だけを選びます。環境音を活かしたい Vlog では残し、BGM だけで見せる MV では消す、と使い分けます。
BGM が片チャンネルだけになる
amerge を使うと起こります。amix を使ってください。元の音声がステレオなら、amix はモノラル BGM も左右両方のチャンネルに入れます。
ロイヤリティフリー BGM の入手先
YouTube オーディオライブラリ(YouTube Studio から無料)、Pixabay Music、DOVA-SYNDROME、甘茶の音楽工房などが定番です。利用規約と帰属表示の要否を必ず確認してください。