Make sure you run the latest version of FFmpeg. For Windows and Linux, static builds are availabe from the homepage. For macOS, you can install FFmpeg through Homebrew.
Then, in the simplest case run:
ffmpeg -i input.mkv -c:v libx264 -c:a aac out.mp4
Setting video quality
For controlling video quality, set the crf
parameter, which defaults to 23. Lower means better quality, but higher file size. Try values between 19 and 26 to see what fits best. You can also set a certain bit rate, depending on which file size you want. Here, for example, 500 kBit/s:
ffmpeg -i input.mkv -c:v libx264 -crf 23 …
ffmpeg -i input.mkv -c:v libx264 -b:v 500k …
For audio, you can set the bit rate too, with -b:a
.
Multiple channel audio
If your audio stream is using multiple channels (e.g. 5.1 sound), you need to use another AAC encoder (libfdk_aac
). This encoder is not available in the static builds, but can be obtained with the pre-packaged / Homebrew versions of ffmpeg.
ffmpeg -i input.mkv -c:v libx264 -crf 23 -c:a libfdk_aac -b:a 384k out.mp4
Copying all streams
In case your input file has more than one video, audio and subtitle stream, ffmpeg by default does not convert all of them.
Use -map 0
to instruct ffmpeg to take all streams from the input file (see the FFmpeg Wiki for more info). This is useful for retaining different languages and subtitles that might be in the original.
ffmpeg -i input.mkv -c:v libx264 -c:a aac -map 0 out.mp4
You can use the -map
and -codec
options with stream specifiers to choose what streams you want and if you would like to stream copy or encode the streams:
ffmpeg -i input.mkv \
-map 0 -c copy \
-c:s mov_text \
-map 0:a:0 -c:a:0 libfdk_aac -b:a:0 128k \
-map 0:a:1 -c:a:1 libfdk_aac -b:a:1 128k \
output.mp4
The mapping in this example goes from general to specific. At first all inputs are stream copied, but the later options refine the behavior so the subtitles are converted instead of copied and more maps are added to include the audio to be re-encoded.
Best Answer
You can use the
-map
option (full documentation) to select specific input streams and map them to your output.The most simple
map
syntax you can use is-map i:s
, wherei
is the input file ID ands
is the stream ID, both starting with0
. In your case, that means we select track0
and4
:If you want to choose video, audio or subtitle tracks specifically, you can also use stream specifiers:
Here,
0:v:0
is the first video stream and0:a:1
is the second audio stream.