160

I have an mp4 video file with multiple audio tracks. I would like to strip away the rest of the tracks and keep just one. How do I do this?

2

10 Answers 10

178
+100

First run ffmpeg -i file.mp4 to see which streams exists in your file. You should see something like this:

Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Stream #0.2: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s

Then run ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4 to copy video stream and 2nd audio stream to new_file.mp4.

6
  • 4
    On Windows this command gave the error Option map (set input stream mapping) cannot be applied to input file file.mp4 new_file.mp4 -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.: to fix it simply change the order of the arguments thusly: ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4
    – MrLore
    Commented Sep 29, 2013 at 11:47
  • Same error as @MrLore on OS X. Commented Jul 25, 2014 at 13:22
  • 1
    It's the same on Ubuntu!
    – Tommaso
    Commented Aug 25, 2014 at 7:32
  • 1
    Works for MKV format too
    – Megidd
    Commented Apr 1, 2017 at 8:10
  • 3
    You can use the more generic option -c copy to have identical streams for audio, video but also subtitles: ffmpeg -i input.mp4 -map 0:0 -map 0:2 -c copy output.mp4.
    – Futal
    Commented Sep 9, 2017 at 8:01
166

Related issue—removing all audio tracks from an mp4 file can be done thus:

ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4
3
  • 1
    This gives me the error The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it. But I added those flags and it's still the same...? Commented Apr 24, 2017 at 10:34
  • See also: superuser.com/questions/268985/… Commented Sep 8, 2019 at 4:16
  • Re poshaughnessy's comment: there seems to be some information here: stackoverflow.com/questions/32931685/… The discussion suggests recent versions of ffmpeg do not experience the "aac experimental" problem. As a general rule, it helps to diagnose your problem if you state the version of the software you're using and the exact syntax of the command (after you added the flags) that gave the error (cf. freeseek's answer loc. cit.). In this specific case, video information from the input file may also be helpful.
    – Greg Marks
    Commented Sep 10, 2019 at 15:50
8

Identify stream numbers:

$ ffmpeg -i in.mp4
   ...
   Stream #0:0: Video: ...
   Stream #0:1: Audio: ...
   Stream #0:2: Audio: ...

Use -map _file_:_stream_ to select which streams to process and output

$ ffmpeg -i in.mp4 -map 0:0 -map 0:2 -vcodec copy -acodec copy out.mp4

see: https://ffmpeg.org/ffmpeg.html#Advanced-options

4

I used Avidemux (GUI) several times, and ffmpeg (console).

In Avidemux, you choose "Audio" -> "Select tracks" in the main menu; then save you video as a new file.

Interestingly enough, in some cases Avidemux produced "better" output than ffmpeg.

just in case, Avidemux and ffmpeg are in the standard Fedora Linux repository. (I'm sure they are standard in other Linux flavors, too.)

3

You could try avidemux which handles only one audio file internally (and therefore forces you to select one specific track). I've never tried it with .mp4 but it works with other formats.

1
  • Doesn't work so well. Maybe it's a bug, but the audio comes back mangled, though it does do the job (remove the rest of the audio tracks).
    – tshepang
    Commented Jan 25, 2011 at 20:32
2

-vn or -an will remove all the video or audio tracks. Supplying -vn -acodec copy will remove video; -an -vcodec copy will remove all audio.

-vcodec copy specifies that ffmpeg should do a straight copy the existing video track (and not do any processing/encoding of it). If you don't specify it, then it will still work but ffmpeg may re-encode the existing video track and the operation will use more CPU and may take considerably longer.

0
0

Using avidemux in command-line.

(In Avidemux GUI, as decribed in https://unix.stackexchange.com/a/85834/4319 above, you simply select/unselect the audio tracks, and save the file. (Everything is copied to the new AVI.))

I've looked at what kind of projects are saved as SpiderMonkey or TinyPy projetcs for my actions, and it turned out that the SpiderMonkey (JavaScript) project lacks the audio track selection actions which I needed, but the TinyPy (Python) project did have them.

I removed everything unrelated (a dozen of unneeded lines), and this is what I got in my some_series.py:

#PY  <- Needed to identify #
#--automatically built--

adm = Avidemux()

adm.audioClearTracks()
adm.audioAddTrack(1)

It leaves track 1, but drops track 0.

Then I ran a batch conversion of many files with a command like this one:

for f in *.avi; do avidemux3_cli --nogui --load "$f" --run ../some_series.py --save ../some_series/"${f%%.rus.eng.avi}".eng.avi --quit; done

It copies everything, but drops all but the needed audio track.

The way to run avidemux from command-line was learned by me from https://www.avidemux.org/admWiki/doku.php?id=tutorial:batch_processing, although they do not mention the Python scripts, only the JS ones (which didn't work for me).

0

An alternative, easy, way to do this with a GUI/app on macOS is Subler

It's also available on HomeBrew :

brew cask info subler
brew cask install subler
-1

If you don't mind the program being GUI, with Blender's video editor you can do that and much much more.

-2

The ffmpeg program has been replaced by avconv. avconv has very similar usage to ffmpeg, thus all the commands in this post can be something like:

avconv <old ffpmeg command line options>

Follow this link to install avconv if you're on Ubuntu.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .