Spielwiese Home

Videohokuspokus mit ffmpeg


ffmpeg ist ein Kommandozeilen-Tool zur Konvertierung aller gängigen Codecs - quasi ein schweizer Taschenmesser der Video- und Audio-Bearbeitung.

Zuhause ist das Projekt auf ffmpeg.mplayerhq.hu

Auf meiner Suche nach irgendeinem Linux-Tool zum Umwandeln von Video-Dateien, musste ich feststellen, dass ffmpeg zwar alles kann, aber leider schlecht dokumentiert ist.
Das hat mich veranlasst, hier ein paar praxisnahe Beispiele zusammenzustellen (ziemlich unsortiert).

Wichtig: Es gibt Unterschiede zwischen der Windows- und der Linux-Version von ffmpeg. Darum möchte ich klarstellen, dass es hier ausschließlich um Linux geht.

Falls Ihr hier nicht fündig werdet...
noch mehr Hokuspokus gibts hier: www.itbroadcastand... /ffmpeg_howto.html
und hier: ffmpeg.mplayerhq.hu/faq.html
und besonders hier: howto-pages.org/ffmpeg/ (inklusive Bauanleitung)

Wer öfter mal mit ffmpeg arbeitet und in die Tiefen der Kommandozeilenoptionen eintauchen möchte, wird im Archiv der ffmpeg Mailingliste fündig: lists.mplayerhq.hu/pipermail/ffmpeg-user.

Wer andererseits mit der Kommandozeile nichts am Hut hat, wird mit WinFF glücklich (Windows oder Linux), das übrigens auch perfekt für die Stapelverarbeitung vieler Dateien ist.

Zuerst: Versionen-Check

ffmpeg ist nicht gleich ffmpeg - aus lizenzrechtlichen Gründen. Bevor Ihr meine Beispiele ausprobiert, vergleicht erst mal die Versionen:
ffmpeg -version
 
FFmpeg version SVN-r10937, Copyright (c) 2000-2007 Fabrice Bellard, et al.
  configuration: --shlibdir=/usr/lib --prefix=/usr --mandir=/usr/share/man 
  --libdir=/usr/lib --enable-shared --enable-libmp3lame --enable-libogg 
  --enable-libvorbis --enable-libtheora --enable-libfaad --enable-libfaac 
  --enable-libxvid --enable-liba52 --enable-swscaler 
  --enable-pp --enable-gpl --enable-vhook --enable-x11grab --enable-libgsm 
  --enable-libx264 --enable-libamr-nb --enable-libamr-wb
  libavutil version: 49.5.0
  libavcodec version: 51.47.2
  libavformat version: 51.17.1
  built on Nov  7 2007 00:26:14, gcc: 4.1.2 20061115 (prerelease) (SUSE Linux)
FFmpeg SVN-r10937
libavutil   3212544
libavcodec  3354370
libavformat 3346689
Ohne libmp3lame habt Ihr keine Unterstützung für mp3.
Ohne liba52 könnt Ihr keine DVD's de/encodieren.

Meines ist ein fixfertiges SuSE-rpm von Packman, in dem alles Nötige schon dabei ist. Anleitungen zum Kompilieren findet Ihr anderswo. Folgt den Links.

Beispiel 1: Animation aus Einzelbildern

Ich habe (aus Gimp oder SynfigStudio) eine Serie durchnummerierter Bilder exportiert und möchte daraus eine Animation machen.
Das Ganze funktioniert natürlich nicht nur mit JPG, sondern auch mit PNG, aber die Transparenz geht verloren.
ffmpeg -f image2 -i img%d.jpg output.mpg
werden mehr als 9 Bilder benötigt:
ffmpeg -f image2 -i img%02d.jpg output.mpg
-f image2 teilt ffmpeg das Eingabeformat mit (Bilder)
-i img%d.jpg die Input-Datei(en)
%d ist ein Platzhalter für eine einstellige Zahl
%02d für eine zweistellige Zahl, %03d für eine dreistellige, usw.
output.mpg die Ausgabe-Datei (hier mpg, könnte aber auch z.B. avi oder flv sein)

Anhand der Dateiendung der Ausgabe-Datei kann ffmpeg allerlei Default-Einstellungen setzen, die Ihr aber jederzeit auch überschreiben könnt.

Ein Beispiel dafür wäre eine höhere Video-Bitrate, das bedeutet eine bessere Qualität des Filmes, aber auch eine größere Datei:
ffmpeg -f image2 -i img%02d.jpg -b 500k output2.mpg
-b 500k setzt die Video-Bitrate auf 500kbit/s (der default-Wert ist 200k)

Ob die Animation gelungen ist, könnt Ihr gleich überprüfen:

ffplay output.mpg
Ein kleiner Videoplayer ist nämlich im ffmpeg Paket mit dabei.

Beispiel 2: Tonspur hinzufügen

Ich möchte diese Animation um eine Tonspur ergänzen. Sind Video- und Sound-File gleich lang, ist das denkbar einfach:
ffmpeg -i video.avi -i sound.mp3 -sameq videomitsound.avi
-sameq Video-Qualität des Input-Files beibehalten

Nun will ich einer Animation (einem Video) ohne Ton eine leise Hintergrundmusik verpassen. Das mp3 mit der Hintergrundmusik ist länger als das Video und zu laut.

ffmpeg -shortest -i video.avi -vcodec copy \
    -i sound.mp3 -vol 20 -acodec libmp3lame -ac 2 -ab 128k output1.avi
-shortest hör auf, wenn das kürzeste Inputfile endet.
-vcodec copy die Videospur einfach nur kopieren
-vol 20 Lautstärke (20 ist ziemlich leise)
-acodec libmp3lame Audiocodec mp3 (default wäre mp2)
-ac 2 zwei Kanäle (Stereo), default wäre Mono
-ab 128k Audiobitrate von 128kbit/s (default 64k)

Ob sich -sameq und -vcodec copy in diesem Fall (der Codec ändert sich ja nicht) gleich verhalten, weiß ich nicht.

Wird die Audiospur komplizierter, z.B. ein leises Hintergrundgeräusch, darüber gelegentlich Musik abwechselnd mit einem/r Sprecher/in, ist ffmpeg überfordert. Dann ist Audacity das Programm der Wahl zur Audiobearbeitung.

Beispiel 3: Transcodieren

Mit meiner kleinen Digitalkamera habe ich ein Filmchen aufgenommen, das jetzt verkleinert und in ein Flash-Movie konvertiert werden soll.
Zuerst möchte ich mal wissen, womit ich es hier zu tun habe:
ffmpeg -i CIMG0269.AVI
ffmpeg gibt schon mal jede Menge Informationen über den Film aus (Auszug):
Input #0, avi, from 'CIMG0269.AVI':
Duration: 00:02:57.3, start: 0.000000, bitrate: 3964 kb/s
Stream #0.0: Video: mpeg4, yuv420p, 640x480 [PAR 1:1 DAR 4:3], 29.97 fps(r)
Stream #0.1: Audio: adpcm_ima_wav, 44100 Hz, mono, 177 kb/s
Container: avi
Länge: 2min 57,3 sek
Bitrate: 3964 kb/s
Codec: mpeg4
Pixelformat: yuv420p
Größe: 640x480 px
Seitenverhältnis: 4:3
Framerate: 29.97 fps (Frames pro Sekunde)
Und darunter noch eine vergleichbare Zeile zum Audiokanal (wav).

Folgendes ist eigentlich ein Einzeiler, ich habe die Zeile aber in Video und Audio getrennt, um es übersichtlicher zu machen.

ffmpeg -i CIMG0269.AVI -s 400x300 -b 512k \
    -async 50 -acodec libmp3lame -ar 11025 -ab 16k output_klein.flv
-s 400x300 die Größe in Pixel
-b 512k die Video-Bitrate
-async 50 die Audiospur wird auf die Länge des Filmes gestaucht/gestreckt, das ist nötig, weil sich der Audio-Codec ändert.
-acodec libmp3lame der Audiocodec wird mp3 (statt wav)
-ar 11025 die Audio Sampling Frequenz wird verringert (von 44100 Hz)
-ab 16k die Audio-Bitrate wird tüchtig heruntergeschraubt (von 177 kb/s)

Beispiel 4: Thumbnails extrahieren

Ich möchte aus einem Film Thumbnails (kleine Bilder) extrahieren.
ffmpeg -an -ss 0:0:2 -t 0:0:0.001 -i input.mp4 -f image2 -s 110x90 thumb%d.jpg
-an Ton brauche ich dazu überhaupt nicht
-ss 0:0:2 Start bei 2 Sek. (der Vorspann ist bei diesem Film uninteressant)
-t 0:0:0.001 die Dauer (1/1000 Sekunde)
-s 110x90 die Größe des Thumbnails - wie immer bei ffmpeg ist die Reihenfolge der Argumente wichtig!
thumb%d.jpg %d, weil es auch mehr als ein Bild sein könnte

Beispiel 5: Diashow

Ich möchte aus mehreren jpegs eine Diashow erstellen. Die Bilder sind in der gewünschten Reihenfolge durchnummeriert, allerdings zu groß (die Auflösung der Kamera).
ffmpeg -r 0.3 -f image2 -i img%d.jpg -r 25 -b 512k -s vga output.avi

Die Reihenfolge der Argumente ist wichtig.

-r 0.3 die Framerate des Inputs, ein Bild wird dann ca. 3 Sek. lang angezeigt
-f image2 das Eingabeformat (Bilder)
-r 25 die Framerate des Outputs, 25 Frames pro Sekunde
-s vga die Größe in Pixel, vga ist eine Abkürzung für 640x480 (siehe ffmpeg's manpage)

Etwas seltsam ist, dass es mit dem ersten Bild ein Problem gibt, es wird zu kurz gezeigt. Ich schätze, das liegt an der Input-Framerate. Mein Trick: das erste Bild verdoppeln (cp img1.jpg img0.jpg), den obigen Befehl wiederholen und dann vom Anfang des Filmes ein Stück wegschneiden (wieder mit ffmpeg).

ffmpeg -i output.avi -ss 0:0:0.6 -sameq output_clean.avi

Seite 1 von 3