[FFmpeg] 映像と音声を結合してひとつの動画にする

独立した映像と音声を結合して、一つの動画ファイルをつくる時に使うコマンド。

音のない映像に音声を結合する

音声のない映像ファイルに音声ファイルを結合する場合は、以下のコマンドを実行します。

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac output.mp4

音声つきの映像に別の音声を差し替えて結合する

音声つき映像から映像のみを抜き出し、別の音声と結合するときのコマンドです。
※結合する音声ファイルが映像付きの場合も、以下と同じコマンドです。

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -map 0:v -map 1:a output.mp4

map について

音声と映像など、複数のデータを結合するときに使用する -map についてのいろいろ。
動画ファイルにある複数のストリームから任意のストリームを指定するときに使用します。

書式

-map [n]:[v/a/s][?]:[m]
  • n … 入力ファイル (n-1) 番目のすべてのストリーム (入力は -i)
  • v … 映像ストリーム (video stream)
  • a … 音声ストリーム (audio stream)
  • s … 字幕ストリーム (subtitle stream)
  • ? … 指定したストリームが存在しない場合は無視する
  • m … m番目のストリームを使う
-map 0
入力ファイル(0番目) のすべてのストリームを使用する。
-map 0:v
入力ファイル(0番目) のすべての映像ストリームを使用する。
-map 0:a? -map 1:v
入力ファイル(0番目) のすべての音声ストリームを使用する、存在しなければスキップ。
入力ファイル(1番目) のすべての映像ストリームを使用する。
-map 0:v:1
入力ファイル(0番目) のすべての映像ストリームの中から1番目のストリームを使用する。
-map 0:1
入力ファイル(0番目) の1番目のストリームを使用する。

入力ファイルの番号は n から 1 を引いていることに注意します。
-i input1.mp4 -i input2.mp4 の場合、最初に読み込まれた input1.mp40番目 で、次に読み込まれた input2.mp41番目 となります。

動画ファイルのストリーム構成を見る

動画ファイルがどのようなストリーム構成になっているのかを見るためのコマンドです。

ffmpeg -i FILE_NAME.mp4

ずらずらっとデータが表示されますが、注目するのは最後あたりに表示される部分です。

Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 640x360 [SAR 1:1 DAR 16:9], 127 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)
      Metadata:
        handler_name    : ISO Media file produced by Google Inc.
        vendor_id       : [0][0][0][0]
Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
      Metadata:
        handler_name    : ISO Media file produced by Google Inc.
        vendor_id       : [0][0][0][0]

Stream #0:0 以降に表示されているのが、動画ファイルに存在するストリームです。
このファイルの場合は 0:0 が映像(Video)で、0:1 は音声(Audio)となっています。

副音声つきの動画やドライブレコーダーなど、複数の映像または音声データが入ったファイルを扱う場合は、ストリーム構成を確認してから指定したほうが良いと思います。