O Matroska: mkv-Dateien schneiden, zusammensetzen und demuxen


Matroska ist ein Container-Format, das Filme und auch ganze DVDs mit Kapiteln, Video – vorzugsweise in HD -, mehreren Tonspuren – auch Mehrkanalton in mehreren Sprachen – und Untertitel verstauen kann – und zwar sehr handlich in einer Datei, erkennbar an der Erweiterung *.mkv. Wenn es darum geht, solche Dateien verlustfrei oder gar Frame-genau zu schneiden, sind die bekannten Open-Source-Video-Editoren (Avidemux, Virtualdub) allerdings noch überfordert oder arbeiten unzuverlässig. Es gibt jedoch eine rudimentäre Lösung: das Open-Source-Paket mkvtoolnix, das für Windows, Linux und in einer OS-X-Portierung verfügbar ist. Für dieses Tutorial wurde die von Ubuntu 10.10 im Paketmanager bereitgestellte Version genutzt. (Update: funktioniert auch in Ubuntu 12.04)

Zunächst aber eine Warnung: Diese Software hat keine komfortable Benutzer-Oberfläche, sondern wird über die Kommandozeile bedient. Wahlweise gibt es aber auch eine simpel gestrickte GUI (siehe Screenshot), die für Nutzer in Frage kommt, die überhaupt keine Erfahrung mit dem Terminal haben. Installation:

sudo apt-get install mkvtoolnix mkvtoolnix-gui

Das in mkvtoolnix enthaltene Programm mkvmerge kann Video-Container verlustfrei schneiden, genauer gesagt: splitten. Verlustfrei bedeutet, der Datenstrom braucht nicht neu codiert zu werden, da er wird unverändert übernommen wird. Das erspart Rechen-Power, viel Zeit und Qualitätsverluste. Splitten bedeutet, dass am Schneidepunkt stets ein Datei-Split durchgeführt wird:

mkvmerge film.mkv -o split.mkv --split timecodes:00:03:33.000

splittet die Datei film.mkv nach 3:33 Minuten, so dass zwei neue Dateien entstehen, deren Name im Parameter -o (wie Output) plus automatischer Nummerierung bestimmt wird:

  • split-001.mkv vom Filmanfang bis 3:33
  • split-002.mkv von 3:33 bis Filmende

Es lassen sich auch mehrere Split-Punkte angeben. Will man etwa Anfang und Ende einer Film-Datei abschneiden, aber die Mitte behalten, oder will man ungekehrt in der Mitte einen Werbeblock herausschneiden, jedoch Anfang und Ende behalten, gibt man zwei Split-Punkte an:

mkvmerge film.mkv -o split.mkv --split timecodes:00:03:33.000,00:06:27.000

Erzeugt werden bei zwei Split-Punkten drei Dateien:

  • split-001.mkv vom Filmanfang bis Minute 3:33
  • split-002.mkv von Minute 3:33 bis 6:27
  • split-003.mkv von 6:27 bis Filmende

Wer statt der Kommandozeile die GUI (bei mir Version 4.0.0/Update 5.10 unter Ubuntu 12.04) unter dem Namen mmg aufruft, geht so vor:

  • Unter Quelldateien mit dem Knopf hinzufügen die Ursprungs-Datei – in unserem Beispiel also film.mkv – auswählen
  • Reiter Global ansteuern
  • Aufteilen aktivieren auswählen
  • das Feld „… nach Zeitstempeln“ wie im Screenshot mit den per Komma getrennten Zeitangaben ausfüllen.
  • unten als Zieldateiname split.mkv angeben.

Ob per Kommandozeile oder GUI – die zweite Datei enthält nun den mittleren Part. Wenn es genau dieser Teil des Films ist, den man herauslösen wollte, können die beiden anderen Teile einfach gelöscht werden. Handelt es sich beim zweiten Teil hingegen um Werbung oder einen anderen unerwünschten Inhalt, dann löscht man diese Datei und setzt die beiden anderen Teile wieder zu einem Film zusammen (engl.: join oder eben merge).

Eine zusammengesetzte Datei erzeugt man ebenfalls mit mkvmerge, indem eine (oder auch mehrere) Datei(en) per Plus-Zeichen an die erste Datei angehängt werden. Das Resultat landet dann in der mit dem Attribut -o bestimmten Output-Datei, hier also in sauberer-film.mkv:

mkvmerge -o sauberer-film.mkv split-001.mkv +split-003.mkv

Dasselbe lässt sich auch in der GUI machen:

  • Unter Quelldateien mit dem Knopf hinzufügen die erste Datei – in unserem Beispiel also split-001.mkv – auswählen
  • Mit dem Knopf anhängen den Teil nach der Werbung – also split-003.mkv – auswählen
  • Unter Zieldateiname den Namen der bereinigten Film-Datei eintragen
  • Muxen starten

Die Zeitangaben für die Schnitt-Punkte sind in diesem Beispiel nur sekundengenau. Da genügt auch, denn mkvmerge kann nur an I-Frames schneiden. Konkret: Es sucht sich den nächsten I-Frame nach dem angegebenen Schnittpunkt.

Wie bekommt man die Schnittzeiten heraus? Da mkvmerge weder in der Kommandozeilen- noch in der GUI-Version eine Video-Vorschau bietet, muss man die Zeiten notgedrungen beim Abspielen in einem Videoplayer ermitteln. Unter Windows macht es der Media Player Classic leichter, indem er per SHIFT-Pfeiltaste von I-Frame zu I-Frame springt. Trotzdem: Besonders genau muss die Zeitangabe nicht sein, da mkvmerge eben nur an I-Frames schneidet, und die können – je nach Komprimierung des zu schneidenden Videos – auch mal mehrere Sekunden auseinanderliegen. Sollte sich später bei der Wiedergabe des gesplitteten Films zeigen, dass ein Schnitt zu früh oder zu spät erfolgt ist, kann man versuchen, die Zeitangabe für split um eine halbe Sekunde vor oder zurück korrigieren und erneut mkvmerge ausführen.

Bequemer geht es leider nicht. Immerhin hat man am Ende einen verlustfrei – da ohne erneutes und langwieriges Encoding – geschnittenen Film.

Wer den Film in einem echten Video-Editor bearbeiten will, dort aber Probleme mit dem Matroska-Container bekommt, sollte versuchen, die einzelnen Spuren (in der Regel Bild und Ton) zunächst selbst aus dem Container auszupacken. Man nennt diesen Vorgang demuxen, und natürlich hat das Paket mkvtoolnix auch für diese Aufgabe die richtigen Werkzeuge parat.

Welche Spuren befinden sich überhaupt in der Film-Datei? Um das herauszufinden, befragen wir zunächst das Tool mkvinfo:

mkvinfo film.mkv

Als Resultat spuckt mkvinfo jede Menge Informationen über den Inhalt des mkv-Containers aus. Uns interessieren die Spuren und ihre Nummern. Nachstehend die Ausgabe mit von mir vorgenommenen Auslassungen aus einer mkvinfo-Ausgabe:

+ EBML-Kopf
|[...]
+ Segment, Größe 100199976
| [...]
|+ Segment-Tracks
| + Ein Track
|  + Tracknummer: 1
|  [...]
|  + Codec-ID: V_MPEG4/ISO/AVC
|  [...]
| + Ein Track
|  + Tracknummer: 2
|  [...]
|  + Codec-ID: A_AC3
|  [...]
|+ EbmlVoid (Größe: 1070)
|+ Cluster

Wie man sieht, enthält film.mkv nur zwei Spuren, einen Video-Track mit der Nummer 1 im Format Mpeg4 und einen Audio-Track mit der Nummer 2 im Format AC3 – beides typische Formate im HD-Recording. Mit diesen Angaben können wir nun das Tool mkvextract füttern:

mkvextract tracks film.mkv 1:film.mpv 2:film.ac3

Mkvextract packt also aus dem Matroska-Container Video und Audio aus und speichert sie in getrennte Dateien – Video in film.mpv und Audio in film.ac3. Diese Dateien lassen sich nun in den Video-Editor der Wahl importieren. Dort können Sie wieder zusammengesetzt und weiter bearbeitet werden – hoffentlich ohne Probleme. In der Praxis stellt sich nämlich heraus, dass mein favorisierter Video-Editor, das Open-Source-Programm avidemux, auch mit den ausgepackten Strömen eines MKV-Containers noch sehr wählerisch umgeht – je nach Codierung der Daten.

8 comments on “O Matroska: mkv-Dateien schneiden, zusammensetzen und demuxen”

  1. Danke. Habe ich glatt mal korrigiert. Bei Interesse: Ich habe noch viel mehr Typos im Angebot.

  2. Vielen Dank für diesen hilfreichen Beitrag. Das hilft ganz besonders bei Aufnahmen mit TVHeadend.

    Zu den Schnittzeiten gäbe es noch eine Alternative, mit der man diese framegenau ermitteln kann (auch wenn danach dann das nächste I-Frame gesucht wird): Kdenlive. Das nehme ich, um die Schnittzeiten zu ermitteln. Alles weitere wie von Dir beschrieben unter Ubuntu 12.04 unter Benutzung der GUI –> funktioniert super!

  3. Vielen Dank für diesen Artikel. Leicht verständlich für Laien und gut anwendbar. Perfekt.

  4. Auch von mir einen großen Dank!
    Eine Frage: Das Programm zeigt in der unteren Leiste oft „Warnung“ oder mehrere Warnungen an. Wie kann ich herausbekommen, was damit gemeint ist? Mit rechtem oder linkem Mausklick kann ich nur die Warnungen bestätigen!

  5. Hat niemand eine Antwort?
    Ergänzend: In der Jobwarteschlange steht dann „Mit Warnungen beendet“.
    Wo sind die Warnungen definiert?

Schreibe einen Kommentar