Video-CDs und Super-Video-CDs unter Linux erstellen

Aus LinuxUser 08/2002

Video-CDs und Super-Video-CDs unter Linux erstellen

Futter für den DVD-Player

Mit Xawtv, den Mjpegtools und dem GNU VCD-Imager sind alle Werkzeuge zur Aufnahme eines Films über die TV-Karte und die anschließende Erstellung von (S)VCDs vorhanden. Allerdings ist die Zahl der beteiligten Programme und mehr noch deren Parametervielfalt für den Einsteiger verwirrend. Wir beschreiben die Vorgehensweise Schritt für Schritt.

Das DivX-Format zur Kompression von Video-Sequenzen und zur platzsparenden Archivierung von DVDs wird zur Zeit landauf, landab als das Video-Pendant des erfolgreichen MP3-Audio-Formats gefeiert. Allerdings haben die so gespeicherten Videos den Nachteil, dass man sie nur am PC anschauen kann, wo noch weniger Kino-Atmosphäre aufkommt als vor dem heimischen Fernseher.

Gleichzeitig hält jedoch in immer mehr Wohnzimmern ein DVD-Spieler Einzug. Auch wenn das Brennen von DVDs zur Zeit noch am Format-Wirrwarr und den hohen Preisen für Brenner und Rohlinge krankt, so können doch die meisten DVD-Spieler Video-CDs (VCD) und Super-Video-CDs (SVCD) wiedergeben. Bei diesen handelt es sich um normale CDs, die neben einem Mode-2-ISO9660-Track mit dem Inhaltsverzeichnis einen oder mehrere MPEG-Tracks mit den Audio- und Video-Streams im Multiplex-Verfahren enthalten.

Tabelle 1: Video-CD-Formate

  VCD-Format 1.2 (PAL) SVCD-Format 1.0 (PAL)
Auflösung@Wiederholrate: 352×288@25fps 480×576@25fps
Audio-Codec: MPEG-1 Layer 2 MPEG-1 Layer 2
Audio-Bitrate: 224 kbit/s (fest) 32-224 kbit/s (fest oder variabel)
Video-Codec: MPEG-1 MPEG-2
Video-Bitrate: 1152 kbit/s (fest) maximal 2500 kbit/s (variabel)

VCDs und SVCDs sind insbesondere in Asien weit verbreitet. An den kleinen Ständen der fliegenden Händler auf den dortigen Märkten finden sich die neuesten Filme aus Hollywood schlecht abgefilmt, schlecht MPEG- kodiert und auf mehr oder weniger zuverlässige Rohlinge gebrannt. Damit wurde dem Ansehen dieser Formate sowohl bei den Konsumenten als auch bei der Industrie einiger Schaden zugefügt, so dass VCD- und SVCD-Player in Europa aus Furcht vor Raubkopien erst gar nicht auf dem Markt erschienen. Dabei übertrifft eine SVCD mit maximaler Video-Datenrate die von VHS-Aufnahmen gewohnte Qualität deutlich. Je nach Dynamik des Inhalts und Kompressionsparameter passen bis zu 75 Minuten auf einen 700-MB-Rohling (das entspricht 800 MB MPEG-Daten, da MPEG2-Form-2-Tracks wesentlich weniger Redundanz-Information für die Fehlerkorrektur enthalten). Allerdings fallen bei Video-Bitraten unterhalb von 1700 kbit/s die Artefakte aus der MPEG-Kompression zunehmend ins Auge. Damit ist jedoch klar, dass bei einem Spielfilm von 90 Minuten und mehr am fliegenden Wechsel der SVCD kein Weg vorbei führt.

Voraussetzungen

Als Hardware genügt ein normaler PC mit einer CPU der Gigahertz-Klasse und einer vom bttv-Treiber [1] unterstützten TV-Karte. Will man einen 90-Minuten-Spielfilm ohne Komprimierung auf der Festplatte ablegen, so sind dafür mindestens 60 GB erforderlich. Die verwendete Platte sollte möglichst schnell sein, also mindestens 2 MB internen Cache und eine Drehzahl von mindestens 7200 UPM aufweisen, bei Beschränkung auf das VCD-Format genügt allerdings deutlich weniger. Als Filesystem für die Zwischenspeicherung der Video-Daten empfiehlt sich das gute alte Ext2 – Journaling-Dateisysteme oder LVM bedeuten eher eine Verschlechterung der Performance.

Die TV-Karte wird ja inzwischen bei den meisten aktuellen Distributionen bei der Installation konfiguriert (z. B. bei SuSE seit Version 7.3 mit YaST 2). Man sollte aber durch geeignete Einstellungen im BIOS oder notfalls durch die Wahl eines anderen PCI-Steckplatzes für die TV-Karte dafür sorgen, dass der bttv-Treiber über einen eigenen, ungeteilten Interrupt verfügt. Auch die Soundkarte sollte keinesfalls den Interrupt mit dem Controller der Festplatte teilen, sonst kann es bei schlechten Mainboards oder zu optimistischen BIOS-PCI-Einstellungen zu Bild- oder Tonstörungen während des Festplattenzugriffs kommen.

Aufnahme mit xawtv

Gerd Knorrs xawtv ist als mächtiges und stabiles Fernsehprogramm mittlerweile ein Standard und in vielen Distributionen enthalten. Das xawtv-Paket wird ständig weiterentwickelt, und es erscheinen in schneller Folge neue Versionen [2], die aktuellen SuSE-RPM-Pakete finden sich unter [3]. Seit Version 3.6.8 unterstützt das Aufnahmemodul streamer neben diversen Quicktime- und AVI-Formaten auch ein YUV-Ausgabeformat (yuv4mpeg), welches von den gerade in Version 1.6.0 erschienenen mjpegtools[4] direkt verarbeitet werden kann. YUV steht dabei für ein bei der Fersehübertragung verwendetes Farbkoordinatensystem, in dem Y das Helligkeitssignal (Luminanz) und U und V die Farbinformation (Chrominanz) beinhalten.

Um während der Aufnahme auf die Festplatte möglichst wenige Frames zu verlieren, ist es wichtig, über die Parameter des bttv-Kernelmoduls nicht nur die verwendete Karte anzugeben (im Beispiel unten eine Hauppauge WinTV mit Bt848-Chip), sondern auch über den Parameter gbuffers die Zahl der Capture-Buffers von 2 auf z. B. 16 zu erhöhen. Der entsprechende Eintrag in der Datei /etc/modules.conf sieht so aus:

options bttv    card=2 gbuffers=16

Je nach verwendeter Hardware muss der card-Parameter angepasst werden, und es können weitere für z. B. Radio oder Stereo-Dekoder notwendig sein.

Als Audio-Aufnahmequelle muss der Eingang im Mixer selektiert werden, der mit dem Line-Out-Ausgang der TV-Karte verbunden ist.

Abbildung 1: Zur Vermeidung von Stummfilmen muss der mit der TV-Karte verbundene Audio-Eingang (im Beispiel Line1) im Sound-Mixer als Aufnahmequelle selektiert sein (rote Markierung unter dem Regler)

Abbildung 1: Zur Vermeidung von Stummfilmen muss der mit der TV-Karte verbundene Audio-Eingang (im Beispiel Line1) im Sound-Mixer als Aufnahmequelle selektiert sein (rote Markierung unter dem Regler)

Die Aufnahme direkt aus dem xawtv-GUI ist zwar möglich, aber man ist dort auf bestimmte Seitenverhältnisse beschränkt. Die VCD- und SVCD-Formate werden nicht direkt unterstützt, so dass man zur Aufnahme mit höherer Auflösung (Verschwendung von IO-Bandbreite und Plattenplatz) und anschließender Skalierung (Verschwendung von Rechenzeit) gezwungen wird.

Abbildung 2: Der Aufnahmedialog von xawtv ist vom Hauptfenster aus über die Taste "R" oder den Menü-Eintrag "Record a movie (avi)" zu erreichen

Abbildung 2: Der Aufnahmedialog von xawtv ist vom Hauptfenster aus über die Taste “R” oder den Menü-Eintrag “Record a movie (avi)” zu erreichen

Verzichtet man auf die Annehmlichkeiten des GUI, kann man das eigentliche Aufnahmeprogramm streamer gleich mit der richtigen Auflösung von der Kommandozeile aus aufrufen:

streamer -o /image/cap.yuv -O /image/cap.wav  -f 4mpeg -F stereo -r 25 -s 352x288 -n pal -i Composite1 -t 01:15:00 > streamer.log 2>&1

Streamer-Parameter

Parameter Erklärung
-o /image/cap.yuv Ausgabedatei für die Video-Information im YUV-Format
-s 352×288 Auflösung 352×288 Pixel (VCD) bzw. 480×576 Pixel (SVCD)
-i Composite1 Video-Quelle Composite1-Eingang, alternativ: -i Television für den TV-Tuner
-f 4mpeg Ausgabe-Format yuv4mpeg für die mjpegtools 1.6.0
-r 25 Bildwiederholrate: 25 Bilder pro Sekunde
-n pal Videonorm PAL
-O /image/cap.wav Ausgabedatei für die Audio-Information im WAV-Format
-F stereo Stereo-Ton, muss von der TV-Karte unterstützt werden
-t 01:15:00 75 Minuten Aufnahme (kann jederzeit vorzeitig durch Control-C abgebrochen werden

Audio-MPEG-Kodierung

Die Kompression der WAV-Datei nach MPEG-1 Layer 2 mit einer Bitrate von 224 kbit/s kann mit einem beliebigen Encoder erfolgen, hier als Beispiel die Parameter für toolame[5]:

toolame -b 224 -p 2 -m s cap.wav cap.mp2

Der in den mjpegtools enthaltene mp2enc entspricht weitgehend der Referenz-Encoder-Implementierung des MPEG-Konsortiums. Er ist deutlich langsamer als aktuelle, hochoptimierte Encoder wie lame, toolame oder notlame.

Kompilieren der mjpegtools

Das Neukompilieren der mjpegtools lohnt sich auch dann, wenn sie in der verwendeten Linux-Distribution schon enhalten sein sollten. Durch das Ausloten und exzessive Nutzen der auf dem Zielsystem verfügbaren Befehlssatz-Erweiterungen (MMX, 3DNow! oder SSE) kann das Eigenkompilat mehr als doppelt so schnell laufen wie eine Standard-Pentium-Version aus der Distribution. Dazu sollte das Paket nasm nachinstalliert werden. SuSE-Benutzer finden es bei YaST 1 in der Serie d (development) und bei YaST 2 unter Entwicklung/Programmiersprachen/Andere. Freunden der Kommandozeile genügt ein simples rpm -i nasm.rpm im entsprechenden Unterverzeichnis der Installationsquelle; für Anwender anderer Distributionen gibt es auf der Heft-CD die Quelltexte.

Nachdem Sie die Datei mjpegtools-1.6.0.tar.gz von Sourceforge [4] heruntergeladen oder von der Heft-CD kopiert haben, packen Sie das Archiv aus und wechseln in das neu angelegte Verzeichnnis mjpegtools-1.6.0. Die Übersetzung erfolgt dann als root im üblichen Dreierschritt

./configure
make
make install

Falls nichts anderes angegeben wird, werden die ausführbaren Programme nach /usr/local/bin kopiert.

Video-MPEG-Kodierung und Erzeugen des (S)VCD-Image

Im nächsten Schritt muss mit dem Programm yuvscaler das Video auf VCD- bzw. SVCD-Auflösung skaliert werden, falls es nicht bereits entsprechend aufgenommen wurde. Danach komprimiert mpeg2enc die Videoinformation gemäß MPEG, anschließend werden die getrennten Audio- und Video-Streams vom Multiplexer mplex zusammengeführt. All diese Programme sind Teil der mjpegtools. Zum Schluss schreibt der GNU-VCD-Imager vcdimager[8] den kompletten MPEG-Datenstrom zusammen mit den notwendigen Header-Informationen in zwei Dateien (videocd.cue und videocd.bin). Die letzte als stabil gekennzeichnete Version 0.6.2 liefert jedoch beim Schreiben von SVCDs gelegentlich folgende Fehlermeldung:

(assert (_vcd_salloc_get_highest (obj->iso_bitmap) + 1 == 225))

Diese tritt bei Verwendung der Entwicklerversion 0.7.7 nicht mehr auf. Hier sind die zur Erstellung eines kompletten VCD-Image notwendigen Schritte:

cat cap.yuv | yuvscaler -O VCD | mpeg2enc  -f 1 -I 0 -S 800 -B 224 -N -s -o cap.m1v
mplex -v 1 -f 1 -S800 cap.mp2 cap.m1v -o cap%d.mpg
vcdimager cap1.mpg

Tabelle 3: Allgemeine und VCD-spezifische Parameter

Programm Parameter Erklärung
mpeg2enc,mplex -f 1 VCD 2.0 Standardeinstellungen, abweichende Parameter werden ignoriert
yuvscaler -O VCD skaliert den Video-Datenstrom auf VCD-Auflösung (-O SVCD für SVCDs)
mpeg2enc,mplex -o Name der Ausgabedatei, %d ist Platzhalter für den laufenden Datei-Index
mpeg2enc -I 0 Ohne Deinterlacing läuft der Encoder wesentlich schneller.
mpeg2enc -B 224 Audio-Bitrate in kbit/s
mpeg2enc,mplex -S 800 Nach 800 MB (einschließlich Audio entsprechend -B) wird eine neue MPEG-Sequenz gestartet. mplex beginnt eine neue Ausgabedatei, wobei der laufende Index anstelle des Platzhalters %d im Namen inkrementiert wird.
mpeg2enc -N Schneidet hohe Frequenzen ab und dient so als leichte Rauschunterdrückung. Die volle Auflösung erreicht man mit -h statt -N.
mpeg2enc -s Erzeugt einen Sequenz-Header vor jeder Bildergruppe (GOP). Manche DVD-Player brauchen das für den schnellen Vor- und Rücklauf
mplex -v 1 Liefert neben Warnungen und Fehlern zusätzliche Informationen

Da bei einer SVCD die Video-Information mit variabler Bitrate komprimiert wird, sind zusätzliche Angaben notwendig. Hier sind die zur Erstellung eines kompletten SVCD-Image notwendigen Schritte:

cat cap.yuv | mpeg2enc  -f 4  -q 12 -I 0 -g 6 -G 18 -V 230 -S 800 -B 224 -N -s -o cap.m2v
mplex -v 1 -f 4 -b 230 -S800 -V  -o cap%d.mpg cap.m2v cap.mp2
vcdimager -t svcd cap1.mpg

Tabelle 4: SVCD-spezifische Parameter

Programm Parameter Erklärung
mpeg2enc,mplex -f 4 SVCD-Standardeinstellungen, abweichende Parameter werden ignoriert
mpeg2enc -q 12 Die Quantisierung bestimmt die Encoder-Genauigkeit. Je kleiner der Wert, desto präziser arbeitet der Encoder. Gleichzeitig gehen jedoch Rechenzeit und Dateigröße drastisch in die Höhe. Möglich sind Werte zwischen 2 und 31. Werte zwischen 8 und 12 liefern gute Resultate.
mpeg2enc -g, -G Bestimmt die minimale und maximale Größe einer Bildergruppe (GOP) im Daten-Stream. Sind diese Werte verschieden, versucht mpeg2enc, Szenenwechsel und I-Frames (Vollbilder) zu synchronisieren.
mpeg2enc -V 230 Größe des Dekoder-Video-Buffer laut SVCD-Standard. Kann für Software-Dekoder weiter erhöht werden.
mplex -b 230 Größe des Dekoder-Video-Buffer
mplex -V Variable-Bitrate-Multiplexing ist für SVCD erforderlich.
vcdimager -t svcd erzeugt einen SVCD-konformen Header (default: VCD)

Um ein Gefühl für die Auswirkung der einzelnen Parameter zu bekommen, zeigt Abbildung 3 die Größe der MPEG-2-Videodatei des Films “Lola rennt” für verschiedene Quantisierungswerte und in Abhängigkeit von der Verwendung der Parameter -N oder -h. Kennt man die Laufzeit des Films und die Größe des Audio-Streams (im Beispiel 72 MB), kann man vor der rechenintensiven Video-Komprimierung die Parameter so wählen, dass die fertige MPEG-Datei mit 800 MB gerade noch auf einen 80-Minuten-Rohling passt (im Beispiel -N -q 12). Für andere Laufzeiten muss man entsprechend umskalieren.

Abbildung 3: Größe der MPEG-2-Ausgabedatei von "Lola rennt" (Laufzeit 72 Minuten) in Abhängigkeit von den Parametern -q (Quantisierung), -N (Abschneiden hoher Frequenzen) und -h (High Resolution)

Abbildung 3: Größe der MPEG-2-Ausgabedatei von “Lola rennt” (Laufzeit 72 Minuten) in Abhängigkeit von den Parametern -q (Quantisierung), -N (Abschneiden hoher Frequenzen) und -h (High Resolution)

Brennen der (S)VCD

Zu guter Letzt wird das Image mit dem Programm cdrdao[9] auf einen Rohling geschrieben. Die Parameter im folgenden Beispiel gelten für einen Yamaha CDR-400t (Treiber generic-mmc) am SCSI-Adapter 0 mit der SCSI-ID 4, LUN 0.

cdrdao write --device 0,4,0 --driver generic-mmc videocd.cue

Fazit

xawtv 3.74 bietet im Zusammenspiel mit den mjpegtools 1.6.0 einen zuverlässigen, flexiblen, qualitativ hochwertigen und schnellen Weg, eigene VCDs oder SVCDs zu produzieren. Insbesondere die mjpegtools müssen, was Qualität und Geschwindigkeit betrifft, den Vergleich mit der kommerziellen Konkurrenz unter Windows nicht scheuen, vom Preis ganz zu schweigen. Allenfalls das Fehlen einer grafischen Benutzeroberfläche stellt eine nicht zu unterschätzende Hürde dar.

Um die man-Page von mpeg2enc zu zitieren: MPEG ist ein “barocker” Standard. Er ist mit Parametern und Optionen überladen, die es dem Einsteiger schwer machen, auf Anhieb gute Ergebnisse zu erzielen oder einen Kompromiss zwischen Qualität und Dateigröße zu finden. Mit den vorgestellten Informationen sollte es jedoch kein Problem sein, diese Komplexität in einem Skript oder hinter einer Benutzeroberfläche mit vernünftigen Voreinstellungen und Parameter-Profilen zu verbergen.

Alternative: Aufnahme mit nuppelvideo/exportvideo

Das Projekt Nuppelvideo[10] von Roman Hochleitner stellt deutlich geringere Hardware-Anforderungen. Die Videodaten können seit der Version 0.5.2 ohne Kompression im NUV-Format abgespeichert werden. Das Aufnahmeprogramm nuvrec nutzt dabei eine andere Strategie als xawtv, um die Synchronisation von Bild und Ton zu gewährleisten. Für jeden empfangenen Frame wird ein Interrupt generiert, der dafür notwendigen Parameter für das bttv-Modul heißt fieldnr=1. Nuppelvideo erwartet deshalb unter anderem folgende bttv-Parameter in /etc/modules.conf:

options bttv    fieldnr=1 gbuffers=2

Das Programm exportvideo[11] von Alexander Olezant konvertiert die Video-Information in das YUV-Format, das dann von den mjpegtools wie oben beschrieben weiterverarbeitet werden kann. Leider zerlegt nuvrec die Video-Information in 2GB große Dateien, obwohl die 2GB-Grenze für Dateien unter Linux schon lange gefallen ist. Um dies zu korrigieren, muss der Code für diese Aufteilung im Quelltext von nuvrec.c entfernt werden (es genügt dafür, nach MAXBYTES zu suchen). Danach müssen nuvrec, nuvplay und exportvideo mit den den C-Definitionen -D_LARGEFILE_SOURCE und -D_FILE_OFFSET_BITS=64 neu kompiliert werden [6].

Die Instruktions-Folge zur Erstellung einer VCD mit Nuppelvideo sieht nach diesen Patches so aus:

nuvrec -r -S1 -W352 -H288 cap
# -r: Raw - Ohne Kompression
# -S1: Quelle Composite-Eingang der TV-Karte
# -W: Width  - Horizontale Aufloesung
# -H: Heigth - Vertikale Aufloesung
nuvplay -e cap.nuv | toolame -b 224 -p 2 -m s /dev/stdin cap.mp2
# -e: extrahiere Audio-Informationen
exportvideo cap.nuv "| mpeg2enc  -f 1 -I 0 -S 800 -B 224 -N -s -o cap.m1v"
mplex -v 1 -f 1 -S800 cap.mp2 cap.m1v -o cap%d.mpg
vcdimager cap1.mpg

Für die Aufnahme einer SVCD muss nur die Auflösung geändert werden, die weitere Verarbeitung geschieht wieder mit den mjpegtools:

nuvrec -r -S1 -W480 -H576 cap
nuvplay -e cap.nuv | toolame -b 224 -p 2 -m s /dev/stdin cap.mp2
exportvideo cap.nuv "| mpeg2enc  -f 4  -q 12 -I 0 -g 6 -G 18 -V 230 -S 800 -B 224 -N -s -o cap.m2v"
mplex -v 1 -f 4 -b 230 -S800 -V  -o cap%d.mpg cap.m2v cap.mp2
vcdimager -t svcd cap1.mpg

Leider weisen Bild und Ton bei Nuppelvideo meistens einen Versatz von mehr als einer Sekunde auf. Zwar kann im Mplex-Schritt über den Parameter -O ein Offset gesetzt werden, um die Synchronität zu erzwingen. Allerdings kann man den genauen Versatz nur durch wiederholtes Ausprobieren verschiedener Werte und Anschauen der resultierenden MPEG-Datei mit einem beliebigen MPEG-Software-Player, wie z.B. mit xine[12] herausfinden.

xine cap1.mpg

Infos

[1] bttv-Treiber: http://bytesex.org/bttv/

[2] xawtv-3.7.4: http://bytesex.org/xawtv/

[3] SuSE-xawtv-rpms: http://www.suse.de/~kraxel

[4] mjpeg-tools 1.6.0: http://mjpeg.sourceforge.net

[5] toolame Audio MPEG encoder: http://sourceforge.net/projects/toolame

[6] Linux Large File Support: http://www.suse.de/~aj/linux_lfs.html

[7] Netwide Assembler: http://freshmeat.net/projects/nasm

[8] vcdimager: http://www.vcdimager.org/

[9] cdrdao: http://cdrdao.sourceforge.net

[10] Nuppelvideo 0.5.2a: http://mars.tuwien.ac.at/~roman/nuppelvideo/

[11] Exportvideo.7e-pre9: http://131.130.199.155/~aoe/mystuff/mpeg2_movie-avipatch/

[12] Xine: http://xine.sourceforge.net

Der Autor

Armin Burkhardt kam als promovierter theoretischer Chemiker auf Umwegen in die IT-Branche. Er hat 1993 seinen ersten Linux-Kernel mit der Versionsnummer 0.99pl13 installiert. Seit dieser Zeit betreut er am Max-Planck-Institut für Festkörperforschung in Stuttgart mit seinen Kollegen im IT-Support Linux und kommerzielle Unix-Varianten. Dank Samba kommen dort auch Windows-Rechner nicht zu kurz.

LinuxUser 08/2002 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben