Creating and working with Matroska files
Go to file
2003-04-25 17:23:29 +00:00
avilib Fixed an inavlid access to non-allocated space if there is some private data after the WAVEFORMATEX structure in the AVI. 2003-04-17 12:10:46 +00:00
debian Automatic generation of configure if it is missing. 2003-04-22 10:59:41 +00:00
.cvsignore Added data directory. 2003-04-17 12:36:58 +00:00
ac3_common.cpp first working version. yay! 2003-02-16 17:04:39 +00:00
ac3_common.h first working version. yay! 2003-02-16 17:04:39 +00:00
acinclude.m4 Better automatic detection of the EBML and Matroska header files for properly installed versions of libebml and libmatroska. 2003-04-24 21:02:49 +00:00
autogen.sh switched to auto* 2003-02-16 12:09:37 +00:00
ChangeLog Automatic ChangeLog update. 2003-04-20 21:29:45 +00:00
cluster_helper.cpp Support for packet durations which end up in a KaxBlockDuration element. 2003-04-20 21:18:51 +00:00
cluster_helper.h Removed the IDs associated with the packet_ts and used the timecodes for bref and fref instead. 2003-04-18 13:08:04 +00:00
common.cpp Fixed the "was iconv initialized?" detection. 2003-04-24 20:32:33 +00:00
common.h Removed the CodecID mapping which was unused anyway. Added charset conversion from and to UFT8 with iconv (untested). 2003-04-23 14:38:53 +00:00
configure.in Bumped version number in anticipation of the first release :) 2003-04-24 20:24:32 +00:00
COPYING standard GPL 2003-04-11 13:44:04 +00:00
depcomp initial addition, compilation fixups 2003-02-16 00:47:53 +00:00
error.h Added a first Vorbis support including the packetizers. 2003-03-03 18:00:30 +00:00
install-sh switched to auto* 2003-02-16 12:09:37 +00:00
Makefile.am Added man pages to the Makefile. 2003-04-20 15:15:59 +00:00
matroska.h Support for S_TEXT/UTF8 subtitles (which are also the default now). Reordered the help output and the mkvmerge man page a bit. 2003-04-24 20:36:45 +00:00
missing switched to auto* 2003-02-16 12:09:37 +00:00
mkinstalldirs switched to auto* 2003-02-16 12:09:37 +00:00
mkvinfo.1 Initial man page based on ogminfo's man page. 2003-04-20 15:12:28 +00:00
mkvinfo.cpp Support for seek entries. 2003-04-25 17:23:29 +00:00
mkvmerge.1 Support for S_TEXT/UTF8 subtitles (which are also the default now). Reordered the help output and the mkvmerge man page a bit. 2003-04-24 20:36:45 +00:00
mkvmerge.cpp Initial support for meta seek information. 2003-04-25 16:29:05 +00:00
mkvmerge.h The Matroska cue element is only written if at least one cue entry was created. Track numbers now start at 1 which conforms to the specs. 2003-04-20 16:39:03 +00:00
mkvmerge.mak Makefile for mkvmerge for Microsoft Developer Studio by Shelly 2003-04-09 13:34:31 +00:00
mp3_common.cpp Changed all pointers to general data to unsigned char * 2003-03-04 10:16:28 +00:00
mp3_common.h Changed all pointers to general data to unsigned char * 2003-03-04 10:16:28 +00:00
ogmstreams.h Copied from ogmtools. OGG media header and type definitions.h 2003-03-01 16:51:29 +00:00
p_ac3.cpp Support for the "default" flag via a switch "--default-track". 2003-04-21 08:29:50 +00:00
p_ac3.h Extended the general process function to include both a backward and a forward reference. 2003-04-18 13:21:11 +00:00
p_mp3.cpp Support for the "default" flag via a switch "--default-track". 2003-04-21 08:29:50 +00:00
p_mp3.h Extended the general process function to include both a backward and a forward reference. 2003-04-18 13:21:11 +00:00
p_pcm.cpp Support for the "default" flag via a switch "--default-track". 2003-04-21 08:29:50 +00:00
p_pcm.h Extended the general process function to include both a backward and a forward reference. 2003-04-18 13:21:11 +00:00
p_textsubs.cpp Support for S_TEXT/UTF8 subtitles (which are also the default now). Reordered the help output and the mkvmerge man page a bit. 2003-04-24 20:36:45 +00:00
p_textsubs.h Extended the general process function to include both a backward and a forward reference. 2003-04-18 13:21:11 +00:00
p_video.cpp Support for the "default" flag via a switch "--default-track". 2003-04-21 08:29:50 +00:00
p_video.h Changed the way frame types are propagated to the video packetizer: now the bref is evaluated. If it is set to != -1 then it is a P frame, otherwise it is an I frame. 2003-04-20 19:32:11 +00:00
p_vorbis.cpp Fixes for incorrect lacing creation/reading for the Vorbis headers in CodecPrivate. 2003-04-22 20:25:21 +00:00
p_vorbis.h Extended the general process function to include both a backward and a forward reference. 2003-04-18 13:21:11 +00:00
pr_generic.cpp Support for the "default" flag via a switch "--default-track". 2003-04-21 08:29:50 +00:00
pr_generic.h Support for S_TEXT/UTF8 subtitles (which are also the default now). Reordered the help output and the mkvmerge man page a bit. 2003-04-24 20:36:45 +00:00
queue.cpp Support for packet durations which end up in a KaxBlockDuration element. 2003-04-20 21:18:51 +00:00
queue.h Support for packet durations which end up in a KaxBlockDuration element. 2003-04-20 21:18:51 +00:00
r_ac3.cpp Moved the cluster helper to its own files. Moved a lot of other stuff into the appropriate header files. 2003-04-18 10:08:24 +00:00
r_ac3.h Changed all u_int64_t to int64_t. Some crappy MS compilers obviously cannot convert u_int64_t to double. And I do not need them that badly. 2003-04-13 15:23:03 +00:00
r_avi.cpp Changed the way frame types are propagated to the video packetizer: now the bref is evaluated. If it is set to != -1 then it is a P frame, otherwise it is an I frame. 2003-04-20 19:32:11 +00:00
r_avi.h Changed all u_int64_t to int64_t. Some crappy MS compilers obviously cannot convert u_int64_t to double. And I do not need them that badly. 2003-04-13 15:23:03 +00:00
r_matroska.cpp Fixes for incorrect lacing creation/reading for the Vorbis headers in CodecPrivate. 2003-04-22 20:25:21 +00:00
r_matroska.h Removed the now unnecessary extra function for handling text subtitles. 2003-04-21 10:06:48 +00:00
r_microdvd.cpp Changed all u_int64_t to int64_t. Some crappy MS compilers obviously cannot convert u_int64_t to double. And I do not need them that badly. 2003-04-13 15:23:03 +00:00
r_microdvd.h Changed all u_int64_t to int64_t. Some crappy MS compilers obviously cannot convert u_int64_t to double. And I do not need them that badly. 2003-04-13 15:23:03 +00:00
r_mp3.cpp Moved the cluster helper to its own files. Moved a lot of other stuff into the appropriate header files. 2003-04-18 10:08:24 +00:00
r_mp3.h Changed all u_int64_t to int64_t. Some crappy MS compilers obviously cannot convert u_int64_t to double. And I do not need them that badly. 2003-04-13 15:23:03 +00:00
r_ogm.cpp Made the Ogg/Ogm reader not abort if no valid Ogg page was found. Just read more data and retry. 2003-04-22 13:39:44 +00:00
r_ogm.h Changed all u_int64_t to int64_t. Some crappy MS compilers obviously cannot convert u_int64_t to double. And I do not need them that badly. 2003-04-13 15:23:03 +00:00
r_srt.cpp Moved the cluster helper to its own files. Moved a lot of other stuff into the appropriate header files. 2003-04-18 10:08:24 +00:00
r_srt.h Changed all u_int64_t to int64_t. Some crappy MS compilers obviously cannot convert u_int64_t to double. And I do not need them that badly. 2003-04-13 15:23:03 +00:00
r_vobsub.cpp Renamed all timestamps to timecodes. 2003-04-18 08:42:20 +00:00
r_vobsub.h Changed all u_int64_t to int64_t. Some crappy MS compilers obviously cannot convert u_int64_t to double. And I do not need them that badly. 2003-04-13 15:23:03 +00:00
r_wav.cpp Moved the cluster helper to its own files. Moved a lot of other stuff into the appropriate header files. 2003-04-18 10:08:24 +00:00
r_wav.h Changed all u_int64_t to int64_t. Some crappy MS compilers obviously cannot convert u_int64_t to double. And I do not need them that badly. 2003-04-13 15:23:03 +00:00
README Updated the overhead factor. Included a note about low disk space and MP3 encoding. 2003-04-23 06:24:08 +00:00
subtitles.cpp Moved the cluster helper to its own files. Moved a lot of other stuff into the appropriate header files. 2003-04-18 10:08:24 +00:00
subtitles.h Added support for SRT reading. Added support for outputting the preliminary simple text subtitle format. 2003-03-06 23:39:40 +00:00
TODO Update on the TODO list. 2003-04-21 10:01:53 +00:00

MKVToolNix 0.2
==============

These tools allow information about (mkvinfo) or extraction
from (mkvdemux) or creation of (mkvmerge) or the splitting of
(mkvsplit) Matroska files. Matroska is a new multimedia file
format aiming to become THE new container format for the future. You
can find more information about it and its underlying technology, the
Extensible Binary Meta Language (EBML), at

http://www.matroska.org/

At the moment only mkvinfo and mkvmerge are available, but the others
will be as well.

MkvToolNix aims to become for Matroska what the OGMTools are for
OGM.

The full documentation for each command is now maintained in its
man page only. Type 'mkvmerge -h' to get you started.

This code comes under the GPL (see www.gnu.org or the file COPYING).
Modify as needed.

The newest version can always be found at
http://www.bunkus.org/videotools/mkvtoolnix/

Moritz Bunkus <moritz@bunkus.org>

Installation
------------

Installation is not trivial but not impossible either. You first need
libebml and libmatroska, which can be obtained via cvs:

cvs -d:pserver:anonymous@cvs.corecodec.org:/cvsroot/matroska login

Just hit the enter key if you're prompted for a password. Now check out
the sources themselves:

cvs -z3 -d:pserver:anonymous@cvs.corecodec.org:/cvsroot/matroska \
  co libmatroska
cvs -z3 -d:pserver:anonymous@cvs.corecodec.org:/cvsroot/matroska \
  co libebml

Change to libebml/make/linux and run 'make'. Change to
libmatroska/make/linux. Once more run 'make'.

After you've compiled the two libraries you can now compile MkvToolNix
itself:

bunzip2 < mkvtoolnix-...tar.bz2 | tar xvf -
cd mkvtoolnix-...
./configure --with-matroska-include=/where/i/put/libmatroska/src \
  --with-matroska-lib=/where/i/put/libmatroska/make/linux \
  --with-ebml-include=/where/i/put/libebml/src \
  --with-ebml-lib=/where/i/put/libebml/make/linux
make

And you're done.

Example
-------

Here's a *very* brief example of how you could use mkvmerge
with mencoder in order to rip a DVD:

a) Extract the audio to PCM audio and let mencoder calculate the
video frame numbers:

mencoder -dvd 1 -ovc frameno -oac pcm -o frameno.avi

If you're low on disk space and can invest a bit more time then you
tell mencoder to encode to MP3 instead:

mencoder -dvd 1 -ovc frameno -oac mp3lame -lameopts br=32 -o frameno.avi

b) Extract the audio again, this time to a plain WAV file:

mplayer -dvd 1 -vc dummy -vo null -hardframedrop -ao pcm -aofile audio.wav

At the moment selecting a non-existant video codec with -vc results
in the fastest audio dump.

c) Normalize the sound (optional)

normalize audio.wav

d) Encode the audio to Vorbis:

oggenc -q3 -oaudio-q3.ogg audio.wav

e) Somehow calculate the bitrate for your video. Use something like...

video_size = (target_size - audio-size) / 1.005
video_bitrate = video_size / length / 1024 * 8

target_size, audio_size in bytes
length in seconds
1.005 is the overhead caused by putting the streams into an Matroska file
  (about 0.5%, that's correct ;)).
video_bitrate will be in kbit/s

f) Use the two-pass encoding for the video:

mencoder -dvd 1 -oac copy -ovc lavc \
  -lavcopts vcodec=mpeg4:vbitrate=1000:vhq:vqmin=2:vpass=1 \
  -vop scale=....,crop=..... \
  -o /dev/null

mencoder -dvd 1 -oac copy -ovc lavc \
  -lavcopts vcodec=mpeg4:vbitrate=1000:vhq:vqmin=2:vpass=2 \
  -vop scale=....,crop=..... \
  -o movie.avi

g) Merge:

mkvmerge -o movie.mkv -A movie.avi audio-q3.ogg

-A is necessary in order to avoid copying the raw PCM (or MP3) audio as well.