Ask Ubuntu is a question and answer site for Ubuntu users and developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I need to convert a video file from Matroska container into mp4 container. Matroska file contains one h.264 video track and one AC3 sound track. It should be possible to do this losslessly, but how to do it with native Ubuntu tools?

Transcoding is not an option.

share|improve this question
See this question‌​. – Binarylife Jun 24 '11 at 23:30
this is especially a solution for converting Matroska files that won't play in a Samsung TV, to files that are compatible with it – knocte Oct 7 '15 at 23:47
Over the years I've found this very useful as Chromecast supports H.264 with AAC or MP3 in an MP4 container. It is very easy to stream videos from your computer to Chromecast if you have Chrome with the Google cast extension. Just drag and drop an MP4 with correct stream encodings to a browser window and start streaming. – Seppo Erviälä Jun 24 at 0:17
up vote 74 down vote accepted

Perhaps the easiest tool for that is avconv from the libav-tools package. Libav is a fork of FFmpeg, which Ubuntu switched to. It is one of the backends for many of the GUI tools mentioned in other answers.

Changing container without re-enconding content could not be simpler:

avconv -i input.mkv -codec copy output.mp4
  • It auto-detects a Matroska to MP4 container conversion based on input/output filenames.

  • -codec copy stream copies, or "re-muxes", the streams from the input to the output without re-encoding. Think of it like a copy and paste.

  • Default stream selection behavior is to select only one stream per stream type. For example, if your input has two video streams and one audio stream then only the video stream with the largest frame size will be selected. Add -map 0 if you want to select all streams from the input.

  • Some containers may not support some formats. So check if your chosen container format, be it mkv, mp4 or even avi has support for all the content in your files (video, audio, subtitles, data, etc). For example, mp4 does not support SubRip subtitles (.srt files).

share|improve this answer
To transcode the audio to AAC, leaving the video as AVC: avconv -i input.mkv -c:v copy -c:a libfaac output.mp4 (I used ffmpeg, I assume avconv has the same command line args here) – camh Oct 23 '12 at 2:42
@camh: What you said works, but please note 2 things: 1) It will leave video as-is, regardless if it is AVC or something else; 2) It will not only convert audio to AAC but also the container format from mkv to mp4 – MestreLion Oct 24 '12 at 15:14
If you want to transfer both the video and audio (both losslessly) and for it not to choke on subtitles then: avconv -i input.mkv -c:v copy -c:a copy -sn output.mp4. MP4 supports the most of the common audio formats used in MKVs including MP3 and AAC. – thomasrutter Jan 25 '13 at 2:39
Do you know if this will work for multiple sound tracks? – Bill O'Dwyer Mar 25 '13 at 21:36
@AquariusPower: have you tried simply with -map 0 to get both audio streams? As I said in the answer: "Default stream selection behavior is to select only one stream per stream type" – MestreLion Sep 16 '15 at 5:26

Get needed software

sudo apt-get install gpac mkvtoolnix

Extract video and audio from matroska file

First you need to check what tracks the matroska file contains with

mkvmerge --identify video.mkv

File 'video.mkv': container: Matroska
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_AC3)

Then extract video and audio according to their tracks with:

mkvextract tracks video.mkv 1:video.h264 2:audio.ac3

Extracting track 1 with the CodecID 'V_MPEG4/ISO/AVC' to the file 'video.h264'. Container format: AVC/h.264 elementary stream
Extracting track 2 with the CodecID 'A_AC3' to the file 'audio.ac3'. Container format: Dolby Digital (AC3)
Progress: 100%

Mux audio and video into mp4 containter

MP4Box -fps 24 -add video.h264 -add video.ac3 video.mp4

AVC-H264 import - frame size 1280 x 720 at 24.000 FPS
Import results: 31671 samples - Slices: 5672 I 125048 P 122648 B - 32288 SEI - 4936 IDR
AC3 import - sample rate 48000 - 6 channels
Saving to video.mp4: 0.500 secs Interleaving

I had to add -fps 24 option because MP4Box didn't detect video fps correctly. Depending on usage AC3 audio track should be re-encoded into something else before muxing.

Now you have remuxed streams from matroska container into mp4 container without losing any quality.

EDIT: MP4 doesn't officially support AC3 audio so the audio track should be converted into a supported format (eg. AAC, MP3) if you want the file to be playable with something else than VLC.

share|improve this answer
I'm not really sure if this was a good idea, it seems that ac3 doesn't work all that well in mp4 container. Maybe it should be converted to acc, or some other format, before muxing into mp4. – Seppo Erviälä Aug 11 '11 at 7:08
Will this work with subtitle tracks? – CyberSkull Mar 15 '12 at 13:47
@CyberSkull If you can convert the subtitle track into 3GPP format then sure. – Seppo Erviälä Mar 15 '12 at 21:12

You can use Avidemux

It has good GUI interface.

When converting from mkv to mp4 it is not re-encoded.

The convertion is done within a minute (for a 60-min video).

  1. sudo apt-get install avidemux

  2. Open the mkv file in avidemux.

  3. Select safe mode if prompted.

  4. Leave the video as copy.

  5. Choose File-> Properties. Check if the audio codec is aac.

    1. If audio codec is NOT aac, select aac(faac).
    2. Otherwise, leave it as copy. (Sometimes using this option the audio may be out of sync or distorted, in that case select aac(faac) instead.)
  6. Select mp4 for format.

  7. Select save, choose location and type a filename with .mp4 as the extension.

Note: Sometimes (~10% chance) it may fail. Then use handbrake(re-encode).

Note2: there are two links which help you:

share|improve this answer
Worked like a charm. I had sync problems following the accepted answer, but not with this one. – moraes Oct 28 '12 at 13:29

try Arista transcoder.

This is the best one I've seen. This is available from ubuntu software center

share|improve this answer
This seems like a really sweet transcoder. I'll keep this in mind, but I don't want to transcode but remux video and audio into a new container. – Seppo Erviälä Jun 25 '11 at 9:11

Since MPEG Part 14 supports h.264 and AC3 natively without transcoding, you can simply rename the file so it has an .mp4 extension instead of a .mkv extension.

share|improve this answer
It might support the codecs inside, but that doesn't mean it will work in an application that doesn't understand Matroska. This would only work if the application supports Matroska and looks at the magic number instead of the extension. – Arda Xi Sep 20 '15 at 14:58
Renaming the file will not convert the container format, and it might confuse the application (and users). As @ArdaXi said, the application would still need to support Matroska to play it. – MestreLion Feb 13 at 12:37

You can try HANDBRAKE by adding its PPA by typing this code into the terminal:

sudo add-apt-repository ppa:stebbins/handbrake-releases
share|improve this answer
This seems to be a video transcoder. I do not want to compress the video track again as it is already in h.264 format. – Seppo Erviälä Jun 25 '11 at 9:09
Handbrake is a great transcoder, but I would never use it for file format conversion. – CyberSkull Mar 15 '12 at 13:39
I absolutely love Handbreak, but unfortunately it only works losslessly for audio (and subtitles). I couldn't find a way to copy the video without transcoding it, and the OP specifically requested lossless format conversion. – MestreLion Oct 3 '12 at 22:10

protected by Community Jan 25 '13 at 8:27

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.