LoginSignup
26
20

More than 3 years have passed since last update.

ffmpegのmapを解説する

Last updated at Posted at 2020-08-17

出力の確認方法確認方法

複数のストリームの内容や順番を確認する場合、以下の方法があります

ffprobeを使う

ffmpeg が入っていれば使えるはずです
使い方は以下です

ffprobe <ファイル名>

映像・音声ストリームが2つずつある場合、以下のように出力されます

Input #0, matroska,webm, from 'output.mkv':
  Metadata:
    DATE            : 2020
    MAJOR_BRAND     : mp42
    MINOR_VERSION   : 0
    COMPATIBLE_BRANDS: isommp42
    ENCODER         : Lavf58.51.100
  Duration: 00:00:10.02, start: 0.000000, bitrate: 17966 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 60 fps, 60 tbr, 1k tbn, 120 tbc (default)
    Metadata:
      HANDLER_NAME    : VideoHandle
      ENCODER         : Lavc58.100.100 libx264
      DURATION        : 00:00:10.020000000
    Stream #0:1: Video: h264 (High), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 60 fps, 60 tbr, 1k tbn, 120 tbc
    Metadata:
      ENCODER         : Lavc58.100.100 libx264
      DURATION        : 00:00:10.020000000
    Stream #0:2: Audio: vorbis, 48000 Hz, stereo, fltp (default)
    Metadata:
      HANDLER_NAME    : SoundHandle
      ENCODER         : Lavc58.100.100 libvorbis
      DURATION        : 00:00:10.004000000
    Stream #0:3: Audio: vorbis, 48000 Hz, stereo, fltp
    Metadata:
      ENCODER         : Lavc58.100.100 libvorbis
      DURATION        : 00:00:10.004000000

VLCを使う

VLCでファイルを開き、「オーディオ」→「オーディオトラック」からオーディオトラックの切り替えができます

image.png

ビデオトラックも同様です

識別子の意味

Aの場合(Aは数字)

「A番目のファイルの全てのストリーム」という意味です

A:Bの場合

「A番目のファイルのB番目のストリーム」という意味です

A:vまたはA:aまたはA:sの場合

「A番目のファイルの全ての映像/音声/字幕ストリーム」という意味です
それぞれ、vが映像、aが音声、sが字幕という意味です。

A:v:B等の場合

「A番目のストリームの全ての映像/音声/字幕ストリームのうち、B番目のストリーム」という意味です

末尾に?が付く場合

そのストリームが存在しない場合、エラーを吐かずに無視される、という意味です

角括弧([])で囲われている場合

フィルターから出力します
詳細は後述します

まとめ

つまりこういうことです

指定子 意味
0:0 0番目のファイルの0番目のストリーム
0:a 0番目のファイルの全ての音声ストリーム
1:v 1番目のファイルの全ての映像ストリーム
2:s 2番目のファイルの全ての映像ストリーム
0:a:1 0番目のファイルの全ての音声ストリームのうちの1番目のストリーム
1:s? 1番めの全ての字幕ストリーム(存在しない場合エラーを吐かず無視して続行)
[outv] フィルタから出力(後述)

指定方法の例

映像・音声を持ったファイルから音声のみを抜き取る

ffmpeg -i 1.mp4 -map 0:a output.mp3

映像・音声を両方持つ2つのファイルから映像・音声をそれぞれ引っ張ってくる

  • 1.mp4の音声
  • 2.mp4の映像

を1つにまとめるには、

ffmpeg -i 1.mp4 -i 2.mp4 -map 0:a -map 1:v output.mp4

これが-mapの最も基本的で有用な使い方ではないでしょうか

複数の音声ストリームを持たせる

  • 1.mp4の音声/映像
  • 2.mp3の音声

を1ファイルにまとめる場合、

ffmpeg -i 1.mp4 -i 2.mp3 -map 0:v -map 0:a -map 1:0 output.kv

コーデックやビットレートをストリーム毎に設定する

ffmpegでは、-mapの前に書いた設定がそのストリームに適用されます

つまり、

ffmpeg -i 1.mp4 -i 2.mp3 -c:v copy -map 0:v -c:a aac -map 0:a -c:a aac -map 1:0 out.kv

こういうことです

フィルタから出力

例えば、映像を左右反転させる場合hflipを、上下反転の場合はvflipフィルタを使いますが、

  • 上下反転
  • 左右反転
  • 元の映像

を1つにまとめる場合、以下のようになります

ffmpeg -i 1.mp4 -filter_complex "[0:v]hflip[hf];[0:v]vflip[vf]" -map [hf] -map [vf] -map 0:v -map 0:a output.mkv

となります。

参考元

https://trac.ffmpeg.org/wiki/Map
https://ffmpeg.org/ffmpeg.html#Advanced-options

26
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
20