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?
10 Answers
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
.
-
4On 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
– MrLoreCommented Sep 29, 2013 at 11:47 -
-
1
-
1
-
3You 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
.– FutalCommented Sep 9, 2017 at 8:01
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
-
1This 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. Commented Sep 10, 2019 at 15:50
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
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.)
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.
-
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).– tshepangCommented Jan 25, 2011 at 20:32
-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.
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).
If you don't mind the program being GUI, with Blender's video editor you can do that and much much more.
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.