Video und Audio Konvertierung mit ffmpeg
 
Wichtigste Befehle zusammengefasst

Beste Qualität (großes File!)
# ffmpeg -i testfile.flv -vcodec huffyuv -acodec pcm_s16le testfile.avi

Audio aus Video extrahieren
# ffmpeg -i testfile.flv -vn testfile.wav

DVD-Konvertierung
# ffmpeg -i Input.flv -target pal-dvd -aspect 4:3 Output.mpg
mit anderer Bitrate:
# ffmpeg -i Input.flv -target pal-dvd -aspect 4:3 -b 3000k Output.mpg
schwarze Balken bei 16:9:
# ffmpeg -i Input.flv -target pal-dvd -aspect 4:3 -padtop 72 -padbottom 72 -s 720x432 Output.mpg
ganze Ordner mit einer for-Schleife konvertieren:
# for i in *.avi; do ffmpeg -i "$i" -target pal-dvd -aspect 4:3 "`basename "$i" .avi`".mpg; done

Filme für den Creative Zen Player kodieren
# ffmpeg -i Input.mpg -s 320x240 -vcodec mpeg4 -vtag XVID -b 800k -acodec libmp3lame -ab 128k -ar 44100 Output.avi

Bildschirmaufnahmen (X11-Grabbing)
# ffmpeg -f x11grab -s 384x288 -r 25 -i :0.0+0,0 -vcodec huffyuv record.avi

Webcam-Bild speichern
# ffmpeg -f video4linux2 -s 640x480 -r 1 -i /dev/video0 -vframes 1 -f image2 /webcam/image.jpg

Canon D550 mov in mjpeg
# ffmpeg -i Input.mov -vcodec mjpeg -r 25 -b 100M -acodec pcm_s16le Output.avi
Für 50% Zeitlupe: "-r 25" weglassen und mit VirtualDub auf 25fps stretchen.

Flash-Filme (flv) fürs Internet
# ffmpeg -i Input.avi -vcodec libx264 -b 800k -aspect 4:3 -s 320x240 -acodec libmp3lame -ab 192k -ar 44100 Output.flv

HD für TV
# ffmpeg -i Input.avi -pix_fmt yuv420p -vcodec libx264 -b:v 6000k -r 25 -aspect 16:9 -acodec libfaac -ab 192k -ac 2 -ar 48000 Output.mp4

mp4 fürs Handy
# ffmpeg -i Input.avi -s 640x352 -vcodec mpeg4 -vtag XVID -b 3000k -acodec libmp3lame -ab 128k -ac 2 -ar 44100 Output.mp4

Thumbnails/Screenshot von einem Video
# ffmpeg -i input.flv -f image2 -ss 100 -t 0.001 -s 320x240 Output.jpg

 

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 -vcodec mjpeg -b 7000k -acodec 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
-vcodec = Wahl des zu verwendenden Video-Codecs
-b = Video-Bitrate (hier 7000 Kbit/sec)
-acodec = Wahl des Audio-Codecs (hier copy, also unverändert kopieren)

# ffmpeg -i testfile.flv -an -vcodec 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 -vcodec huffyuv -acodec 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 -vcodec mpeg4 -vtag XVID -b 800k -acodec libmp3lame -ab 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.
-ab = 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 -vcodec mpeg4 -vtag XVID -b 800k -acodec libmp3lame -ab 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 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 -vcodec huffyuv -acodec pcm_s16le Output.avi
das könnte auch genauso heißen
# ffmpeg -i Input.flv -s 720x432 -padtop 72 -padbottom 72 -vcodec huffyuv -acodec 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 -vcodec libx264 -acodec libfaac 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 -vcodec libx264 -af "volume=0.3" -acodec libfaac 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.

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 -vcodec 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
-vcodec = 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 -vcodec 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 -vcodec mjpeg -acodec 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" -vcodec mpeg4 -vb 6000k -r 24 -aspect 16:9 -acodec 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