How to remove only one track (not all) from video file container (.vob or .mkv) using ffmpeg?
I know I can just copy video (-c:v copy -an) and specific
The most efficient method is to use negative mapping in the -map option to exclude specific stream(s) ("tracks") while keeping all other streams.
ffmpeg -i input -map 0 -map -0:a:2 -c copy output
-map 0 selects all streams from the input.-map -0:a:2 then deselects audio stream 3. The stream index starts counting from 0, so audio stream 10 would be 0:a:9.ffmpeg -i input -map 0 -map -0:a -c copy output
-map 0 selects all streams from the input.-map -0:a then deselects all audio streams from the input.Keep everything except audio streams #3 and #6:
ffmpeg -i input -map 0 -map -0:a:3 -map -0:a:6 -c copy output
ffmpeg -i input -map 0 -map -0:s -map -0:d -c copy output
This example does not need to use any negative mapping.
ffmpeg -i input -map 0:v -map 0:a -c copy output
If you want to remove other stream types you can use the appropriate stream specifier.
v - video, such as -map -0:va - audio, such as -map -0:a (as shown above)s - subtitles, such as -map -0:sd - data, such as -map -0:dt - attachments, such as -map -0:tUsing a stereo input and channelsplit filter. Example to get the right channel only and output a mono audio file:
ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo:channels=FR[right]" -map "[right]" front_right.wav
channel_layout is the channel layout of the input stream. The default is stereo.
channels lists the channels to be extracted as separate output streams. The default is all which extracts each input channel as a separate, individual stream.
See ffmpeg -layouts for a list of accepted channel layouts (for channel_layout option) and channel names (for channels option).
See FFmpeg Wiki: Audio Channels for more examples.