Natürlich kann man für die Video- und/oder Audiokonvertierung auch grafisch
orientierte Programme verwenden, wie z.B. Kino, Cinelerra
oder allen voran das VirtualDub ähnliche Tool avidemux.
Hier möchte ich aber simpelste und einfachste Videokonvertierung
auf der Kommandozeile vorstellen, die in manchen Situationen einfach
viel schneller abzustarten ist, als wie wenn ich mich durch langwierige
Einstellungsdialoge klicke. Das dazugehörige Programm nennt
sich ffmpeg.
Informationen über Files und Codecs
# ffmpeg -i input-file
zeigt Informationen über das File an. Besser jedoch ist mediainfo (für die Installation und Verwendung von mediainfo siehe Installation von mediainfo-gui).
# ffmpeg -formats
zeigt alle für die Kodierung möglichen Audio- und Videoformate
an.
Um eine simple Liste von Video-Files in einem Verzeichnis zu erstellen,
die neben dem Dateinamen Informationen über die Auflösung
und den verwendeten Video-Codec beinhaltet, hilft folgende Pipe:
# for i in *.flv; do ffmpeg -i "$i" 2> Tempfile;
egrep -i "flv|video" < Tempfile >> Liste.txt;
echo "-----------------------------------------------"
>> Liste.txt; done
Durch die for-Schleife wird eine Liste sämtlicher Files
mit der Endung .flv (Flash-Files) im momentanen Verzeichnis
erstellt und die einzelnen Dateinamen an ffmpeg weitergereicht.
ffmpeg öffnet die Video-Files und gibt so auf dem Standard-Fehlerkanal
Informationen über die Auflösung und den verwendeten Codec
wieder, welche in der Datei Tempfile gespeichert werden.
Da die Ausgabe von ffmpeg noch viel mehr beinhaltet, wird im nächsten
Schritt mittels egrep die relevanten Informationen wie der
Dateiname (durch den Suchbegriff flv) und die Eckdaten des
Videos (durch den Suchbegriff video) herausgefiltert und
in die Datei Liste.txt geschrieben. Dabei wird nach jedem
File zur besseren Übersicht mittels echo eine Trennlinie
in die Datei geschrieben. Alternativ könnte man auch mittles
echo $'\n' einen Zeilenvorschub auslösen.
Umwandlungsbeispiele
# ffmpeg -i testfile.flv -c:v mjpeg -b:v 7000k -c:a copy testfile.avi
Kodiert ein Flash-File in ein MJPEG-File mit 7000 Kbit/sec und kopiert
das Audio lediglich, also ohne Konvertierung.
-i = Input-File
-c:v = Wahl des zu verwendenden Video-Codecs
-b:v = Video-Bitrate (hier 7000 Kbit/sec)
-c:a = Wahl des Audio-Codecs (hier copy, also unverändert kopieren)
# ffmpeg -i testfile.flv -an -c:v bmp testfile.avi
wandelt ein Flash-File in unkomprimierte BMP-Bilder, ohne Audio.
-an = Kein Audio verwenden.
Leider führt der Vorgang ein AVI-File mit unkomprimierten BMP-Bildern
zu erzeugen dazu, daß sich das Bild verschiebt. Den Grund dafür habe ich leider nicht herausgefunden. Möchte man in ein verlustfreies Format konvertieren, ist folgender Codec daher besser:
Beste Qualität
# ffmpeg -i testfile.flv -c:v huffyuv -c:a pcm_s16le testfile.avi
Konvertiert ein Flash-File in das verlustfreie huffyuv-Format (der Huffman-Codec) mit unkomprimiertem Audio (wav).
pcm_s16le = signed 16-bit little-endian PCM.
Audio aus Video extrahieren
# ffmpeg -i testfile.flv -vn testfile.wav
-vn = Disable video recording, also kein Bild nur der Ton.
Filme für den Creative Zen Player kodieren
# ffmpeg -i Input.mpg -s 320x240 -c:v mpeg4 -vtag XVID -b:v
800k -c:a libmp3lame -b:a 128k -ar 44100 Output.avi
Besitzt man einen Creative Zen Player so kann man mit Hilfe obiger
Zeile die Filme in ein Format konvertieren, daß der Zen Player
nicht nur akzeptiert, sondern qualitativ auch noch besser ist, als
die Filme, die mit der mitgelieferten Kodierungssoftware erstellt
wurden.
-s = (size) natürlich die Videoauflösung.
-vtag = das XVID-Tag, ohne das die Zen-Software das File als inkompatibel verweigert.
libmp3lame = interessant ist, daß man auf die lame-Encoder-Bibliothek zurück greifen kann, um Audio in mp3-Qualität zu erzeugen. Die Angabe mp3 als Audio-Codec funktioniert nicht (zumindest bei mir nicht), nur mit libmp3lame wird auf lame zurück gegriffen.
-b:a = Audio-Bitrate.
-ar = Audio-Sampling-Frequenz, hier 44,1 KHz.
Vob´s für Creative Zen kodieren
DVD-Filme für den Creative Zen Player aufzubereiten ist ein
wenig kniffliger, da die Vob-Files einer DVD in der Regel mehrere
Audio-Spuren enthalten und darüber hinaus noch 5.1-Kanal-Ton.
Der muß erstmal in einen simplen Stereo-Kanal downgemixt werden.
Wie man die Vob´s auf Platte bekommt, darauf gehe ich hier
nicht näher ein. Hat man die Vobs auf der Platte, hilft ein
Tool namens ProjectX um sie in einzelne Audio- und Video-Streams
zu zerlegen. Diesen Vorgang nennt man demuxen. Dabei erhält
man eine Video-Datei (Endung m2v oder mpv) und eventuell mehrere
Audio-Spuren (Endung ac3 oder mp2 oder mpa). Welches die deutsche
Audio-Spur ist, findet man schnell raus, wenn man in das File reinhört.
Hat man ein ac3-File mit 5.1 Ton, muß man die 6 Kanäle
zuerst auf 2 Stereo-Kanäle downmixen. Das geht mit folgendem Befehl:
# ffmpeg -i VTS_01_1.ac3 -ac 2 VTS_01_1.wav
VTS_01_1 dient hier natürlich nur als Beispiel.
-ac = Audio-Channel, hier 2, also Stereo anstatt 5.1.
ac3-Ton ist in der Regel leiser als ein vergleichbares mp2 oder
mpa-File. Um die Lauststärke anzuheben, gibt es folgenden Befehl,
so fern das Programm normalize-audio installiert ist:
# normalize-audio VTS_01_1.wav
Das Programm scannt die wav-Datei nach dem höchsten Peak, berechnet den Unterschied bis zur 0 dB (Dezibel) Grenze und sorgt für die Lautstärken-Angleichung. Und das können schon so an die 7-8 dB sein, um die das Programm die Lautstärke anhebt.
Abschließend wird die Video-Datei zusammen mit der Audio-Datei
umgewandelt:
# ffmpeg -i VTS_01_1.m2v -i VTS_01_1.wav -s 320x180 -aspect 16:9
-c:v mpeg4 -vtag XVID -b:v 800k -c:a libmp3lame -b:a 128k -ar
44100 Output.avi
Man beachte hier die Auflösung von 320x180 Pixeln, welches
dem 16:9 Seitenverhältnis entspricht, da Filme auf einer DVD
in der Regel anamorph gespeichert werden. Damit werden sie wieder
korrekt entzerrt:
-aspect 16:9 = damit der Film mit dem korrekten Seitenverhältnis
dargestellt wird.
Und wie man sieht, genügt es einfach beide Quellen, Audio und
Video mit -i (Input) anzugeben. ffmpeg muxt sie wieder automatisch
zusammen.
DVD-Konvertierung
ffmpeg enthält vorgefertigte Templates für die gängigen Formate, wie z.B. vcd
(Video-CD), svcd (Super-Video-CD), dvd, dv,
dv50, pal-vcd, ntsc-svcd, usw. Man muß
also nicht sämtliche Einstellungen für eine DVD wie Auflösung,
Bitrate, Video-Codec, Audio-Codec, usw. von Hand einstellen, sondern
es genügt die Angabe eines Templates und alle weiteren erforderlichen
Einstellungen werden vollautomatisch vorgenommen, z.B.:
# ffmpeg -i Input.flv -target dvd Output.mpg
In manchen Fällen ist es sicherer oder sinnvoller die Art
des DVD-Formats (ob PAL oder NTSC) mitanzugeben:
# ffmpeg -i Input.flv -target pal-dvd Output.mpg
wandelt ein Flash-File in das DVD-Format, wobei das Audio sogar
in AC3 konvertiert wird. Leider habe ich hier einen kleinen Fehler
festgestellt, da ohne Angabe der aspect ratio keine
vernünftige Ratio für das korrekte Seitenverhältnis gespeichert wird. In manchen Anzeigeprogrammen steht da was von "Standard" und in wieder Anderen was
von "5/4". Daher ist es sinnvoller die korrekte Ratio
(ob 4:3 oder 16:9) mitanzugeben:
# ffmpeg -i Input.flv -target pal-dvd -aspect 4:3 Output.mpg
möchte man die Bitrate auch noch verändern:
# ffmpeg -i Input.flv -target pal-dvd -aspect 4:3 -b:v 3000k Output.mpg
Hat man die aspect ratio vergessen, so kann man sie nachträglich
ohne Neukodierung mittels mpgtx verändern.
# mpgtx -j -A2 Input.mpg -o Output.mpg
Dabei steht A2 für die Ratio 4:3. Gültige
Werte Ax sind 1,2,3,4 für die Proportionen 1:1,
4:3, 16:9 oder 2,2:1.
Etwas kniffliger wird es, wenn das Ursprungs-File nicht die korrekte Auflösung hat
und man die Größe verändern muß. Hier ein Beispiel mit einem Ursprungs-File das eine Auflösung
von 1280x720 (HD) hat und in die DVD-Auflösung von 720x576
konvertiert werden soll und als besondere Schwierigkeit, nicht
anamorph! Da das HD-File in der Ratio 16:9 vorliegt müssen
wir für die korrekte 4:3 Bildgröße oben und unten
schwarze Balken anfügen, man nennt das auch Letterboxed. Würden
wir keine Resize-Optionen angeben, würde zwar das File auch
in die DVD-Auflösung resized werden, das Bild würde aber
verzerrt werden - in dem Fall anamorph gespeichert. Hier nun mit
den schwarzen Balken:
# ffmpeg -i Input.flv -target dvd -padtop 72 -padbottom 72 -s 720x432 Output.mpg
Wie man erkennen kann, resizen wir auf die Größe 720x432
und fügen dann jeweils oben und unten 72 Pixel hinzu, was zur
finalen Auflösung von 720x576 Bildpunkten führt. Zu beachten
ist hier die Reihenfolge der Optionen, denn kommt die Resize-Funktion
(-s) vor der "target dvd"-Funktion, hat
der Resize-Faktor mit der Höhe 432 keine Wirkung und das Bild
wird auf eine Größe von 720x720 (DVD-Höhe 576+72+72=720)
skaliert! Anders wenn wir kein Template verwenden, dann gibt es
keine einzuhaltende Reihenfolge:
# ffmpeg -i Input.flv -padtop 72 -padbottom 72 -s 720x432 -c:v
huffyuv -c:a pcm_s16le Output.avi
das könnte auch genauso heißen
# ffmpeg -i Input.flv -s 720x432 -padtop 72 -padbottom 72
-c:v huffyuv -c:a pcm_s16le Output.avi
und macht keinen Unterschied.
Schwarze Balken entfernen bei einer 16:9 (Letterboxed) TV-Sendung im 4:3 PAL Format
# ffmpeg -i input.avi -vf "crop=720:432:0:72" -s 720x576 output.mp4
schneidet die schwarzen Balken weg. 72 Pixel oben, 72 Pixel unten. Wird definiert durch crop=width:height:x-offset:y-offset, also ein 720x432 großer Bildausschnitt um 72 Pixel nach unten geschoben.
Nur einen bestimmten Bereich eines Videos umwandeln
# ffmpeg -ss 00:05:06 -i input.avi -to 00:44:40 -c:v libx264 -c:a libfdk_aac output.mp4
startet ab position 5 min 6 sec mit der Umwandlung, schneidet also 5 min 6 sec vom Anfang ab. Beendet wird die Umwandlung nach 44 min 40 sec. Das bedeutet sucht man per Media Player einen In- und Outpoint, so ist vom Outpoint die Dauer bis zum Inpoint abzuziehen.
Lautstärke anpassen
# ffmpeg -i input.flv -c:v libx264 -af "volume=0.3" -c:a libfdk_aac output.mp4
0.3 setzt die Lautstärke auf 30%, also 70% weniger als vorher. 1.5 z.B. bedeutet 150%, also um 50% lauter.
Gleiche Files aneinander hängen mit dem concat Filter
# ffmpeg -i "concat:VTS_01_1.VOB|VTS_01_2.VOB|VTS_01_3.VOB|VTS_01_4.VOB" -c:v copy -c:a copy VOBs_komplett.VOB
Dabei liefert concat die Files als EIN File am Eingang. Somit kann die Weiterverarbeitung auch anders aussehen und muß keine Kopie sein, z.B.
# ffmpeg -i "concat:VTS_01_1.VOB|VTS_01_2.VOB|VTS_01_3.VOB|VTS_01_4.VOB" -vn Output.wav
Schwarze Ränder hinzufügen
# ffmpeg -i input.avi -vf "scale=900:720,pad=1280:720:190:0:black" output.avi
Der Padding Filter ist wie folgt aufgebaut: Breite, Höhe, x, y, Color.
Obiger Befehl verkleinert mit scale das Eingangs-Video auf 900x720 und fügt anschließend links und rechts einen schwarzen Bereich hinzu um auf die erforderlichen 1280x720 für die kleinere HD-Auflösung zu kommen.
Ein Video um jeweils 90 Grad Schritte im Uhrzeigersinn drehen
# ffmpeg -i input.avi -vf "transpose=1" output.avi
Möchte man um 180 oder 270 Grad drehen, muß man den Filter mehrmals hintereinander angeben, z.B. für 270:
# ffmpeg -i input.avi -vf "transpose=1,transpose=1,transpose=1" output.avi
Thumbnails/Screenshots von einem Video
# ffmpeg -i input.flv -f image2 -ss 100 -t 0.001 -s 320x240 Output.jpg
-f = force Format, hier image2.
-ss = springt zur angegeben Position in Sekunden im Video. Ein Angabe im Format hh:mm:ss.xxx ist auch möglich.
-t = beschränkt die Videolänge auf die angegebene Zeit in Sekunden. Hier kann man ebenfalls das Format hh:mm:ss.xxx angeben.
Ganze Ordner mit Hilfe einer for-Schleife umwandeln
Möchte man einen
ganzen Ordner auf einmal umwandeln, hilft folgende for-Schleife:
# for i in *.avi; do ffmpeg -i "$i" -target pal-dvd
-aspect 4:3 "`basename "$i" .avi`".mpg; done
oder um bei einen ganzen Ordner voller mpg-Files die aspect ratio
zu ändern:
# for i in *.mpg; do mpgtx -j -A2 "$i" -o /anderes/Verzeichnis/"$i";
done
Aneinanderhängen von avi-Files
Möchte man mehrere
avi-Files mit gleicher Codierung zu einem ganzem File verschmelzen,
hilft unter Umständen mencoder:
# mencoder -forceidx -ovc copy -oac copy Input1.avi Input2.avi
-o Output-Gesamt.avi
Index von AVI-Files reparieren
Manchmal kann es vorkommen, daß der Index einer AVI-Datei beschädigt ist. Dann kann man den Film zwar anschauen, aber nicht zu einem bestimmten Punkt im Film springen. Mittels
# mencoder -idx input.avi -ovc copy -oac copy -o output.avi
kann man einen neuen Index schreiben.
Bildschirmaufnahmen (X11 grabbing)
Möchte man filmtechnische Aufnahmen von seinem Desktop machen, ist das auch ohne weiteres
mittels ffmpeg möglich. Der Befehl dafür lautet:
# ffmpeg -f x11grab -s 384x288 -r 25 -i :0.0 -c:v huffyuv record.avi
-f = (force format) wählt das Format, in dem Fall x11grab
-s = die Aufnahme-Größe. Mit einem 2,4 GHz Prozessor und einem funktionierendem Grafikkartentreiber ist es ohne weiteres möglich in voller PAL-Auflösung mit
25fps und dem huffyuv-Codec aufzunehmen. Allerdings hat man dann
an einem TV-Gerät das Problem des Zeilenflimmerns, da 1 Pixel
genau einer Zeile entspricht und somit das Pixel in einem Halbbild
da ist, im anderem nicht. Besser ist daher kleiner aufzunehmen und
den Film anschließend auf die volle PAL-Auflösung hochzurechnen.
-r = die Framerate, für PAL 25fps
-i = der Input, hier die Display-Nummer :0.0
-c:v = altbekannt, die Komprimierung, hier der Huffman-Codec
(verlustfrei!)
Möchte man den Bildschirm-Ausschnitt zum aufnehmen verändern,
gibt man die Koordinaten einfach hinter dem Display an, z.B.
# ffmpeg -f x11grab -s 384x288 -r 25 -i :0.0+200,300 -c:v huffyuv record.avi
Somit verschiebt sich das Aufnahme Fenster von 384x288 Pixeln auf
die Position 200 Pixel nach rechts und 300 Pixel runter.
Was tun bei mehreren Audio-Spuren?
Mit Hilfe des Schalters -map kann man das sogenannte "mapping" bestimmen. Hat ein Videofile mehrere Spuren, kann man über das mapping festlegen, welche Spur für das Ausgabe-File herangezogen wird. Ein Beispiel:
Angenommen ein File hat folgende Ausgabe:
Duration: 01:19:06.78, start: 0.000000, bitrate: 1205 kb/s
Stream #0.0(und): Video: h264, yuv420p, 720x576, 90000.00 tb(r)
Stream #0.1(und): Audio: libfaad, 48000 Hz, stereo
Stream #0.2(und): Audio: ac3, 48000 Hz, stereo
Stream #0.3(und): Subtitle: text / 0x74786574
Wie man sieht, besitzt das File neben der Video-Spur (#0.0) noch 2 Audio Spuren (#0.1, #0.2) und eine Untertitel-Spur (#0.3). Mit Hilfe des mappings kann man nun bestimmen, welche Audio-Spur für ein Ausgabe-File mit nur einer Audio-Spur herangezogen wird. Dazu gibt man als mapping-Parameter zuerst die Video-Spur an und anschließend die Audio-Spur. Demnach sieht der ffmpeg-Befehl wie folgt aus:
# ffmpeg -i Input.mp4 -map 0:0 -map 0:2 -c:v mjpeg -c:a pcm_s16le Output.avi
In unserem Fall wird die erste Videospur (0:0) und der zweite Audio-Stream (0:2), also das ac3 Audio verwendet.
Deinterlacing
Hat man älteres Videomaterial vorliegen, kann es sein, daß dieses noch Interlaced, also mit Halbbildern im Zeilensprungverfahren vorliegt. Um dieses an einem modernen Flachbildschirm anzuschauen empfiehlt sich das Video vorher zu deinterlacen um unschöne ausgefranste Ecken bei schnellen Bewegungen zu vermeiden. Auch wenn das Deinterlacing eine Qualitätseinbuße mit sich bringen kann, ist der optische Eindruck weit besser als dieser seltsame "Kamm-Effekt". Jedoch bringt ffmpeg einen Deinterlace-Filter mit, der diese Aufgabe hervorragend und in guter Qualität löst. Der entsprechende Filter von ffmpeg heißt yadif (Yet Another DeInterlacing Filter).
# ffmpeg -i INFILE -vf yadif=0:-1:0 OUTFILE
Zwar besitzt ffmpeg die Option -deinterlace, diese soll laut Manpage jedoch nicht genutzt werden, da das Ergebnis von geringer Qualität sei. Die Zahlen hinter yadif stehen für die Einstellungen (mode:parity:deint) und könnte man in dieser Kombination auch weglassen, da die Kombi 0:-1:0 der Standard ist wenn nichts angegeben wird. Dabei bedeutet
0:-1:0 (mode)
0 = gibt einen Frame für jeden Frame aus, d.h. aus 25 fps mit jeweils 50 Halbbildern werden 25 Vollbilder/sec. 1 = gibt einen Frame für jedes Halbbild aus, d.h. aus 25 fps mit jeweils 50 Halbbildern werden 50 Vollbilder/sec.
0: -1:0 (parity)
0 = Verwendet top field zuerst. 1 = Verwendet bottom field zuerst. -1 = Automatische Erkennung der Feldparität.
0:-1: 0 (deint)
0 = Deinterlaced alle Frames. 1 = Deinterlaced nur Frames, die als Interlaced markiert sind.
Interessant ist der mode 1. Ermöglicht er doch ein Video mit 50 Vollbildern/sec, was sehr flüssige Bewegungen ergibt. In älteren ffmpeg-Versionen kann die Option für Filter anstelle von -vf auch -filter:v heißen.
Subtitles verarbeiten
Untertitel (engl. Subtitles) kann man auf zweierlei Arten in ein Video einbinden. Einmal als Hardcodierung oder als Softcodierung. Bei der Hardcodierung werden die Untertitel fest mit dem Videobild verschmolzen und können daher nicht an- oder abgewählt werden. Sie sind dann fester Bestandteil des Bildes. Bei einer Softcodierung liegen die Untertitel neben dem Videobild als separater Untertitel-Stream. In der Regel nimmt man für eine Softcodierung das mkv-Format, jedoch kann ein mp4-Format ebenfalls Subtitle-Streams enthalten.
Zur Hardcodierung (fest eingebrannt) von vob-subtitles (*.sub):
# ffmpeg -i input.mpg -i subtitles.idx -filter_complex "[0:v][2:s]overlay" -c:v mpeg4 -vb 6000k -r 24 -aspect 16:9 -c:a libmp3lame -ar 48000 output.mp4
Zur Softcodierung (als separater subtitle-Stream):
# ffmpeg -i input.mp4 -f srt -i input.srt -map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy -c:s mov_text output.mp4
MP4-Datei: Seitenverhältnis neu einstellen ohne Neukodierung
Hat ein MP4-Video das falsche Seitenverhältnis (erkennbar an den Eierköpfen), weil in den Metadaten das Seitenverhältnis falsch vorgegeben wird, kann man den Wert in den Metadaten verändern ohne Neukodierung des Video-Materials. Leider funktioniert das mit Hilfe von ffmpeg nicht. Dafür benötigt man MP4Box (Teil des Pakets gpac).
Der Befehl dafür lautet:
# MP4Box -par 1=3:4 file.mp4
Dabei ist darauf zu achten (warum auch immer das so ist?!?), daß die kleinere Zahl zuerst kommt, also 16:9 muß mit 9:16 und 4:3 mit 3:4 angegeben werden (warum einfach wenns auch kompliziert geht).
Weitere Erklärungen zum Befehl (in Englisch):
-par: PixelAspectRatio (adjusts DAR + SAR with respect to the video resolution)
1=: stream number
3:4: aspect ratio (lower number 1st!)
Die Änderungen des Seitenverhältnisses werden sofort in die Datei geschrieben. Es erfolgt keine Kopie!
Herausfinden welches Pixel Format von welchem Encoder unterstützt wird
# ffmpeg -h encoder=libx264
# ffmpeg -h encoder=mjpeg
Hinweis: pix_fmt ist veraltet und man sollte pix_format verwenden.
Übersicht über die Ausgabetreiber bei mplayer
# mplayer -vo help
Metadaten Bearbeitung
Um die Metadaten eines Video-Files zu bearbeiten, kann man auch ffmpeg nehmen. Möchte man bestimmte Metadaten löschen, gibt man einfach nichts an. Zum Beispiel entfernt folgender Befehl die Sprachangabe beim erstem Video-File:
# ffmpeg -i Input.mp4 -metadata:s:v:0 language="" -c:v copy -c:a copy Output.mp4
Möchte man das z.B. für die 2. Audio-Spur machen, lautet der Befehl:
# ffmpeg -i Input.mp4 -metadata:s:a:1 language="" -c:v copy -c:a copy Output.mp4
Möchte man Generell alle Untertitel Spuren entfernen, fügt man "-map -0:s" an, z.B.
# ffmpeg -i input.mp4 -map -0:s output.mp4
Wichtig ist dabei das Minus vor der Spurnummerangabe!
Kapitelangaben können auch im Videofile als separater Subtitle Stream vorhanden sein. Möchte man die Kapitelangaben löschen, hilft -map_chapters -1
# ffmpeg -i input.mkv -map_chapters -1 output.mp4
Möchte man sämtliche Metadaten entfernen, hilft -map_metadata -1.
|