出力の確認方法確認方法
複数のストリームの内容や順番を確認する場合、以下の方法があります
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でファイルを開き、「オーディオ」→「オーディオトラック」からオーディオトラックの切り替えができます
ビデオトラックも同様です
識別子の意味
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