Logo

Was mir in Sachen Linux einfällt

Video- und Audio-Bearbeitung: FFmpeg

Update vom 28.1.15 Logo MPEG

Dir ist ja sicherlich auch schon aufgefallen, dass es Multimedia-Dateien in den verschiedensten Formaten gibt. Audios kommen als "wav", "wma", "mp3" und "ogg" daher, um nur die wichtigsten zu nennen. Und bei Videos sieht es noch schlimmer aus: "mpeg", "wmv", "flash", "mp4", "h264", "webm", "mov", "avi" usw. Das Ganze wird bei Videos garniert durch mindestens 2 verschiedene Ansichtsformate (4:3 und 16:9) und alle möglichen Bildgrößen von 160x120 bis zu 1920x1080 (siehe auch hier.). Es wird nicht dadurch leichter, dass die Geräte, die Filme abspielen können, verschiedene Bildschirmgrößen haben und Filme nicht in jedem Format akzeptieren.

Logo MP3

Die Krönung habe ich hier in Form eines MP3-Players (Archos), der Filme zwar abspielt, aber nur dann, wenn sie die Bildgröße 220x176 Pixel haben, das Video in "xvid" mit dem Qantisierer h263 bei einer Bitrate von 300kB vorliegt und ein Ton in MP2 und einer Abtastrate von 44100 und einer Bitrate von 64k dabei ist. Überdies muss das Bild um 180 Grad gedreht und gespiegelt sein. Noch Fragen? Glücklicherweise spielen heutige Smartphones so ziemlich alle Videos ab, die in einem MP4-Container daherkommen ...

Logo FLAC-Audio

Dein Telefon kann Videos, Dein Fotoapparat auch, vielleicht hast Du eine Videokamera. Wie heißen die Dateien, die aus den Geräten auf Deinem Rechner landen? Nein, der Dateiname ist uninteressant, die Dateiendung ist wichtig. AVI? MOV? 3GP? MP4? Wenn Du es weißt, dann heißt das noch nicht, dass Du über den Inhalt der Dateien Bescheid weißt. Oben habe ich nämlich ein paar Dinge durcheinander gewürfelt: ein paar von den Bezeichnungen kennzeichnen einen Behälter (in der Fachsprache "Container") und ein paar sagen aus, wie das Video kodiert ist.

Logo Opus

Ich mache es kurz und beschränke mich auf die wichtigsten Begriffe/Formate:

Logo Quicktime

Reine Audiodateien fallen schon mal aus den Erklärungen weitestgehend weg, denn ein Ton im Format "wav" wird abgespeichert im Behälter ".wav", "mp3"-kodiert --> ".mp3", "ogg"-kodiert --> ".ogg".

Wozu das Ganze?

Logo Xvid

Nehmen wir mal an, Du hast mit Deinem Fotoapparat einige Videos von Omas Geburtstag gedreht und möchtest Oma eine DVD schenken mit den Filmen drauf. Dann hast Du schon mal Arbeit, denn Deine Knipskiste liefert garantiert nicht das Format, das zwingend auf eine DVD muss. Ausweg: Du benutzt Schnittsoftware, mit der Du die Filmchen aneinander hängst und die anschließend das fertige Video auf DVD brennt. Glück gehabt ...

Logo H264

Wenn Du irgendetwas mit Video- und Audio-Dateien machen möchtest, dann nimmst Du am Besten ffmpeg und Co.. Das mit dem "und Co." liegt daran, dass es einen zweiten Entwicklungszweig namens "libav" gibt, der genau das gleiche macht und genauso arbeitet. Selbst die Webseiten sind sich zum Verwechseln ähnlich: ffmpeg und libav. Ich werde im Folgenden immer "ffmpeg" schreiben, weil der Name sehr geläufig ist, aber es gilt alles auch für "avconv" von libav.org. Logo DV

Mit "irgendetwas" meine ich:

Logo DVD

Oder Du wandelst das Material vom Fotoapparat mit Hilfe von ffmpeg um in das Format, das sich auf DVD brennen lässt. Das folgende Beispiel ist mit eins der angenehmsten, denn ffmpeg (bzw. avconv von libav) hat dafür ein Umwandel-"Profil" parat: "target=dvd".

ffmpeg     -i DeinFilm.ext     -target pal-dvd      AusgabeDatei.mpg

Ich habe diese Zeile künstlich auseinander gezogen, damit deutlich wird, dass die Zeile aus 4 Teilen besteht. Normalerweise reicht zum Trennen ein Leerzeichen. Jetzt zu den 4 Teilen:

Ich kann das Profil auch ersetzen durch Einzelanweisungen. Das sieht dann so aus:

ffmpeg -i DeinFilm.ext -c:v mpeg2video -s 720x576 -aspect 16:9 -r 25 -b:v 8000 -c:a mp2 -ac 2 -ar 48000 -b:a 192k AusgabeDatei.mpg

Das erläutere ich jetzt mal näher, denn so sieht grundsätzlich jede Wandlung aus und daraus lässt sich die Arbeit mit ffmpeg gut demonstrieren.

ffmpeg -i DeinFilm.ext -c:v mpeg2video -s 720x576 -r 25 -b:v 8000 -aspect 16:9 -c:a mp2 -ac 2 -ar 48000 -b:a 192k AusgabeDatei.mpg

dies ist der Befehl

der Film, der gewandelt werden soll

--- jetzt folgt die Anweisung für das Bild
dieses Videoformat wird benutzt
diese Bildgröße bei PAL
die Bildfrequenz bei PAL
der Videodatenstrom maximal
das Seitenverhältnis

--- und jetzt die Anweisung für den Ton
dieses Audioformat wird benutzt
mit 2 Audiokanälen
und dieser Abtastrate
der Audiodatenstrom maximal

die Ausgabedatei

Eigentlich besteht eine Befehlszeile also aus 5 Teilen: der eine Teil "target" wird zu 2 Teilen - eine Anweisung zur Umwandlung des Bildes und eine Anweisung zur Umwandlung des Tons. Möchtest Du nur ein Bild als Ausgabe, dann schreibst Du für den Ton -an hin (was für "audio no" steht) und im umgekehrten Fall -vn. Logo AVCHD

In den beiden Beispielen oben ist das Ergebnis gleich. Und es ist egal, was Dein Apparat für Filme macht, ob es HD-Videos sind, ob sie im MOV-Container abgespeichert werden, ob mit 30 Bildern/Sekunde und so fort. Was das im Paket enthaltene Programm ffplay abspielen kann, wird umgewandelt! Übrigens: alle Einstellungen einer Ursprungsdatei werden in die Ausgabedatei übernommen, wenn nicht ausdrücklich eine Anweisung zum Ändern in der Befehlszeile auftaucht. Hat z.B. das Ausgangsvideo ein Seitenverhältnis von 4:3 und der Option -aspect taucht beim Umwandeln nicht auf, dann hat das Ausgabevideo das gleiche Seitenverhältnis.

Logo DivX

Datenstrom

Ich muss an dieser Stelle auf den Video- und Audio-Datenstrom eingehen, denn viele können damit nicht viel anfangen. Schau zuerst mal hier rein: Dann geht es weiter:

Die Bestimmungen für das Video auf einer DVD besagen, dass der Datenstrom maximal 9000kB/Sekunde betragen darf. Dann hätte das Video die bestmögliche Qualität. Ich habe oben "-b 8000" für das Bild hingeschrieben, das ist sehr gute Bildqualität. Wenn diese Rate kleiner gewählt wird, leidet die Qualität, aber die Dateien werden kleiner und es passt mehr Filmlänge auf die DVD. Das gleiche gilt für die Audio-Datenrate, 192K entspricht in etwa CD-Qualität. Beachte: beim Videodatenstrom kannst Du die Zahl frei wählen, beim Audiodatenstrom muss die Zahl ein Vielfaches von 32 sein! Logo Webm

Szenenwechsel. Wo und wie kannst Du Hilfe bekommen, wenn Du mehr machen willst, als ich Dir hier zeige? Antwort: Vielleicht in irgendwelchen Foren, aber auf keinen Fall bei ffmpeg.org oder libav.org. Denn: die Fähigkeiten, die das Programm verpasst bekommen hat, übersteigen die Dokumentationsfähigkeiten aller Beteiligten um Zehnerpotenzen. Mit anderen Worten: es gibt keine anständige verständliche, wirklich hilfreiche Dokumentation, wie es sie z.B. bei FFmpeg-Logo Gimp gibt. Was Du tun kannst: rufe ffmpeg auf mit ffmpeg --help. Solltest Du Dich wirklich mit der Ausgabe dieses Befehles beschäftigen wollen, dann sieh zu, dass Du genug Zeit und zu trinken hast ...

Solltest Du dann noch Zeit haben, dann gib in der Konsole den Befehl man ffmpeg ein und wenn Du dann noch nicht mit Deinem Leben abgeschlossen hast, dann gibts ja noch die "Dokumentation" auf ffmpeg.org.

Zurück zu unserer Seite. Im folgenden zeige ich in Kurzform die Umwandlung von Audio und Video in verschiedene Formate. Du hast freie Hand, welche Audiocodecs Du mit welchen Videocodecs in welche Behälter packst. Allerdings gibt es bestimmte "Vorschriften" und diverse Abmachungen. Zu den Vorschriften gehört: auf einer DVD muss das Bild im mpeg2-Verfahren kodiert sein, der Ton darf im ac3-Format und/oder im mp2-Codec dabeisein. Dabei muss das Bild (bei uns in Europa) 720 Pixel breit und 576 Pixel hoch sein und die Bildfrequenz beträgt 25 Bilder/Sekunde. Sonst spielt ein handelsüblicher DVD-Player das Ergebnis nicht ab. Für Blue-Ray-Scheiben gilt: Das Video wird kodiert im Verfahren H.264/MPEG-4 AVC, der Ton wird wie bei DVD kodiert, die Bildgrößen dürfen varrieren von 720x576 bis 1920x1050. Die weitere Spezifikation ist hier uninteressant. Zu den Abmachungen gehört, in welchen Containern welche Tonkodierung mit welche Bildkodierung normalerweise zusammen zu finden sind. Eine Liste führt hier zu weit, mach Dich bei Interesse schlau bei Wikipedia. Eine interessante Abmachung gibt es darüber hinaus: wenn Audio allein vorliegt, dann ist das analoge Tonsignal 44100mal in der Sekunde abgetastet worden, im Zusammenhang mit Bild 48000mal.

Hier die Liste der wichtigsten Codecs. Wenn eine Multimediadatei auf einem Computer abgespielt werden soll, dann kannst Du so ziemlich alles mixen ...

Audio/VideoFormatKodierbefehlBehälter
Audiowavpcm_s16leCD, MOV, AVI
Audiomp3libmp3lameMP3, MP4, WebM, diverse Player
Audiomp2mp2MPG, DVD, DVB, M2TS
AudioogglibvorbisWebM, MKA, diverse Player
Audiowmawmav2WMA, WMV, MKA
AudioflacflacFLAC (verlustfrei), wenige Player
Videompegmpeg2videoMPG, MPEG, M2TS, M2T, DVD, DVB, MKV
Videoh264libx264MP4, MOV, AVI, MKV
Videoh265libx265MP4, MOV, AVI, MKV (neu)
VideoxvidlibxvidMP4, MOV, AVI
Videomp4mpeg4MP4, AVI, MOV, MKV
VideoflashflvFlash-Video
VideowebmlibvpxWeb-Media
Videowebmlibvpx-vp9Web-Media (relativ neu)
VideotheoralibtheoraOGG, OGM, MKV
Videowmvwmv2WMV, AVI, MKV
VideodvdvvideoMini-DV
Die vollständige Liste erhältst Du mit ffmpeg -codecs

Wenn Du jetzt ein Video umkodieren willst, musst Du wissen, wofür es bestimmt ist und welches Containerformat dafür am Besten geeignet ist. Womöglich verlangt ein Gerät auch noch eine spezielle Zusammenstellung von Codecs und bestimmte Datenströme. Das Schwierige dabei ist in der Regel, heraus zu bekommen, was verlangt wird (siehe der MP3-Player oben). Dazu noch zwei Beispiele:

1. für das Telefon Samsung SGH F480

ffmpeg -i infile.ext -f mp4 -s 320x240 -c:v mpeg4 -b:v 160k -c:a libfaac -b:a 128k -ar 48000 outfile.mp4

2. für den digitalen Bilderrahmen Aiptec-Picasso:

ffmpeg -i infile.ext -f mov -s 352x208 -c:v mpeg4 -b:v 300k -c:a pcm_mulaw -b:a 128k -ar 16000 outfile.mov

Vergleiche das mal mit der ausführlichen Zeile oben. Du wirst bemerken, dass noch eine Befehlsabteilung dazu gekommen ist:

  -f mp4   bzw.   -f mov
.

Diese Anweisung legt das Format des Ausgabecontainers fest. Im Prinzip ist das unwichtig, denn ffmpeg versucht, aus der Dateiendung das richtige Format zu "erraten". Zur Sicherheit habe ich es hier benutzt und so kann ich diese Festlegung auch zeigen. Sie ist in einem anderen Zusammenhang nützlich: lesen von Bildschirm oder Webcam zum Beispiel.

Jetzt die Wandlung eines Audios zum Beispiel von wav nach mp3:

ffmpeg -i Quelldatei.wav -c:a libmp3lame -ac 2 -ab 256k -ar 44100 Ausgabe.mp3

Jetzt folgen noch ein paar nützliche Optionen, die ich immer mal wieder benutze:

-deinterlace -q:v (zahl) -pass (zahl) -c:( a oder v) copy -vol (zahl)

nützlich, wenn das Ausgangsmaterial eine TV-Aufzeichnung ist
legt die Ausgabequalität im Vergleich zur Quelldatei fest:
   2=am Besten, 31=am Schlechtesten
Zur Verbesserung der Qualität kann man in 2 Durchgängen
   kodieren, Beim ersten Mal steht hier "1", beim zweitenmal "2"
copy nach -acodec oder -vcodec: der Datenstrom wird kopiert
legt für den Ton die Lautstärke fest: 0 bis 256

Zum vorläufigen Abschluss noch die Information, dass Du nicht unbedingt alles mit den Fingern eintippen musst, denn es gibt jede Menge grafische Oberflächen für ffmpeg, die sich mit der Maus bedienen lassen und die alle eine Reihe "Presets" mitbringen, also Voreinstellungen für bestimmte Anwendungsfälle. Beispiele für Presets sind die beiden Kodierbeispiele etwas weiter oben. Und diese Presets kannst Du mit etwas Kenntnis selbst ergänzen. Letzteres ist auch der Grund, warum ich die grafischen Oberflächen erst jetzt erwähne: ohne Grundkwissen kannst Du sie nicht bedienen. Es sind nach meiner Kenntnis:



Update vom 27.12.2011

Die Entwicker haben ein neues Konzept eingeführt, das es einfacher macht, mit mehr als einer Bild- und Tonspur umzugehen. Hier meine neuesten Erkenntnisse.

Es gibt die Anweisungen -vcodec und -acodec nicht mehr lange. Jetzt schon funktioniert die neue Anweisung -codec bzw. kurz -c, die in folgener Art und Weise benutzt wird:

-c:v (codec) -c:v:(zahl) (codec) -c:a (codec) -c:a:(zahl) (codec) -c copy -c:v copy -c:a copy

wie bisher -vcodec (codec)
dito, die (zahl) bestimmt die Videospur, wenn mehr als eine, bei 0 beginnend
wie bisher -acodec (codec)
dito, die (zahl) bestimmt die Audiospur, wenn mehr als eine, bei 0 beginnend
kopiert alle Video- und Audiodatenströme in die Ausgabedatei
kopiert den Videodatenstrom (wahlweise wieder mit (zahl) bestimmbar)
kopiert den Audiodatenstrom (wahlweise wieder mit (zahl) bestimmbar)

Die Umstellung betrifft auch die Bitrate:

-b (Bitrate) --> -b:v (Bitrate) -b (Bitrate) --> -b:v:(zahl) (Bitrate) -ab (Bitrate) --> -b:a (Bitrate) -ab (Bitrate) --> -b:a:(zahl) (Bitrate)

Die Qualität der Datenströme ist hier einstellbar, für Audio und Video getrennt und wahlweise kann jeder Datenstrom getrennt und für sich eingestellt werden.

Statt der Bitrate kannst Du auch die Qualität des Videos bestimmen

-q:v (zahl zwischen 2 und 31) oder -qscale:v

Qualität des Videos: 2 am Besten, 31 am Schlechtesten

Es gibt auch die Option, zu bestimmen, welche der Datenströme von welcher Eingabedatei (in diesem Fall die erste Datei, also Nummer 0)in der Ausgabedatei erscheinen sollen (bei DVB-S sind oft eine Videospur, 3 Tonspuren und 2 Untertitelspuren versammelt). Das gab es bisher schon, war aber vergleichsweise umständlich zu bestimmen. Jetzt:

-map -map 0 -map 0:v -map 0:a -map 0:a:(zahl) -map 0:s -map 0:s:(zahl) -map 0 -map -0:a:(zahl) -map 0 -map -0:s -map 0 -map -0:s:(zahl)

dies ist die Option für sich
übernimm alle Datenströme
speichere alle Bildspuren (meist gibt es nur eine)
speichere alle Audiospuren
speichere Audiospur (zahl), Zählung fängt bei 0 an!
speichere die Untertitelspuren
speichere die Untertitelspur (zahl)
speichere alle Spuren außer der Tonspur (zahl), beachte das Minuszeichen vor der zweiten Null
speichere alles außer den Untertitelspuren
speichere alles außer der Untertitelspur (zahl)

Mit einer dieser Optionen kann man prima z.B. aus eine Musikalfilm die 2.Tonspur für den MP3-Player abzwacken:

ffmpeg -i Musikfilm.mpg -map 0:a:1 -c:a libmp3lame -b:a 256k -ar 44100 -ac 2 Filmmusik.mp3

Das nächste Beispiel gilt für Aufzeichnungen vom HD-Filmen. Deren Codierung enthält nur alle etwa 11 Sekunden ein Vollbild und das ist sehr ungünstig zum Schneiden. Deshalb wandle ich sie um. Hier kann ich schön die -map-Option darstellen. ffmpeg -i filmname.ext gibt nur die Infos zum Film aus (Arte, deswegen deutsch und französisch):

ffmpeg -i "Reiseportraits.m2t"
Input #0, mpegts, from 'Reiseportraits.m2t':
  Duration: 00:00:50.68, start: 11861.482011, bitrate: 13030 kb/s
  Program 10302 
    Stream #0:0[0x13f7]: Video: h264 (High), yuv420p, 
	    1280x720 [SAR 1:1 DAR 16:9], 54.33 fps, 50 tbr, 90k tbn, 100 tbc
    Stream #0:1[0x13f8](deu): Audio: mp2  48000 Hz, stereo, s16, 192 kb/s
    Stream #0:2[0x13f9](fra): Audio: mp2 48000 Hz, stereo, s16, 192 kb/s
    Stream #0:3[0x13fa](deu): Subtitle: dvb_teletext
    Stream #0:4[0x13fb](deu): Subtitle: dvb_subtitle (hearing impaired)
    Stream #0:5[0x13fc](deu): Audio: ac3 48000 Hz, stereo, s16, 448 kb/s
    Stream #0:6[0x13fe](fra): Subtitle: dvb_subtitle (hearing impaired)

ich möchte in dem gewandelten Film alle Tonspuren haben, die Untertitel interessieren mich nicht, auch nicht der Tetelext. Deshalb lautet der Befehl:

ffmpeg -i "Reiseportraits.m2t" -c:v libxvid -vtag XVID -r 25 -aspect 16:9 -bufsize 4096 -g 12 -q:v 2 -c:a copy -map 0:v -map 0:a "reise.avi"

ffmpeg zeigt mir in der Ausgabe das Mapping:

Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> libxvid)
  Stream #0:1 -> #0:1 (copy)
  Stream #0:2 -> #0:2 (copy)
  Stream #0:5 -> #0:3 (copy)

Und der fertige Film sieht so aus:

Output #0, avi, to 'reise.avi':
  Metadata:
    ISFT            : Lavf54.29.104
    Stream #0:0: Video: mpeg4 (XVID / 0x44495658), yuv420p, 
	1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 tbn, 25 tbc
    Stream #0:1(deu): Audio: mp2, 48000 Hz, stereo, 192 kb/s
    Stream #0:2(fra): Audio: mp2, 48000 Hz, stereo, 192 kb/s
    Stream #0:3(deu): Audio: ac3, 48000 Hz, stereo, 448 kb/s

Alles klar?


Ich werde versuchen, diesen Text "up to date" zu halten. Weiterführende Links:

Viel Spaß beim Rumspielen!