How to replace an audio stream in a video file with multiple audio streams?

20

13

I want to replace the second audio stream (0:2) in a video file that has two audio streams and give it a label if possible. How would I go about this? All the ffmpeg commands I found won't let me keep the second audio stream.

Anonymous

Posted 2014-08-19T22:24:39.060

Reputation: 301

Answers

24

Use the -map option to choose your streams. Default stream selection will only choose one of each stream type, so that is why -map has to be used.

Replace second audio stream

enter image description here

ffmpeg -i video.mkv -i audio.mp3 -map 0:v -map 0:a:0 -map 1:a \
-metadata:s:a:0 language=eng -metadata:s:a:1 language=sme -codec copy \
-shortest output.mkv
  • 0:v – The 0 refers to the first input which is video.mkv. The v means "select video stream type".

  • 0:a:0 – The 0 refers to the first input which is video.mkv. The a means "select audio stream type". The last 0 refers to the first audio stream from this input. If only 0:a is used, then all video streams would be mapped.

  • 1:a – The 1 refers to the second input which is audio.mp3. The a means "select audio stream type".

  • -codec copy will stream copy (re-mux) instead of encode. If you need a specific audio codec, you should specify -c:v copy (to keep the video) and then, for example, -c:a libmp3lame to re-encode the audio stream to MP3.

  • -shortest will end the output when the shortest input ends.

Combine two audio streams into one

enter image description here

ffmpeg -i vid.mkv -i aud.mp3 -filter_complex "[0:a][1:a]amerge=inputs=2[a]" \
-map 0:v -map "[a]" -c:v copy -c:a aac -strict experimental -b:a 192k -ac 2 \
-shortest out.mp4
  • Filtering requires re-encoding, and the amerge filter is used here, so the audio can not be stream copied in this example.

llogan

Posted 2014-08-19T22:24:39.060

Reputation: 31 929

didn't work for me at all. – Rudolf Olah – 2014-12-08T03:24:41.980

@omouse "didn't work" is hard to provide help for. You should use a pastebin link to show your command and the complete console output. – llogan – 2014-12-08T03:41:25.753

My issue is the -codec copy, but I fixed that (different version of ffmpeg), the other issue I had was with with the -map, it complained about the wrong number of streams. – Rudolf Olah – 2014-12-08T14:15:18.290

1I just used -map 0:v -map 1:a. I assume this means to take the video from the first file (video.mkv) and then take the audio from the second file (audio.mp4) to create output.mkv ... Not sure what the -map 0:a:0 is for. I excluded it and I get the results I wanted. – Sun – 2014-12-26T17:51:17.027

@sunk818 Same here. Didn’t work with -map 0:a:0, so I removed it and the result was fine. – aaronk6 – 2015-02-25T16:44:58.943

2@aaronk6 The original question requested a way to map multiple audio streams to the output. The example takes the first audio stream from the first input, and the audio stream(s) from the second input and maps them to the output. It appears some are assuming that the example makes an output with a single audio stream and are then confused. – llogan – 2015-02-25T16:57:02.543

@aaronk6 Added an example to combine two input stereo audio streams into one output stereo stream. – llogan – 2015-02-25T23:29:26.520