MPEG2 Demuxer in Java

1. Demuxer - was ist das und warum braucht man sowas?
2. MPEG2 PES Demuxer in Java
3. Download des Java Demuxers (Neue Version 1.2!)
4. Links zum Thema MPEG2

1. Demuxer - was ist das und warum braucht man sowas?

MPEG-Dateien (oder Streams) enthalten Daten, die unterschiedliche Arten von Informationen enthalten; z.B. Video-Daten, Audio-Daten (evtl. in mehreren Sprachen), Untertitel etc. Diese Information werden jeweils in Blöcke (Packets) unterteilt. Da für das korrekte Abspielen so einer Audio oder Video-Datei die passenden Blöcke zum korrekten Zeitpunkt vorliegen müssen, ist es nötig, diese Blöcke in geeigneter Weise anzuordnen. Der Fachjargon nennt man das "Multiplexen".

Das Format in dem die VDR-Software Aufzeichnungen ablegt wird als MPEG2-PES-Stream bezeichnet. PES steht für "packetized elementary stream". Diese Format lässt sich direkt nur mit wenigen Programmen abspielen. Wer sich für den Aufbau so eines Streams interessiert, sollte die unten aufgeführten Links besuchen. Da ich mir VDR-Aufnahmen auch mal für spätere Zwecke aufheben und evtl. auf DVD/CD brennen möchte, suchte ich nach Software, mit der sich diese PES-Streams in geeigneter Weise umwandeln lassen. Der Vorgang, bestimmte Packete, die eine bestimmte Art von Information enthalten, als eigene Datei zu schreiben (oder anders zu verarbeiten), bezeichnet man als "Demultiplexen".

Im Konkreten-Fall sollte der MPEG2-PES-Stream in einen "MPEG2 Program Stream" umgewandelt werden. Solche Dateien können dann z.B. direkt von MPlayer, "Windows-Media-Player" abgespielt werden oder sehr einfach als Video-DVD gebrannt werden.

Doch diese Umwandlung stellte sich als etwas problematisch heraus. Nach längerem Herumprobieren fand ich zwei Programme, die diese Aufgabe erledigten: PVA-Strumento und Project-X (ehemals DS.JAR). Beide hatten aber für meine Zwecke entscheidende Nachteile: PVA-Strumento war eine Windows-Anwendung, die nur mit größeren Problemen (Windows Emulation) unter Linux zu betreiben war. Project-X war zwar in Java geschrieben, benötigte aber eine grafische Oberfläche (d.h. X-Windows). Es soll zwar mit einigen Tricks auch ohne eine X-Server möglich sein es zu betreiben, aber das schien mir auch ziemlich "hacky".

Zuerst versuchte ich aus Project-X die Anbindung an die graphische Oberfläche zu entfernen, bedingt durch den Programmier-Stil des Authors fand ich mich aber in dem Source-Code nicht zurecht. Also ließ ich diese Idee wieder fallen und sagt mir: "das geht wohl schneller, wenn Du es selbst machst".

Zuerst machte ich mich auf die Suche nach Dokumentation zu MPEG-Streams und nach ca. einer Woche hatte ich eine erste Version fertig gestellt.

2. MPEG2PESDemuxer in Java

Wer den Demuxer ausprobieren will, kann sich meine Version herunterladen und sich noch bei Bedarf das aktuelle Java Runtime Environment (JRE) oder SDK besorgen. (Java @ Sun.com). Nach dem Entpacken des Archivs erhält man den kompletten Source-Code (*.java) sowie eine JAR Datei.

Der Aufruf des Demuxers funktioniert so:

java -jar demuxer.jar -iInputfile,[Inputfile] [-vVideoOutFile] [-aAudioOutFile]

Wird nur ein Input-File angegeben, erhält man eine kurze Information über das Format der Input-Datei. Werden mehrere Input-Files angegeben, so wird dies als zusammengehöriger Film gesehen und die Input-Files in EINE Video/Audio Datei konvertiert. Wird nur eine Output-Variante (nur Video oder nur Audio) benötigt, kann die andere Option einfach weggelassen werden.

Am Ende der Konversion wird die Delay-Zeit zwischen dem Video- und Audio-Stream ausgegeben. Dies ist wichtig für ein erfolgreiches Remultiplexen der beiden Streams. Für das Erzeugen eines entsprechenden MPEG2 Program Stream benutze ich derzeit das Tool mplex aus den mjpegtools.

Der Remultiplex funktioniert dann so:

mplex [-O AV-Delay] -o ProgramStreamFile.mpg VideoOutFile AudioOutFile

Die so entstandene MPG-Datei lässt sich dann mit allen gängigen Videoprogrammen abspielen und eignet sich auch als Grundlage für DVD-Author.

Über Bugs und sonstige Rückmeldungen zu meinem Tool würde ich mich freuen. Die Nutzung der Software geschieht auf eigene Gefahr. Jegliche Ansprüche auf Gewährleistung oder Schadenersatz sind hiermit ausgeschlossen. Nutzung und Verbreitung meiner Software ist an die GPL Richtlinien gebunden.

Abschließen möchte ich noch Andrew Duncan meinen Dank ausprechen. Er hat auf seiner Internet-Seite das MPEG2 Format gut aufbereitet, was das Verständnis sehr erleichert hat.

3. Download des Java Demuxers (Neue Version!)

Zip-Archiv V1.2

Bekannte Probleme/Bugs:

  • Version 1.2: Der Bug mit den abgeschnittenen PictureSlices ist behoben. Das Video sieht relativ brauchbar aus - trotzdem kommt es hin und wieder zu Artefakten im Bild. Evtl. steckt hier noch ein weiterer Bug, der aber anscheinend nur alle paar hundert Frames auftritt.
  • Version 1.1: Es passiert häufiger, daß mplex die demultiplexten Dateien nicht multiplexen kann. Die Ursache dieses Problems ist bisher unklar. Wurde die Datei mit Project X oder PVA Strumento demultiplexed, ergibt sich aber der gleiche Fehler, also scheint der Fehler in der Datei selbst zu liegen. Meine Ursachenforschung ist noch nicht so weit, genaueres sagen zu können. Die veröffentlichte Version 1.1 hatte einen häßlichen Bug - PictureSlices wurden abgeschnitten. Das resultierende Video war danach verstümmelt. Sorry about that....
  • Version 1.0: Bei bestimmten Dateien wurden "padding bytes" von PES Video Packets in die demultiplexte Video Datei geschrieben. Begann das erste Audio-Packet nicht mit dem passenden Audio Header so wurde die demultiplexte Audio Datei nicht als solche erkannt.
  • 4. Links zum Thema MPEG

    Andrew DuncanÜbersichtliche Infos zum MPEG Format

    Mathieu @ GNU.ORG Weitere Link zum Thema MPEG

    MJPEG-Tools Konvertierungstools für MPEG Formate

    MPEG Audio Format Beschreibung

    Howto zum Erstellen von DVDs unter Linux

    Home of PVA-Strumento

    Home of Project-X

    Home of Transcode


    Zurück zur Projekt-Seite

    Schreiben Sie Ihre Anmerkungen oder Kritik doch in mein Gästebuch

    Erstellt von A.Rosenberg am 17.10.2003 - Letzter Update am 06.03.2004

    Diese Seite wurde seit dem 17.10.2003  [Counter]  mal abgerufen.