Videobearbeitung

Aus Mikiwiki
Wechseln zu: Navigation, Suche

Es geht darum aus einer beliebigen Datei mit einem beliebigen Format eine veränderten Datei mit möglicherweise anderem Format und anderer Auflösung zu machen. Endziel ist insbesondere die VideoCD, damit man sich Filme am Fernseher ansehen kann.

  • Bei der linearen Videobearbeitung liegt zwischen jedem Bearbeitungsschritt ein Rechenzyklus, der wegen der grossen Datenmenge von Videodateien typischerweise lange dauert.
  • Nichtlineare Videobearbeitung sammelt alle Bearbeitungsschritte und wendet sie erst in einem abschliessenden Render-Vorgang auf die Videodaten an. Beispiele: Cinelerra, Pitivi

Benötigte Programme

  • Avifile > 0.7.15 (0.7.16 problematisch)
  • MPlayer > 0.90pre8 - Installation: Selber kompilieren mit compiler 2.95.x oder 3.x+. Bei ./configure werden am besten alle Optionen aktiviert, zumindest wenn sie etwas mit AVI oder MPG zu tun haben. Falls noch was fehlt, dann installiert es nach und führt ./configure erneut aus. Danach mit "make" compilieren und per "make install" (bzw. "checkinstall") installieren. Hier sollten die selben Codecs installiert sein wie auch schon bei Avifile. Je nach dem arbeitet eine vorkompilierte Version besser.
  • MJpegtools > 1.60 - Installation: das selbst kompilieren bringt Vorteile weil hier die Encoder drin sind, die nachher den Hauptteil der Arbeit machen werden. Auf der homepage findet sich auch ein RPM-Paket. Bei dessen Verwendung müssen zusätzlich die Pakete "mjpegtools" und "mjpegtools-devel" installiert werden.
  • Mpeg2Dec > 0.7 - Installation: ./configure, make, make install
  • Transcode > 0.6.1
  • VCDImager > 0.7.12
  • cdrdao > 1.1.7

Weitere nützliche Software umd die erzeugten Dateien testen bzw. richtig abspielen zu können:

Transcode 0.6.2 wird import_ffmpeg beherrschen. Die pre-Version kann dies bereits. Daher sollte schon ffmpeg kompiliert werden:

  • FFmpeg (CVS Version!) - Installation: Nach dem Durchführen von "./configure" muss die Liste angesehen werden. Einige Optionen werden Enabled und andere Disabled sein. Überlegt euch ob das was da Aus geschaltet ist nicht doch bei euch installiert ist und führt dann ein "./configure --help" aus. Meine Zeile sah z.B. so aus: ./configure --enable-a52bin --enable-mp3lame --enable-vorbis. Setzt also voraus das Ogg Vorbis, liba52 bzw. a52dec und die libmp3 installiert sind. Danach make und make install bzw. checkinstall ausführen. Anmerkung: Ab transcode 0.6.2 kann ffmpeg2 dann als Videodecoder verwendet werden. Audio macht aber wohl noch Probleme. Also z.B. -x ffmpeg,af6 benutzen. Das ist schneller als af6,af6 oder mplayer,mplayer.

Umwandlung einer Videodatei

Als Beispiel für die Umwandlung wird eine DivX-Datei ins VCD-Format umgewandelt. Hierbei sind besondere Einstellungen für Bild und Ton notwendig damit der DVD Player sie später abspielen kann. Bei einer Umwandlung von DivX zu DivX (mit z. B. anderer Auflösung) ist das nicht nötig, da kann alles frei gewählt werden.

Anmerkung: Nicht alle DVD-Spieler können auch selbst gebrannte VideoCDs abspielen, selbst dann nicht wenn sie der VCD Norm entsprechen.

Eine Videodatei ist eine Containerdatei, der im wesentlichen Bild- und Tondaten enthält. Diese sind jeweils in einem bestimmten Format gespeichert und zwar mit einem bestimmten codec. Die codecs unterscheiden sich bezüglich Grösse, Leistung und Qualität.

  • Videoformate: Avi, Mpeg, Quicktime, WMV, Realplay
  • Videocodecs: DivX (3 - 5), Mpeg4, Sorenson
  • Audiocodecs: Mp2, Mp3

Eine VCD beherrscht nur ganz bestimmte Formate. Daher müssen diese entsprechend angepasst werden. Für eine AVI-Datei mit DivX müsste also folgendes verändert werden:

  • DivX zu Mpeg (VCD) oder Mpeg2 (SVCD)
  • Mp3 zu Mp2
  • beliebige Auflösung zu z. B. 480 x 576 (SVCD) oder 352x288 (VCD)
  • beliebiger Ton zu z. B. 192 KBps (SVCD) oder 224 KBps (VCD)

Besondere Aufmerksamkeit verdient die Auflösung. Ein Film von 400x300 hat ein Verhältniss von 4:3. Beim Anpassen auf 480x576 nimmt die Breite um 80 und die Höhe um 276, was eine Verzerrung des Bildes ergeben würde. Besser wäre hier z. B. ein Format von 480x400, allerdings entspricht dieses nicht mehr dem VCD-Standard und wäre mit einem DVD-Spieler nicht abspielbar. Der fehlende Teil des Bildes wird deshalb einfach durch schwarze Ränder ersetzt, die ein fester Bestandteil des Films werden. Die Rechnung dafür lautet:
576 - 400 = 176 / 2 = 88 pro Rand (einer oben, einer unten).

Transcode benutzt nun einen decoder um die Eingangsdatei (z. B. AVI) zu decodieren und das Bild und den Ton getrennt in einer Temporärdatei abzulegen. Zeitgleich werden encoder verwendet, die eine Bild- und eine Tondatei erzeugen, die nun das richtige Format und die richtige Auflösung haben. Anschliessend werden Bild und Ton zur fertigen Datei zusammengefügt, z. B.zu einer neuen AVI- oder MPG-Datei, je nach dem was gewünscht ist und die encoder können.

Sind die Bedingungen für eine VCD erfüllt, so liegt ein VCD-kompatibles mpeg vor, das zu einer VCD weiter verarbeitet werden kann. Die mpeg-Datei wird nun mit dem VCDImager in eine CUE- und eine BIN-Datei umgewandelt, die als image gebrannt werden können und einige zusätzliche Daten enthalten, damit der DVD-Spieler die VCD abspielen kann. Brennen im DAO Modus geht am besten mit cdrdao.

Ein typischer transcode-Befehl sieht so aus:
$ transcode -i infile -x decoder -o outfile -V -y videoencoder,audioencoder -B height,width,factor -X width,height,factor -j top,right,bottom,left -F "video encoder options" -E "audio encoder options"

Die Optionen bedeuten im einzelnen:

-i infile Zu bearbeitende Videodatei, z. B. eine DivX 5 AVI-Datei.
-x decoder Dieser decoder (z. B. mplayer oder aviplay) liest die Eingangsdatei aus und wandelt sie in ein weiterverarbeitbares Format um. Beispiele:
-x mplayer,mplayer - MPlayer als decoder für Bild und Ton
-x af6,af6 - Avifile als decoder für Bild und Ton
Anzeige einer kompletten Liste der verfügbaren decoder:
$ ls /usr/local/lib/transcode/import*
-V Der decoder legt temporär eine YUV-Datei an, in die die decodierten Daten abgelegt werden. Sollte es Probleme wie Verfärbungen geben, so kann das mit dem encoder zusammen hängen. In diesem Fall kann "-V" durch "-k" ersetzt werden, womit eine Farbkorrektur vorgenommen und das Problem möglicherweise gelöst wird.
-y videoencoder,audioencoder Bei ausreichender Rechnerleistung ist es sinnvoll, die YUV-Datei gleich wieder auszulesen und mit den encodern für Bild (z. B. mpeg2enc, mpeg, divx5) und Ton (z. B. mp2enc, toolame, divx5) weiter zu verarbeiten.
Videoencoder:
  • "mpeg2enc" ist sehr gut für Mpeg1 und 2.
    • "divx5" taugt für DivX

    Audioencoder:

    • "mp2enc"
    • "Toolame" ist schneller, allerdings ist bei manchen Dateien der Ton dann etwas daneben.
    • "divx5" taugt für DivX.

    Beispiele:
    -x mpeg2enc,mp2enc bzw.-y mpeg2enc,toolame - für Mpeg 1 oder 2 bzw. VCD
    -y divx5,divx5 - für DivX
    Anzeige einer kompletten Liste der verfügbaren encoder:

    $ ls /usr/local/lib/transcode/export*
  • -B height,width,factor Verkleinerung des Bildes um Höhe mal Faktor und Breite mal Faktor.
    -X height,width,factor Vergrösserung des Bildes um Höhe mal Faktor und Breite mal Faktor.
    -j top,right,bottom,left Hinzufügen oder Entfernen der Ränder. Negative Zahlen fügen Ränder hinzu, positive Zahlen entfernen Ränder.
    -B und -X können zugleich eingesetzt werden. Das macht aber nur Sinn, wenn Höhe oder Breite abwechselnd jeweils Null sind.
    Unter http://tibit.org/video/zoomto.sh gibt es das Skript "zoomto", das nach "/usr/bin/zoomto" kopiert werden kann. Benutzung:

    $ zoomto widthxheight newwidthxnewheight
    Als Ergebnis werden sinnvolle Werte für j, B und X ausgegeben. Beispiel:
    -B h,0,f -X 0,b,f
    Die Faktoren h,b und f müssen erst berechnet werden:
    1. Abspielen des Films mit MPlayer. In der Konsole taucht eine Zeile auf, aus der die Auflösung hervorgeht, z. B. 640x480.
    2. Das Endformat soll 480x576 sein (also das Format für eine SVCD; 288x352 wäre eine VCD). Die Rechnung lautet:
    640 - 480 = 160 verkleinern
    480 - 576 = 96 vergrössern

    3.
  • Diese Zahlen müssen mit einem Faktor verrechnet werden, entweder mit 8, 16 oder 32:
    160 = 5 x 32 = 10 x 16 = 20 x 8
    96 = 3 x 32 = 6 x 16 = 12 x 8
    In diesem Fall kommt man mit allen Faktoren auf eine ganze Zahl und kann sich daher aussuchen was man nimmt, z. B.
    -B 5,0,32 -X 0,12,8
    Als Ergebnis erhält man das gewünschte Format von 480x576.
    4. Bei einer zu grossen Verzerrung müssen schwarze Ränder eingefügt werden. Im Beispiel wird die Höhe nicht um 96 sondern nur um 56 vergrössert, das Endformat ist dann 480x536. Es fehlen also 40 zur korrekten Grösse. Die Rechnung lautet:
    480 + 56 = 536 (resultierendes Format)
    536 - 576 = 40 (fehlende Höhe)
    40 / 2 = 20 (Höhe für einen schwarzen Rand)
    5. Normalerweise packt man einen Rand nach unten und einen nach oben. Die Option lautet dann:
    -j -20,0,-20,0
    Die kompletten Optionen lauten dann also:
    -B 5,0,32 -X 0,7,8 -j -20,0,-20,0 6. Damit hat der Film nun das richtige Format und eine passende Auflösung. Das Script "zoomto" meint dazu:
    $ zoomto 640x480 480x576
    Multiples of 32: -X 3,0,32 -B 0,5,32
    Multiples of 16: -X 6,0,16 -B 0,10,16
    Multiples of 8: -X 12,0,8 -B 0,20,8
    7. -Y bedeutet im übrigen nur, dass die Ränder während des Encodiervorgangs eingefügt werden.
  • -F "video encoder options" Optionen für den Videoencoder (gemäss manpage). man mpeg2enc zeigt weitere Optionen. Ein Beispiel für Videoencoder-Optionen ist folgendes:

    -F 4,"-S 792 -B 260 -V 230"
    Das -F bedeutet, dass jetzt Optionen kommen die dem Encoder übergeben werden sollen. Die Zahl vor dem Komma steht für ein Standard Format (3 ist VCD, 4 ist SVCD, 5 ist eine eigene Definition). Für gute Filme ist 4 (SVCD) zu empfehlen. Für einfachere Filme reicht 3 (VCD). In den Anführungszeichen stehen nun Encoder-spezifische Optionen: -S 792 bewirkt, dass die Datei am Ende in jeweils 792 MB grosse mpegs zerlegt werden - das passt dann genau auf eine 700 MB CD. Der Grund ist das ein normaler Rohling 700 MB für Daten verwenden kann und den Rest für Fehlerkorrekturen benutzt. Das fällt aber bei SVCDs und VCDs weg.

    Die genaue Funktion der einzelnen möglichen Optionen müssen der jeweiligen Hilfe oder manpage des Encoders entnommen werden
    -E "audio encoder options" Audio samplerate - in der Regel wird immer eine samplerate von von 44.1 kHz und eine bitrate von 192 bei SVCD und 224 bei VCD. genommen, also:

    -E 44100 -b 224 für VCD

    -E 44100 -b 192 für SVCD
    -b Die Audio bitrate ist in der Regel 224 für VCDs und mindestens 192 für SVCDs. Für andere Formate kann man sie frei wählen. Bitraten zwischen 128 und 192 sind dann meist akzeptabel.
    -c Die Option -c wird dazu benutzt, um zu testen oder um nur bestimmte Teile des Films zu

    bearbeiten. Sie sollte am besten hinter den Encoderoptionen plaziert werden. Die Syntax lautet:
    -c f1-f2 f3-f4 ...
    Um nur die ersten 5 Minuten (also 7500 frames) eines Films zu encoden:
    -c 1-7500
    Um aus einem 10-minütigen Film den Werbeblock zwischen Minute 5 und 6 zu entfernen:
    -c 1-7500 9000-15000

    Wenn die Zeit nicht genau ermittelt werden kann, kann auch der MPlayer per Konsole gestartet werden. Dann zeigt er wärend des Abspielens den aktuellen frame an. Durch drücken von "P" stoppt er den Film und die Zahl kann in der Konsole einfach abgelesen werden. Um festzustellen welcher der letzte frame ist einfach bis zum Ende gehen. Mplayer stoppt dann bzw. beendet sich. In der Konsole steht dann der letzte frame.

    Erzeugen der Enddateien

    Die Encoder erzeugen eine Bild- und eine Tondatei. Das Zusammenfügen zur Enddatei wird am besten mit Hilfe der mjpegtools gemacht.

    $ mplex -f 4 -o outfile_%d.mpg infile1.m2v infile2.mpa
    oder
    $ mplex -f 4 -b 230 -o outfile_%d.mpg infile1.m2v infile2.mpa
    

    Abhängig davon, welcher Audioencoder benutzt wurde, muss "mpa" durch "mp2" ersetzt werden. Mplex wird sich an der Option "-S 792" orientieren und die Datei genau da enden lassen. Dafür steht dann auch das "_%d". Dieses wird beim encoden dann einfach durch die Nummer des Mpegs ersetzt. Die Option "-f 4" steht wieder für SVCD ("-f 1" steht für VCD). Das ist davon abhängig was bei transcode angegeben wurde.

    Die Datei muss bereits beim encoden aufgeteilt werden. Wird der mpeg erst später aufgeteilt, so werden in der zweiten Datei wichtige Informationen fehlen und das Erzeugen einer VCD wird scheitern! Bei Dateien die nicht VCDs werden sollen ist das egal. Diese können nach Belieben aufgeteilt werden.

    Nach Beenden des Zusammenfügens kann das Video mit MPlayer oder Xine angesehen werden.

    Erzeugen einer Abbilddatei (für VCD oder SVCD)

    Erzeugen einer Abbilddatei für eine VCD.

    $ vcdimager 1.mpg
    

    Erzeugen einer Abbilddatei für eine SVCD.

    $ vcdimager -t svcd 1.mpg
    

    Erzeugen einer Abbilddatei für eine SVCD aus mehreren Videodateien.

    $ vcdimager -t svcd 1.mpg 2.mpg 3.mpg
    

    Bei Bedarf kann auch der Name der Ausgangsdatei festgelegt werden (siehe "vcdimager --help").

    Brennen des Images

    Zum Schluss wird das Image auf einen Rohling gebrannt, am besten mit "cdrdao". Voraussetzung ist, dass der Brenner den DAO-Modus beherrscht und von "cdrdao" unterstützt wird. Eine Liste findet sich auf der Homepage.

    $ cdrdao write --device 1,0,0 --driver generic-mmc --buffers 64 Image.cue
    

    Der korrekte Gerätetreiber ist auf der Homepage nachzulesen. In der Regel ist es immer "generic-mmc-raw" oder "generic-mmc". Das richtige device des Brennes kann mit "cdrecord -scanbus" ermittelt werden.

    Nach erfolgreichem Brennen der VCD kann sie in einem DVD Player ausprobiert werden. Von nahe gesehen fallen unter Umständen die vielen Fehler auf, die der Divx-Codec manchmal hat. In normalem Abstand zum Fernseher sollten diese Fehler aber nicht mehr zu sehen sein. Ein Divx hat nun mal keine DVD Qualität und das Vergrössern des Films macht es sogar noch etwas schlimmer. Bei Filmen mit hoher Qualität dagegen sollte die Qualität weitgehend erhalten bleiben.

    Weblinks