Spielwiese Home

Videohokuspokus mit ffmpeg


Beispiel 6: Audiocodecs

Ich möchte ein wav (=unkomprimiertes) Audiofile in mp3 oder oggvorbis konvertieren.
Grundsätzlich genügt für mp3:
ffmpeg -i sound.wav sound.mp3
Allerdings ist die default Audiobitrate bei ffmpeg 64kbit/s. Das ist sehr schlechte Audioqualität. Deshalb setze ich die Bitrate auf 192kbit/s (sehr gut).
ffmpeg -i sound.wav -ab 192k sound2.mp3
Für oggvorbis funktioniert das ganz ähnlich.
ffmpeg -i sound.wav sound.ogg
Einen Unterschied zu mp3 gibt es beim Setzen der besseren Audioqualität.
ffmpeg -i sound.wav -aq 10 sound2.ogg
-aq 10 setzt die Audioqualität (oggvorbis hat eine variable Bitrate).

Was es mit -aq auf sich hat, wird auf www.vorbis.com erklärt (englisch).

Vergleichen wir doch mal die Dateigrößen (Das Musikstück ist 2min 50s lang).
   29M  sound.wav
  4,1M  sound2.ogg
  4,0M  sound2.mp3
  1,4M  sound.mp3
  1,2M  sound.ogg

Wie man ID3 Tags mit ffmpeg setzen kann, habe ich tatsächlich auch noch heraus gefunden.

-title der Titel des Musikstücks
-author der Autor
-album das Album

Natürlich ist ffmpeg unpraktisch, wenn man eine ganze CD rippen will, aber zwischendurch schnell mal was konvertieren geht prima. Vor allem wenn man Videocodec und Audiocodec in einem Rutsch bearbeitet.

Beispiel 7: Filme aneinander hängen

Ich möchte mehrere kurze Filme (Animationen) aneinanderhängen zu einem längeren Film:
Wichtig dabei ist, dass alle die gleichen Bitraten, Auflösungen, Codecs und Frameraten haben müssen!
Leider funktioniert das nur mit mpeg1 und mpeg2 und ist außerdem verlustbehaftet, weil transcodiert werden muss.
cat film1.mpeg film2.mpeg > film_t.mpeg

ffmpeg -i film_t.mpeg -sameq langfilm.mpeg

Ja, das gute alte cat. Ihr habt richtig gesehen.
Der zweite Schritt setzt die Timestamps wieder richtig.

-sameq Video-Qualität des Input-Files möglichst beibehalten

Zwei überaus gefinkelte Methoden, wie Filme aneinandergehängt werden können, werden hier beschrieben:
1) mit mkfifo und/oder yuv4mpegpipe: ffmpeg.org/faq.html
2) mit redirects und image2pipe: www.wlug.org.nz/FFmpeg

Beispiel 8: Tonspur extra bearbeiten

Ich möchte die Tonspur eines Filmes getrennt nachbearbeiten (mit Audacity), die Videospur aber unverändert lassen. Zuerst extrahiere ich den Sound.
ffmpeg -i film.mp4 -vn audio.wav

Als Ausgabeformat wähle ich das unkomprimierte wav. Der original Audiocodec des Filmes wäre mpeg4aac, Audacity kann aber mit .aac nicht umgehen, da das ein proprietäres Format ist. (Update: konnte!, Audacity nimmt inzwischen ffmpeg zu Hilfe.)
ffmpeg kommt damit klar, wenn libfaac einkompiliert ist (--enable-libfaac).

-vn die Videospur wird nicht benötigt

Außerdem brauche ich die Videospur ohne Audio in einem Extrafile.

ffmpeg -i film.mp4 -an -vcodec copy film_stumm.mp4
-an ohne Ton
-vcodec copy die Videospur unverändert kopieren

Nachdem ich das audio.wav mit Audacity bearbeitet und als mp3 exportiert habe (audio.mp3), setze ich die stumme Videospur und das neue Soundfile zusammen.

ffmpeg -i film_stumm.mp4 -i audio.mp3 -vcodec copy -async 10 -ab 128k newfilm.mp4

ffmpeg konvertiert die Audiospur automatisch wieder in mpeg4aac.

-vcodec copy das Video einfach nur kopieren
-async 10 durch die (mehrmalige) Änderung des Codecs ist das Soundfile ein paar Sekunden länger als der Film. ffmpeg staucht das wieder zurecht, damit Bild und Ton synchron bleiben.
-ab 128k die Audio-Bitrate (Qualität)

Beispiel 9: anamorphe Filme korrigieren

Hasst Ihr das nicht auch, wenn 16:9 Filme auf 4:3 gezerrt werden (ohne Balken) und alle Gesichter befremdend nach Bananen oder Gurken aussehen? Man bezeichnet das als anamorph. Mir persönlich sind die schwarzen Balken oben und unten lieber.
Hier habe ich z.B. so einen Problemfall: Das Video hat eine Auflösung von 352x288px. Das ist nicht wirklich 4:3, aber fast. Damit das Ganze halbwegs ein Seitenverhältnis von 16:9 kriegt, ändere ich die Auflösung auf 352x200. Dann sehen die Gesichter auch wieder menschlich aus.
ffmpeg -i banane.flv -s 352x200 -acodec copy -sameq normal.flv
-s 352x200 das neue Seitenverhältnis
-acodec copy die Tonspur unverändert kopieren
-sameq die Videoqualität beibehalten

Schlussendlich sollte der ganze Film aber doch wieder ein Seitenverhältnis von 4:3 bekommen, nur eben mit Balken.

Kopfrechnen:
4:3=1,333333333
352:1,333333333=264,000...
(264-200):2=32

Die Balken oben und unten müssen jeweils 32 Pixel hoch sein.
ffmpeg -i banane.flv -s 352x200 -padtop 32 -padbottom 32 \
    -acodec copy -sameq normal2.flv 
-padtop 32 oben einen Balken von 32 Pixel Höhe dazu
-padbottom 32 unten auch

Beispiel 10: Film archivieren

Eine DVD rippen als Backup, oder um z.B. einen Home Media Server zu betreiben.

Was ist nötig:

Ein DVD Laufwerk :)
vobcopy und ffmpeg
ffmpeg mit folgenden Libraries:
  1. libmp3lame
  2. liba52
Plattenplatz zu hauf
Eine wahnsinns CPU oder Geduld.

Zuerst folgende Programme installieren:
libdvdread und vobcopy
Vobcopy brauchen wir, um die .VOB Dateien aus der DVD zu extrahieren. Vobcopy benötigt dazu wiederum libdvdread.

Die DVD einlegen, Informationen einholen, dann mit vobcopy auf Festplatte kopieren.
vobcopy -I

vobcopy -m -o /home/ein/ordner/

Mehr zu vobcopy mit man vobcopy

Variante: Falls Ihr Mplayer installiert habt, könnt Ihr das Ganze auch direkt mit dem Player machen.
mplayer dvd://2 -dumpstream -dumpfile /home/mein/ordner/title2.vob
Das kopiert den zweiten Titel der DVD auf Festplatte.

In den Arbeitsordner wechseln und gleich nochmal neugierig sein.

ffmpeg -i VTS_01_1.VOB

Input #0, mpeg, from 'VTS_01_1.VOB':
Duration: 00:24:47.5, start: 0.360000, bitrate: 5224 kb/s
Stream #0.0[0x1e0]: Video: mpeg2video, yuv420p, 720x576 
			[PAR 64:45 DAR 16:9], 6430 kb/s, 25.00 fps(r)
Stream #0.1[0x80]: Audio: liba52, 48000 Hz, stereo, 192 kb/s
Stream #0.2[0x81]: Audio: liba52, 48000 Hz, stereo, 192 kb/s
Stream #0.3[0x21]: Subtitle: dvdsub
Zum Testen brauche ich nur die ersten 20 Sekunden des Filmes, dann kann ich mich an mein Wunschergebnis annähern, ohne ganze Tage davor zu sitzen.
ffmpeg -i VTS_01_1.VOB -t 0:0:20 test.avi
Dieses test.avi schaue ich mir mit ffplay, mplayer und totem an.
Tatsächlich ist der Film scheußlich verzerrt (16:9 auf 4:3) und die Qualität ist zu schlecht. Nach vielen Versuchen, finde ich die richtigen Einstellungen.
ffmpeg -i VTS_01_1.VOB -b 900k -s 640x480 -aspect 4:3 \
  -acodec libmp3lame -ab 128k -async 50 ausgabe.avi -padtop 60 -padbottom 60
-b 900k Videobitrate von 900kbit/s, ein Kompromiss zwischen Qualität und Dateigröße
-s 640x480 die Auflösung in Pixel
-aspect 4:3 das Seitenverhältnis muss ich diesmal angeben, um das originale zu überschreiben
-acodec libmp3lame Audiocodec mp3
-ab 128k Audiobitrate (default wäre 64kbit/s)
-async 50 stellt sicher, dass Bild und Ton synchron bleiben (der Audiocodec ändert sich ja)
-padtop 60 oben ein Balken von 60 Pixel Höhe
-padbottom 60 unten auch

Eine Anmerkung zur Zeit: Zum Umwandeln des 24 min 47 s langen Filmes benötigte ffmpeg mit meiner 1.30GHz CPU ca. 17 min. Das ist doch gar nicht so schlecht.

Zur Dateigröße:

VTS_01_1.VOB  927MB
ausgabe.avi   185MB
Prima!

Seite 2 von 3