In der folgenden Anleitung soll darauf eingegangen werden, wie auch MPEG2-Dateien mit VirtualDub geladen und verarbeitet werden können, weil dies nicht standardmäßig vom Programm unterstützt wird. Das Öffnen und Bearbeiten von MPEG2-Dateien mit VirtualDub ist für all diejenigen interessant, die z.B. DVB-S, -C oder auch schon -T Empfang haben. Des Weiteren muss auch bei der Verwendung eines MPEG2-Hardware (z.B. WinTV PVR) oder Software-Encoders (z.B. PowerVCR, WinDVR) dieser Weg gegangen werden.

Vorbereitungen

Es werden folgende Programme benötigt:

Wichtig! Die PlugIns für AviSynth v2.0 funktionieren nicht mehr direkt mit der 2.5er Version. Damit diese dennoch verwendbar sind muss vorher die "LoadPluginEx.dll" geladen werden. Diese befindet sich im WarpSharp-Package.

Zuerst muss AviSynth (AVI SYNTHesizer) installiert werden. Dieses Programm ist ein so genannter Frameserver, d.h. es stellt anderen Programmen, wie z.B. VirtualDub, die Frames eines beliebigen auf der Festplatte befindlichen Videostreams zur Verfügung, selbst wenn das Quellformat vom eigentlichen Programm nicht unterstützt wird. Die Befehlseingabe geschieht bei AviSynth über einen Text, ein so genanntes Skript, welches mit Hilfe von NotePad oder dem Editor geschrieben werden kann. Es beinhaltet aber noch viel mehr, denn mit Hilfe von Plugins, Filtern etc. kann das Videomaterial auch komplett mit AviSynth bearbeitet werden, so dass VirtualDub(Mod) nur die Kodierung des fertigen Films übernimmt.
Die Vorteile einer kompletten Bearbeitung mit AviSynth liegen in einer schnelleren Bearbeitung im Vergleich zu VirtualDub. Das ist einerseits auf die bessere Optimierung der Filter und andererseits auf die Verwendung des YUY2- bzw. YV12-Farbraums zurückzuführen. VirtualDub hingegen konvertiert das Bildmaterial immer nach RGB-32 falls Filter zum Einsatz kommen.

Vor allem der direkte Einsatz von YV12 führt zu einem spürbaren Geschwindigkeitsgewinn, weil das Ausgangsmaterial (MPEG2) im Normalfall immer in diesem Format vorliegt und somit ein Wechsel des Farbraums bei der Bearbeitung entfällt. Wobei es hier auch Ausnahmen gibt, die später noch erwähnt werden. Des Weiteren entfällt auch die Konvertierung von YUY2->YV12 bei der Kodierung, denn MPEG4-Codecs (z.B. DivX/XviD) arbeiten ausschließlich mit YV12. Außer auf die Geschwindigkeit wirkt sich die direkte Verwendung des YV12-Farbraums auch positiv auf die Qualität aus, denn die Konvertierung zwischen YUY2 und YV12 bzw. andersherum geschieht nicht verlustlos. Deshalb sollte so wenig wie möglich der Farbraum gewechselt werden.

In dieser Anleitung sollen aber nur die grundlegenden Schritte, die zum öffnen der Datei mit VirtualDub nötig sind behandelt werden. Wer sich weiter mit AviSynth beschäftigen will, der findet eine deutsche Anleitung im Programmordner oder kann auch jederzeit im FlaskMPEG-Forum nachfragen.

Jetzt noch DGMPEGDec, MPASource und evt. PVAStrumento in beliebige Verzeichnisse entpacken. Um das spätere Arbeiten zu erleichtern legt man für AviSynth-Plugins, wie z.B. DGDecode.dll und MPASource25.dll, am besten ein eigenes Verzeichnis an und kopiert diese dorthin. Den Pfad für die DLLs allerdings merken, der wird später noch benötigt ;-)

Anleitung

Der erste Schritt braucht nur von Besitzern einer DVB-Karte durchgeführt zu werden. Die hier aufgezeichneten Daten liegen im PVA-Format vor, weil es kein MPEG2 Standardformat ist muss es deshalb mit PVAStrumento erst zu einem gemacht werden.

Dazu einfach PVAStrumento starten, die entsprechende Datei auswählen und mit "make ps" den Vorgang starten.

Danach erscheint das folgendes Fenster:

Hier wird nur der Name für die auszugebende Datei ausgewählt, alle anderen Optionen sind im Moment nicht relevant. Jetzt "start" drücken und schon beginnt die Umwandlung.

Hier fängt die eigentliche Arbeit für alle anderen an. Zuerst wird mit DGIndex die jeweilige MPEG2-Datei geöffnet, dass geschieht mit "File" -> "Open" oder F2.
Jetzt die gewünschten Datei auswählen und mit "Öffnen" bestätigen. Handelt es sich um mehrere Dateien, wie sie z.B. von PowerVCR durch das automatische splitten erstellt werden, müssen diese im Öffnen-Dialog mit SHIFT oder STRG markiert werden. Alternativ fügt der "ADD" Button jede Datei einzeln zur Dateiliste hinzu. Entsprechend der Reihenfolge der Dateien wird ein zusammenhängender Videostream erzeugt. Zum Schluss noch mit "OK" bestätigen, damit die Datei endgültig geöffnet wird.

An den Standard-Einstellungen des Programms sind nur kleinere Änderungen nötig. Falls die Datei nicht schon im vorherigen Schritt in eine separate Bild- und Tonspur zerlegt worde, kann das hier nachgeholt werden. Denn das ist für die weitere Verarbeitung wichtig. Unter "Audio"->"Output Method"->"Demux Tracks" und unter "Track Number" die Option "Track 1" aktivieren. Was die iDCT-Algorithmen angeht, so ist "Simple MMX" der beste Kompromiss aus Qualität und Geschwindigkeit.
Mit "File" -> "Save Project" oder F4 wird zum Abschluss die d2v-Projektdatei erstellt. Beim Abspeichern wird gleichzeitig der Ton aus der MPEG2-Datei extrahiert und als *.mpa im selben Pfad gespeichert. Der Ton erhält den selben Namen wie das d2v-Projekt. Allerdings um die Bezeichnung der ausgewählten Audiospur und eine Zeitangabe erweitert, nämlich die zeitliche Verzögerung zwischen Video- und Audiospur in Millisekunden. Angenommen das Projekt heißt "Teil_1.d2v", dann heißt der Audiostream z.B. "Teil_1 T01 DELAY 182ms.mpa". Das bedeutet der Ton ist um 182ms gegenüber dem Bild versetzt. Bei positiven Werten eilt der Ton dem Bild voraus, bei negativen ist genau umgekehrt. Diese Zeitangabe wird im nächsten Schritt gebraucht.

Jetzt muss für AviSynth, mit dem Editor oder NotePad, ein entsprechendes Skript geschrieben werden, wie es unten dargestellt ist.

  1. LoadPlugin("c:\Videobearbeitung\Avisynth Plugins\DGDecode.dll")
  2. LoadPlugin("c:\Videobearbeitung\Avisynth Plugins\mpasource25.dll")
  3. video = mpeg2source("i:\pvcrwork\der_weltraum.d2v")
  4. audio = mpasource("i:\pvcrwork\der_weltraum T01 DELAY 182ms.mpa", normalize=true)
  5. DelayAudio(audio,0.182)
  6. AudioDub(video, audio)

Sämtliche Pfadangaben müssen natürlich an das eigene System angepasst werden. ;-)
Mit der ersten und zweiten Zeile werden die PlugIns mpeg2dec3dg.dll und mpasource25.dll geladen. Damit stehen die Befehle mpeg2source und mpasource zur Verfügung.
mpeg2source öffnet das DVD2AVI-Projekt und sorgt für die Dekodierung des MPEG2 Materials. Die Befehlszeile wird gleichzeitig der Variablen video zugewiesen, dass erspart einiges an Schreibarbeit im weiteren Verlauf. Hat man mehrere d2v-Projekte werden diese einfach mit dem Operanden "+" zusammengefügt:

video = mpeg2source("i:\teil_1.d2v") + mpeg2source("i:\teil_2.d2v")...

mpasource übernimmt das Einlesen der Audiodatei. Diese Befehlszeile wird wiederum einer Variablen, nämlich audio, zugeordnet. Die Option normalize bringt dabei den Ton automatisch auf die maximale Lautstärke, wenn das nicht geschehen soll einfach normalize=false eintragen. Bei mehreren MPA-Dateien gilt das selbe Schema wie oben, also:

audio = mpasource("i:\teil_1 T01 DELAY 182ms.mpa", normalize=true) + mpasource("i:\teil_2 T01 DELAY 182ms.mpa", normalize=true)

DelayAudio beseitigt die Verschiebung zwischen der Video- und Audiospur, damit diese wieder synchron zueinander sind. Hier wird die oben erwähnte Zeitangabe der MPA-Datei benötigt. In diesem Beispiel sind es 182ms, d.h. 0.182s, um die der Ton verzögert wird.
AudioDub verbindet die Video- und Audiospur zu einem kompletten Film.

Jetzt kann das Skript ersteinmal gespeichert werden. Dabei ist darauf zu achten, dass als Dateityp "Alle Dateien" ausgewählt und als Dateierweiterung "avs" eingegeben wird, also z.B. "der_weltraum.avs". Diese Datei lässt sich jetzt mit VirtualDub öffnen und dort weiterverarbeiten.

Achtung! Da beim ersten öffnen die gesamte Audio-Datei gescannt wird, dauert es mit normalize=false ~20 Sekunden und mit normalize=true ~100 Sekunden bei einer Stunde Film. Die aktuelle Version von mpasource legt im Verzeichnis des Audiostreams eine Indexdatei mit der Endung *.d2a an, sodass beim nächsten öffnen der Datei kein erneutes scannen notwendig ist.

Falls es sich um einen werbefreien Film etc. handelt ist das Skript im Prinzip schon fertig, denn das korrekte Setzen des Anfangs- bzw. Endpunkts des Films lässt sich auch mit VirtualDub erledigen. Dort können auch beliebige Filter eingesetzt werden.

Erweiterte Funktionalität

Wie Anfangs bereits erwähnt bietet eine komplette Bearbeitung in AviSynth deutliche Geschwindigkeitsvorteile. Deshalb werden an dieser Stelle noch zwei, drei häufig gebrauchte Grundfunktionen erklärt.

Handelt es sich um einen Film z.B. im 16:9 Format empfiehlt es sich die Ränder wegzuschneiden, das wird mit der Funktion crop erledigt. Es gilt dabei folgender Syntax: crop(links, oben, Ausgabebreite, Ausgabehöhe) oder crop(links, oben, -rechts, -unten). Es gibt allerdings noch ein paar Besonderheiten, die am besten an einem Beispiel zu sehen sind (Quellmaterial 720x576 Pixel):

crop(0,72,720,432) oder crop(0,72,0,-72) - schneidet oben und unten 72 Pixel weg,
crop(0,72,720,400) oder crop(0,72,0,-104) - schneidet oben 72 und unten 104 Pixel weg,
crop(0,72,720,464) oder crop(0,72,0,-40) - schneidet oben 72 und unten nur 40 Pixel weg.

Das gleiche gilt natürlich für die Bildbreite. Am besten die Ränder mit VirtualDub vorher "ausmessen", das geht am einfachsten.

Da bei MPEG2-Aufnahmen, egal aus welcher Quelle sie stammen, eine Änderung der Bildgröße unumgänglich ist, um diese korrekt auf dem PC darzustellen, wird ein Resize-Filter benötigt. Das liegt daran, dass der PAR (Pixel Aspect Ratio) ein anderer ist (PC 1:1, DVB z.B. 128:117).
Zum ändern der Bildgröße kann z.B. der Befehl BilinearResize, BicubicResize oder LanczosResize verwendet werden. Wobei die Bildqualität, d.h. die Bildschärfe, in der hier aufgeschriebenen Reihenfolge zunimmt. LanczosResize eignet sich am besten für DVB-Material. Für analoges Quellmaterial ist BicubicResize zu bevorzugen, weil selbst nach entsprechender Rauschreduktion durch die hohe Bildschärfe von LanczosResize noch vorhandene Rauschanteile wieder verstärkt oder duch die Filterung verursachte Artefakte künstlich hervorgehoben werden.

BilinearResize sollte man nur dann benutzen, wenn man das Videomaterial sehr stark komprimiert bzw. das Quellmaterial stark verrauscht ist. Genaueres zur Konfiguration der Filter findet sich in der AviSynth-Anleitung.
Die Bildgröße lässt sich am besten mit dem DivX4 BitRate Calculator oder mit dem Taschenrechner ausrechnen. Es sollte lediglich darauf geachtet werden, dass Höhe und Breite zumindest ein vielfaches von 8 sind. Der DivX4 BitRate Calculator zeigt sowohl die korrekten als auch die auf ein vielfaches gerundeten Abmaße an.

Im folgenden müssen jedoch zwei Fälle unterschieden werden:

  1. Die Aufnahme erfolgte mittel eines MPEG2-Software Encoders, wie z.B. WinDVR oder PowerVCR.
  2. Es liegt eine DVB-S/-C/-T-Aufnahme vor.

Noch eine Anmerkung zu den folgenden Beispielen. Im Normalfall wird das Bild nur einmal beschnitten und zwar vor dem Resizing. Das erfordert jedoch eine etwas aufwändigere Berechnung, damit der PAR zum Schluss noch korrekt ist. Ein Tool das die Berechnungen alle automatisch macht gibt's von incredible im Doom9-Forum.

zu 1.) Wie schon in der Anleitung zur analogen Aufnahme erwähnt besteht hier das Problem darin, dass je nach verbauten Chipsatz und Treiber der PAR nicht korrekt sein muss. Karten mit Philips-Chipsatz (SAA7134) erzeugen z.B. bei einer Auflösung von 704x576 einen korrekten PAR. Diese sollte auch unbedingt verwendet werden, um etwaige Korrekturen zu vermeiden und dient deshalb als Grundlage für die weiteren Berechnungen. An dieser Stelle nochmal der Hinweis: Wer genau nachprüfen will, ob seine Karte den richtigen PAR verwendet, sollte im Capture Guide von doom9.org unter Punkt 10 die entsprechende Anleitung durchlesen.

#Beispiel für Quellmaterial im 4:3 Format
crop(2,0,0,0)
- entfernt links zwei Pixel, das ist notwendig um auf dem PC einen korrekten PAR zu erhalten
BicubicResize(640,480) - bringt das Bild auf die endgültige Größe

#Beispiel für Quellmaterial im 16:9 Format
crop(2,72,0,-72)
- entfernt links zwei Pixel sowie vertikal die schwarzen Balken
BicubicResize(640,360) - bringt das Bild auf die endgültige Größe
crop(0,4,0,-4) - oben und unten vier Pixel entfernen => Auflösung vielfaches von 16

zu 2.) Bei einer DVB-Aufnahme hat man zum Glück keine Probleme den richtigen PAR bei der Aufzeichnung zu erhalten. Man muss nur beim abschließenden Resizing aufpassen. Die nachfolgenden Beispiele gelten für eine Aufnahmeauflösung von 720x576 Pixeln.

#Variante 1 für Quellmaterial im 4:3 Format
crop(8,0,-10,0)
- entfernt links 8 und rechts 10 Pixel, ist notwendig um auf dem PC einen korrekten PAR zu erhalten
BicubicResize(640,480) - bringt das Bild auf die endgültige Größe

#Variante 2 für Quellmaterial im 4:3 Format
BicubicResize(640,468) - bringt das Bild auf die gewünschte Größe
crop(0,2,0,-2) - macht vertikale Auflösung zum Vielfachen von 16

#Variante 1 für Quellmaterial im 16:9 Format
crop(8,72,-10,-72)
- entfernt links 8 und rechts 10 Pixel sowie vertikal die schwarzen Balken
BicubicResize(640,360) - ändert Bildgöße
crop(0,4,0,-4) - oben und unten vier Pixel entfernen => Auflösung vielfaches von 16

#Variante 2 für Quellmaterial im 16:9 Format
crop(0,72,0,-72) - entfernt vertikal die schwarzen Balken
BicubicResize(640,352)
- ganz korrekt wäre: 640 x 351

Im Gegensatz zum croppen kann man mit der Funktion AddBorders schwarze Ränder hinzufügen und so die Bildgröße auf ein vielfaches von 16 bringen. Hier gilt folgender Syntax: AddBorders(links, oben, rechts, unten). Dabei wird an den entsprechenden Bildseiten ein schwarzer Rand hinzugefügt.

#Alternative zu Variante 1 für Quellmaterial im 16:9 Format
crop(8,72,-10,-72)

BicubicResize(640,360) - korrektes Seitenverhältnis
AddBorders(0,4,0,4) - Es wird oben und unten ein schwarzer Rand von 4 Pixeln hinzugefügt. Die Höhe ist wieder durch 16 teilbar. Die Bildgröße beträgt somit 640x368 Pixel.

Im Normalfall sollte man allerdings besser croppen, da an den "harten" Übergängen zwischen Bild und Balken, je nach Stärke der Kompression, unschöne Artefakte im Bild auftreten können.

Enthält das Material mehrere Werbeszenen, so können diese wesentlich bequemer mit AviSynth herausgeschnitten werden. Deshalb die AVS-Datei mit VirtualDub öffnen und die entsprechenden Anfangs- bzw. Endbilder des jeweiligen Abschnitts notieren. Zum schneiden wird der Befehl trim verwendet. Der Syntax lautet: trim(Anfangsbild, Endbild). Wie schon erwähnt werden auch hier die verschieden Teilstücke durch "+" aneinandergehängt. Somit erhält VirtualDub den komplett geschnittenen Film.

trim(0,9999) + trim(15000,25000)+...

Zum Schluss noch zwei komplette Beispielskripte:

  • LoadPlugin("c:\Videobearbeitung\Avisynth Plugins\DGDecode.dll")
  • LoadPlugin("c:\Videobearbeitung\Avisynth Plugins\mpasource25.dll")
  • video = mpeg2source("i:\teil_1.d2v")
  • audio = mpasource("i:\teil_1 T01 DELAY 182ms.mpa", normalize=true).DelayAudio(0.182)
  • AudioDub(video, audio)
  • crop(0,72,720,432)
  • BicubicResize(640,352)
  • trim(0,32625) + trim(40875,87575)

Skript 2 mit mehreren Quelldateien und unterschiedlichen Delaywerten der einzelnen Audiostreams.

  • LoadPlugin("c:\Videobearbeitung\Avisynth Plugins\DGDecode.dll")
  • LoadPlugin("c:\Videobearbeitung\Avisynth Plugins\mpasource25.dll")
  • video = mpeg2source("i:\teil_1.d2v") + mpeg2source("i:\teil_2.d2v")
  • audio1 = mpasource("i:\teil_1 T01 DELAY 182ms.mpa", normalize=true).DelayAudio(0.182)
  • audio2 = mpasource("i:\teil_2 T01 DELAY -137ms.mpa", normalize=true).DelayAudio(-0.137)
  • audio = audio1+audio2
  • AudioDub(video, audio)
  • crop(0,72,720,432)
  • BicubicResize(640,352)
  • trim(0,32625) + trim(40875,87575)

Wichtig! Sollen in VirtualDubMod keine Filter benutzt werden, sondern lediglich die Kompression erfolgen, so ist unbedingt unter "Video" die Option "Fast recompress" auszuwählen. Denn nur so wird der Datenstrom direkt im YUY2- oder YV12-Format zum Videokompressor weitergeleitet. Wird hingegen "Full processing mode" aktiviert ist fast der ganze Geschwindigkeitsvorteil von AviSynth dahin, weil VirtualDub erst eine Konvertierung nach RGB-32 vornimmt, was wiederum Zeit kostet.

Zum Schluß noch ein paar Bemerkungen. Die hier beschriebenen Funktionen von AviSynth sind nur ein kleiner Einblick in die Vielfalt der Anwendungsmöglichkeiten. Jeder der sich näher damit befassen möchte sollte auf jeden Fall die Original-Anleitung lesen. Weitere Infos und Plugins gibt's natürlich in Hülle und Fülle im Internet, hier ein paar Links:

So, das war's erstmal. Fragen oder Verbesserungsvorschläge einfach mailen bzw. im Forum bei Flaskmpeg.info posten.

Letzte Änderung: 30.12.2005