Linux NetMag #5
Titel: Linux als Videorecorder
URL: http://www.linuxnetmag.de/de/issue5/m5video1.html

Linux als Videorecorder Falls Sie eine TV-Karte besitzen, aber keinen Videorecorder haben, oder wenn Sie schon immer Ihren Lieblingsfilm auf CD brennen wollten, sollten Sie unbedingt weiterlesen...


 

Linux & Multimedia

Wer professionelle Video-Bearbeitung machen will, stößt schnell an die Grenzen von Linux und GPL.
Die bisher unterstützten MPEG-Karten lassen sich an einer Hand abzählen, und auf Softwareseite existiert als einziger halbwegs brauchbarer Kandidat das Programm MainActor.

Aber wer kann sich schon eine 1000DM teure MPEG-Karte leisten?
Wie so häufig kann man dies (wenn auch nur eingeschränkt) unter Linux kostengünstig haben, wenn man den Aufwand nicht scheut.

Eine TV-Karte, eine große mittelschnelle Festplatte (es muß nicht unbedingt SCSI sein), einige GPL-Programme und viel Geduld bringen einen zum gleichen Ziel.
Seit sich Linux immer stärker auch dem Desktop widmet, wächst das Interesse an Multimedia-Programmen. Während in der Anfangszeit des Betriebssystems hauptsächlich Textverarbeitungen und Netzwerktools den Linux-Software-Markt beherrschten, erscheinen mit zunehmender PC-Leistung und Desktop-Orientiereung der Linux-Benutzer immer mehr Multimedia-Programme.

Wer noch vor ca. zwei Jahren unter Linux MPEG-Videos erzeugen wollte, kam um die Berkeley-Tools nicht herum. Mit diesen Programmen mußte man sein Video zuerst in Einzelbilder zerlegen, dann jedes einzelne Bild berechnen lassen und abschließend zu einem MPEG-Stream zusammensetzen.
Zum Schluß mußte man dann noch den Sound in MPEG umwandeln und beide Streams zusammenfügen.
Ob nach diesem Aufwand Bild und Ton noch synchron sind, ist eher Glückssache gewesen.

Die Software

Mittlerweile existiert eine recht komfortable Alternative, um MPEG-Videos zu erzeugen. Wir benutzen hier die Programme Broadcast2000, mpeg2_movie und XMovie, die alle drei vom Programmierer Adam Williams stammen.

Aufgenommen wird das Video mittels Bcast2000 im Quicktime-Format, die Umwandlung von Quicktime in MPEG2 erfolgt mittels der Tools des mpeg2_movie-Pakets und um das entstandende Werk anschauen zu können, benötigt man noch einen MPEG2-Player (die bei Distributionen normalerweise mitgelieferten Player unterstützen nur MPEG1). Hierfür benutzen wir XMovie.

Wie das Zusammenspiel der einzelnen Programme im Detail aussieht, ist allerdings etwas komplizierter, als man auf den ersten Blick erwartet...

Broadcast2000

Broadcast besitzt (wie viele andere Linux-Programme auch) die Fähigkeit Bild und Ton einer TV-Karte aufzunehmen.
Im Unterschied zu den anderen Programmen, wie z.B. kWinTV, wird das Video-Signal allerdings nicht im AVI-, sondern im Quicktime-Format abgespeichert.
Dies ist mittlerweile möglich, da die Quicktime-Libraries seit einiger Zeit nun auch unter GPL vertrieben werden.

Abhängig von der Leistungsfähigkeit Ihres PC's (speziell von der Schnelligkeit der Festplatte) ist eine obere Grenze für den Datenfluß beim Abspeichern gegeben. Leider erreicht man diese Grenze beim Abspeichern von Video-Dateien recht schnell, da dies mit einem hohen Datenfluß verbunden ist.

Deshalb ist nur eine maximale Auflösung bei der Video-Aufnahme möglich, weil oberhalb dieser es zu Fehlern in der Aufnahme kommt, die sich zumeist in fehlenden Bildern auswirken. Diese obere Grenze ist jeweils abhängig von dem PC an dem Sie arbeiten und sollte individuell herausgefunden werden.

Vor der Benutzung von Broadcast2000 als Videorecorder ist es erstmal notwendig, die Fernsehsender, welche Sie später aufnehmen wollen, einzuprogrammieren.

Dies geschieht, indem Sie den Aufnahme-Knopf drücken:

Aufnahmeknopf

In dem erscheinenden Fenster benutzen Sie einen beliebigen Dateinamen, wo testweise die Video-Datei später abgespeichert werden soll (z.B. /tmp/tmp.mov).

Aktivieren Sie den Knopf 'Render audio tracks' und 'Render video tracks' und drücken Sie auf OK.
Nun erscheint ein weiteres Fenster (möglicherweise auch zwei). Falls er nicht schon gedrückt ist, drücken Sie jetzt den Knopf 'Monitor Video'. Spätestens jetzt erscheint ein Fenster, in dem das Signal Ihrer TV-Karte angezeigt wird. Normalerweise sollten Sie hier nur Rauschen sehen, da noch keine Programme eingestellt wurden. Mit dem oberen linken Knopf in diesem Fenster, kommen Sie zu einem weiteren Fenster, in dem Sie die Programme einstellen können. Mit dem Menüpunkt 'Add' erscheint nun noch ein Fenster, bei dem Sie die Quelle, noch weiter spezifizieren müssen:

Broadcast Einstllungen

Das Finetuning geschieht noch per Hand und es gibt auch keine automatische Sendersuche, so daß es schon etwas dauern kann, bis man alle Kanäle beisammen hat.
Merken Sie sich genau den Namen (besonders Groß- und Kleinschreibung) der Sender, den Sie den einzelnen Sendern geben, da Sie später diesen Namen zum Aufnehmen benötigen, um den richtigen Sender anzusteuern.

Sind alle Sender eingestellt, können Sie mit dem Aufnehmen des Videos beginnen. Wählen Sie dafür den gewünschten eingespeicherten Sender aus, deaktivieren Sie die Darstellung des Videosignals (Button: 'Monitor Video') und drücken Sie auf den roten Aufnahmeknopf.
Beachten Sie, wieviele Frames bei der Aufnahme verloren gehen (zu sehen unter 'Frames behind'):

Aufnahme

Hier sollte ein Zahlenwert von nicht mehr als konstant 1 bis 2 Frames angezeigt werden.
Falls die Zahl ständig wachsen sollte, ist der PC dem Datenstrom nicht gewachsen, und Sie müssen eine niedrigere Auflösung oder Framerate einstellen. Dies geschieht im Broadcast2000 Hauptfenster in den Menüpunkten
Video -> Frame rate und
Video -> Resize

Gängige Auflösungen sind hierbei:

Auflösungen
160x120
192x144
320x240
384x288
400x300
640x480
768x576

Die Framerate sollte dabei zwischen 15 bis zu 24 Bildern pro Sekunde liegen.
Das aufgenommene Video kann man sich dann nach Beenden der Aufnahme und Drücken auf den Save-Knopf anschauen, wenn man den Play-Knopf im Broadcast2000 Hauptfenster drückt (Der Menüpunkt Window -> Show Video muß dafür auch aktiviert sein).
Nun sollten Sie ausprobieren, was Ihrem Geschmack am ehesten entgegenkommt: Hohe Auflösung mit leicht ruckelnden Bildern, oder lieber mehr Bilder pro Sekunde, dafür aber eine kleinere Auflösung.
Wenn Sie das Maximum herausgefunden haben, was Ihr PC gerade noch verarbeiten kann, schreiben Sie sich die Werte (Framerate und Auflösung) auf, und beenden Sie Broadcast.

An meinem Rechner (K6-400 mit IBM-Festplatte) habe ich mich für eine Auflösung von 320x240 und einer Framerate von 15 Fps entschieden, was zwar nicht überragend, aber durchaus nutzbar ist.

Das Video kann natürlich, wie eben geschehen, per Hand aufgenommen werden, viel effektiver ist es hingegen, die Aufnahme mittels eines Skriptes zu starten, was nämlich von Bcast2000 auch unterstützt wird.
Ein solches Skript sollte dann folgendermaßen aussehen:

record_scipt
(new_project)                 # starte ein neues Projekt
(set_atracks 1)               # Anzahl der Audio-Spuren
(set_vtracks 1)               # Anzahl der Video-Spuren
(set_channels 1)              # 
(set_samplerate 48000)        # Rate der Sound-Aufnahme
(set_framerate 15)            # Frame-Rate
(set_trackw 320)              # Bild-Breite
(set_trackh 240)              # Bild-Höhe
(set_outputw 320)             # Höhe des ausgegebenen Bidles 
(set_outputh 240)             # Breite   -----
(set_aspectw 4)               # Seitenverhältnis
(set_aspecth 3)               #
(ok)                          # 
(record)                      # Aufnahme starten
(set_channel Pro7)            # der Sendernamen
(set_path /tmp/aufnahme.mov)  # Dateinamen zur Aufnahme
(set_audio 1)                 # Audio Aufnehmen
(set_video 1)                 # Video Aufnehmen
(set_format Quicktime)        # Datei-Format
(set_audio_compression IMA4)  # Audio-Kompression
(set_audio_dither 0)          #
(set_audio_signed 1)          #
(set_audio_channels 1)        # 
(set_video_compression JPEG)  # Video-Kompression
(set_video_quality 80)        # Qualitaet der Kompression
(ok)                          #
(set_mode timed)              # nur begrenzte Zeit aufnehemen
(set_duration 1200)           # Aufnahmedauer in Sekunden
(set_monitor_audio 0)         # Ton nicht darstellen
(set_monitor_video 0)         # Bild nicht darstellen
(start_recording)             #
(ok)      		      #

download Skript

Um jetzt die Aufnahme vollautomatisch zu starten, genügt ein Aufruf der Form

>> /path/to/bcast2000.sh -b /path/to/record_script
Bcast2000 arbeitet dann das Skript ab, öffnet das Aufnahmefenster mit den jeweiligen Einstellungen und beginnt mit der Aufnahme.
Ist die Aufnahmezeit dann abgelaufen, beendet sich Broadcast allerdings nicht automatisch, sondern stoppt nur die Aufnahme. Das Abspeichern der Datei und das Beenden von Broadcast muß immer noch vom Benutzer per Hand geschehen (dies ist sehr nachteilig für eine vollautomatische Aufnahme, wie wir später noch sehen werden...)

Da Linux kein Echtzeitbetriebssystem ist, kann es leider immer wieder vorkommen, daß während der Aufnahme andere Programme mit anspringen (z.B. gestartet durch einen Cron-Job) und somit die vom PC bewältigte Framerate plötzlich absinkt.
Einzige Lösung hierfür ist nur, alle anderen Programme, die nicht dringend benötigt werden, zu stoppen.
Ein anderes Problem bei der Aufnahme ist, daß man nicht beliebig lange im Quicktime-Format aufnehmen kann, da die erzeugte MOV-Datei schnell die maximal erlaubte Dateigröße des ext2-Dateiformats erreicht.
Abhilfe schafft hier die Benutzung eines anderen Dateisystems (z.B. ext3 oder besser ReiserFS), wovon aber unerfahrenen Linux-Benutzern dringend abgeraten wird.
Der einfachere Ausweg lautet, den aufzunehmenden Film einfach in mehrere kleinere Teile aufzubrechen. Besonders gut eignen sich hierfür natürlich Werbepausen, die man somit gleich herausschneiden kann. Beachten Sie aber, daß Sie bei jeder Aufnahme einen anderen Dateinamen benutzen, um die vorherige Datei nicht zu überschreiben.

mpeg2_movie

Haben Sie die Videos aufgenommen, geht es an den zeitaufwendigsten Teil, der Umwandlung der Quicktime-Dateien ins MPEG2-Format. Hierbei müssen Video- und Audio-Stream einzeln berechnet werden. Im Unterverzeichnis video von mpeg2_movie startet man das Programm encode:

>> encode -b 1900000 /tmp/aufnahme.mov /tmp/aufnahme.m2v
Dieses Programm erzeugt das MPEG2-Video (Endung .m2v).
Die Umwandlung kann sehr lange dauern (15-20 Stunden, abhängig von der Dateigröße).
Hat man das Video in mehrere Teile aufgetrennt, muß man jeden Teil einzeln berechnen:
>> encode -b 1900000 /tmp/aufnahme1.mov /tmp/aufnahme1.m2v
>> encode -b 1900000 /tmp/aufnahme2.mov /tmp/aufnahme2.m2v
>> encode -b 1900000 /tmp/aufnahme3.mov /tmp/aufnahme3.m2v
Sind alle m2v-Dateien erzeugt, geht es daran, den Ton in eine MPEG2-Datei zu konvertieren. Dafür startet man im Unterverzeichnis audio das Programm encode (bei mehreren Teilen folglich):
>> ./encode -b 192000 /tmp/aufnahme1.mov /tmp/aufnahme1.mp2
>> ./encode -b 192000 /tmp/aufnahme2.mov /tmp/aufnahme2.mp2
>> ./encode -b 192000 /tmp/aufnahme3.mov /tmp/aufnahme3.mp2
Das Konvertieren des Tons in das mp2-Format geht wesentlicher schneller als beim Bild.

Nun müssen die drei Video-Dateien (.m2v) und die drei Audio-Dateien (.mp2) zu jeweils einer Datei zusammengefügt werden. Dafür benutzt man das Programm mpeg2cat im Unterverzeichnis libmpeg2:

>> ./mpeg2cat /tmp/aufnahme1.m2v /tmp/aufnahme2.m2v /tmp/aufnahme3.m2v > /tmp/aufnahme_all.m2v
>> ./mpeg2cat /tmp/aufnahme1.mp2 /tmp/aufnahme2.mp2 /tmp/aufnahme3.mp2 > /tmp/aufnahme_all.mp2
Im letzten Schritt müssen nun noch Bild und Ton zu einer einzigen Datei zusammengefügt werden. Hierfür gibt es wieder ein weiteres Tool namens mplex, welches sich auch im Unterverzeichnis mplex von mpeg2_movie befindet:
>> mplex /tmp/aufnahme_all.m2v /tmp/aufnahme_all.mp2 /tmp/aufnahme_all.mpg
Dies ist endlich die MPEG2-Datei, die wir die gesamte Zeit haben wollten.
Mit viel Zeit und reichlich Konsolen-Arbeit hat man es endlich geschafft ...

XMovie

xmovie ScreenshotHat man bis hierhin alles überstanden, steht man vor dem Problem, die MPEG-Datei auch anschauen zu wollen. Im Gegensatz zum MPEG1-Format wird das MPEG2-Format bisher unter Linux nur von wenigen Programmen unterstützt (selbst unter Windows ist es problematisch auf die schnelle einen MPEG2-Player zu finden).
Unter Linux kann allerdings das Programm XMovie eingesetzt werden, um die Dateien abzuspielen. Dies gestaltet sich aber schwerer als erwartet, da das Programm zum Kompilieren die xv-Erweiterungen benötigt, welche nur die neuesten X-Server bereitstellen.
Wer einen älteren X-Server besitzt, muß aber nicht gleich verzweifeln. Es genügt nämlich, die entsprechenden Stellen im Quellcode zu entfernen, die diese Erweiterungen benutzen.
Allerdings sind dies mehr Stellen, als man hier kurz nennen könnte, deshalb plazieren wir hier lieber gleich unsere angepasste Version von XMovie, sowohl im Quellcode als auch kompiliert auf eine RedHat 6.2 (download XMovie, GPL sei Dank!).
Sollte die vorkompilierte Version bei Ihnen nicht laufen, müssen Sie den Quellcode wahrscheinlich mit "make clean; make" erneut kompilieren.

Diese gekürzte Version wird nun vielleicht nicht mehr alle Funktionen des Originals bieten, so lange man aber seine MPEG2-Dateien abspielen kann, wird es genügen.
Mit einem geeigneten Aufruf von XMovie kann man sich nun seine Videos ansehen:

>> xmovie /tmp/aufnahme_all.mpg

Für die Zukunft

Eine vollautomatische Aufnahme ist leider noch nicht möglich, da Broadcast2000 sich nicht automatisch beendet, und deshalb das Video-Device nicht wieder freigegeben wird. Man kann somit nicht per Skript mehrere Aufnahmen hintereinander starten, ohne jedesmal das Fenster per Hand zu schließen.
Wir hoffen, daß dies vom Broadcast-Programmierer demnächst behoben wird, denn dann ist es möglich, den PC als vollwertigen Videorecorder mittels eines at-Aufrufs zu benutzen.
Mir schwebt dabei ein kleines Web-Frontend vor, so daß man von überall aus seinen "Videorecorder" über das Internet programmieren könnte (Man sollte sich die Ersparnis gegenüber dem kommerziellen AV-Server mal vorstellen!!).
Sobald der Autor von Broadcast2000 diesen Mißstand behoben hat, wird es bestimmt einen Folgeartikel geben.


http://members.xoom.com/NicholasF/ Trinity Logo Trinity ist ein weiteres Programm zum Aufnehmen von Videos. Allerdings ist es noch nicht so weit entwickelt wie Broadcast. Außerdem scheint die Entwicklung des Programms momentan nicht mehr weiterzugehen.
http://heroine.linuxave.net Homepage von Broadcast, Xmovie und mpeg2_movie. Außerdem finden sich hier eine große Fülle weiterer Tools und Informationen rund um MPEG und Linux.
http://www.mainconcept.com/products/
mainactorLinux.shtml
Hier finden Sie das kommerzielle Bildbearbeitungsprogramm MainActor, welches mittlerweile auch für Linux erhältlich ist.
http://bmrc.berkeley.edu/frame/
research/mpeg/mpeg_encode.html
Die Quelle allen MPEGs: die Berkeley-MPEG-Tools.
http://moes.pmnet.uni-oldenburg.de/bttvgrab/ Bttvgrab ist ein weiteres Programm zum Erzeugen von MPEG-Videos, allerdings mit schlecheter Bild-Ton-Synchronisation. Das Programm kann komplett per Konsole gesteuert werden, und eignet sich somit besonders gut für automatische Aufnahmen.