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

audioffmpegstreaming

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.

Best Answer

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.
Related Question