Aktionen

Ffmpeg

Aus exmediawiki

Einführung

Das ffmpeg-Projekt (www.ffmpeg.org) besteht aus einer Reihe von freien Computerprogrammen und Programmbibliotheken, welche digitales Video- und Audiomaterial aufnehmen, konvertieren, senden (streamen) und in verschiedene Containerformate verpacken können. Unter anderem enthält es mit libavcodec eine Sammlung unterschiedlicher Audio- und Video-Codecs.

ffmpeg wird unter Linux und anderen Unix-artigen Systemen entwickelt und wurde auch auf andere Betriebssysteme und Plattformen portiert. Bekannte Programme die ffmpeg verwenden, sind zum Beispiel Avidemux, ffdshow, GStreamer, HandBrake, MediaCoder, MPlayer, VLC media player, xine, ZoneMinder und Kdenlive.

Komponenten und Bibliotheken

  • ffmpeg ist ein Kommandozeilenprogramm, um von einem Video-, Audio- oder Bildformat zu einem anderen zu konvertieren.
  • ffserver ist ein HTTP-Multimedia- bzw. RTP- und RTSP-Streaming-Server für Audio- und Video-Übertragungen (auch live) über das Internet.
  • libavcodec enthält alle ffmpeg-Audio- und -Video-Encoder und -Decoder. Die meisten Codecs wurden von Grund auf neu geschrieben. Diese Bibliothek kann von anderen Programmen benutzt werden, um dann die Filme selber darzustellen.
  • libavformat enthält die Container-Parser und -Ersteller für alle herkömmlichen Audio- und Video-Containerformate (beispielsweise AVI, Mov, MKV, Ogg/Ogg Media etc.).

Syntax

$ ffmpeg [[infile Options][`-i' infile]]... {[outfile Options] outfile}...
  1. infile Options Optionen für die Eingangsdatei setzen
  2. -i infile Dateiname der Eingangsdatei
  3. outfile Options Optionen für die Ausgangsdatei setzen
  4. outfile Dateiname der Ausgangsdatei

Es ist wichtig die Reihenfolge streng einzuhalten. Auch beim setzen der Optionen. Was soll als erstes gemacht werden? Was danach? etc.

Info Optionen

-L                                                        die Lizenz
-h                                                        Hilfe
-version                                                  aktuelle Version 
-formats                                                  Liste der verfügbaren Formate und Codecs, unterteilt in: 
                                                                D für decodieren möglich
                                                                E für encodieren möglich
                                                                V/A/S für Video- Audio- Subtitel- Codec
-i Dateiname                                               -i steht eigentlich nicht für Information 
                                                                sondern für infile (siehe unten) 
                                                                aber mit z.B.: $ ffmpeg -i file.avi  
                                                                erhält man einige hilfreiche Infos über das jeweilige File
                                                                (wenn man die Fehlermeldung ignoriert;-)

Generelle Optionen

-i Dateiname                                          Dateiname der Eingangsdatei
-y                                                    überschreiben
-t Dauer                                              Aufnahmne- bzw. Transkodierzeit in Sekunden (gut wenn man nur einen kurzen Test- Schnipsel von ein paar Sekunden transkodieren möchte)
-fs Größenlimit                                       setzt das Limit der (Ausgabe-) Dateigröße
-metadata key=value                                   Metadaten hinzufügen z.B.:

Bsp.: $ ffmpeg -i in.avi -metadata title="my title" out.flv
-dframes Zahl                                         setzt die Zahl der aufzunehmenden Datenframes
-target Filtyp                                        den Ausgangs- Datentypen spezifizieren
                                                                "vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...z.B.:
Bsp.: $ ffmpeg -i in.avi -target vcd VCD-out.mpg
-loop_output Anzahl                                   setzt die Anzahl der gewünschten Loop- häufigkeit (nur für Formate die Loop unterstützen) 
                                                                Anzahl "0" bedeutet Dauerloop
-async samples per second                             synchronisiert nach dem encoden wieder die audio- mit der videospur, guter Wert = 50


Video Optionen

-b Bitrate                                            setzt die Bitrate in "kbit/s", Default- Wert = 200k

Bsp.: $ ffmpeg -i in.avi -b 200k out.mpg
-vframes Anzahl                                       setzt die Anzahl der aufzunehmenden Videoframes
-vcodec Codec- Name                                   Erzwinge erwünschten Codec, siehe List of Codecs (copy um alten Codec beizubehalten)
-r Framerate                                          setzt die Framerate, Default = 25
-s Framegröße                                         setzt die Framegröße, Framegröße = z.b. 352x200, 
                                                      oder eine gängige Größe mit Hilfe der jeweiligen Abkürzung verwenden: 
sqcif  -> 128x96 
qcif   -> 176x144 
cif    -> 352x288 
4cif   -> 704x576 
16cif  -> 1408x1152 
qqvga  -> 160x120 
qvga   -> 320x240 
vga    -> 640x480 
svga   -> 800x600 
xga    -> 1024x768 
uxga   -> 1600x1200 
qxga   -> 2048x1536 
sxga   -> 1280x1024 
qsxga  -> 2560x2048 
hsxga  -> 5120x4096 
wvga   -> 852x480 
wxga   -> 1366x768 
wsxga  -> 1600x1024 
wuxga  -> 1920x1200 
woxga  -> 2560x1600 
wqsxga -> 3200x2048 
wquxga -> 3840x2400 
whsxga -> 6400x4096 
whuxga -> 7680x4800 
cga    -> 320x200 
ega    -> 640x350 
hd480  -> 852x480 
hd720  -> 1280x720 
hd1080 -> 1920x1080 
-aspect Format                                        setzt Format, z.B.: 4:3, 16:9, 1.3333, 1.7777, etc.

Bsp.: $ ffmpeg -i input.flv -target pal-dvd -aspect 4:3 output.mpg
-vf crop=Breite:Höhe:s:y                              schneidet gewünschten Teil des Bildfensters aus z.B.:

Bsp.: $ ffmpeg -i in.avi -vf crop=720:460:0:80 out.avi
-newvideo                                             legt eine neue Videospur über die Alte
-vn                                                   disable Video (-Aufnahme)
-sameq                                                Videoqualität des Inputfiles beibehalten
-pass Durchgangszahl                                  "2-Pass-Encoding", das bedeutet, 
                                                                dass dasselbe File zwei mal hintereinander Encodiert wird, 
                                                                wobei ffmpeg das erste mal ein Logfile schreibt, 
                                                                das es beim zweiten Durchgang zur Optimierung verwendet. 
                                                                Es dauert dann zwar doppelt so lange, 
                                                                aber der Qualitätsgewinn bei ziemlich gleicher Filegröße, machts wieder wett.

Bsp.: $ ffmpeg -i in.vob -pass 1 -b 1200k -ab 128k -async 50 out.mp4
      $ ffmpeg -i in.vob -y -pass 2 -b 1200k -ab 128k -async 50 out.mp4
      
      -pass 1 -> der erste Durchgang
      -y -> das erste File überschreiben
      -ab -> Audiobitrate (siehe unten)
      -pass 2 -> der zweite Durchgang

Audio Optionen

-aframes Anzahl                                       setzt die Anzahl der aufzunehmenden Videoframes
-ar Samplingrate                                      setzt die Samplingrate, Default- Wert = 44100 Hz

Bsp.: $ ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2 
-ab Bitrate                                           setzt die Bitrate in bit/s, Default- Wert = 64k  -> eher schlechte Qualität 
                                                                                                            128k -> gute Qualität
                                                                                                            192k -> sehr gute Qualität
-aq Qualität                                          setzt die Audioqualität, "-aq 60" entspricht in etwa "-ab 192k"
-ac Kanalanzahl                                       setzt die Anzahl der gewünschten Kanäle (Mono /Stereo)

Bsp.: $ ffmpeg -i audio.wav -acodec mp2 -ac 1 -ar 22050 -ab 64k audio.mp2
-an                                                   disable Audiospur
-acodec Codec- Name                                   force erwünschten Audiocodec, siehe List of Codecs (copy um alten Codec beizubehalten)

Bsp.: $ ffmpeg -i audio.wav -acodec mp3 -ab 192k audio.mp3
-newaudio                                             legt eine neue Audiospur über die Alte
-vol Lautstärke                                       ändert die Lautstärke, Default- Wert = 256
-async Synchronisationswert in samples per sec        Audio- mit Videospur nach dem Enkodieren wieder synchronisieren 
                                                                (Wert 1- mayimale Samplingrate des Files pro Sekunde)

Untertitel Optionen

-scodec Codec- Name                                    Force Untertitelcodec
-newsubtitle                                           fügt neue Untertitelspur hinzu
-sn                                                    disable Untertitelspur

Beispiele

Animation (Film) aus Einzelbildern

$ ffmpeg -f image2 -i image%d.jpg -b 500k output.avi

-f image2 teilt das Eingabeformat mit (Bilder)

-i image%d.jpg die Input-Datei(en)

%03d siehe: Wildcards

-b 500k setzt die Video-Bitrate auf 500kbit/s (der default-Wert ist 200k)

output.avi die Ausgabe-Datei (hier mpg, könnte aber auch z.B. .mov oder .flv etc. sein)

Einzelbilder aus Animation (Film)

$ ffmpeg -i input.avi image%03d.jpg

generiert image1.jpg, image2.jpg, image3.jpg, etc.

Tonspur aus Film extrahieren

$ ffmpeg -i film.mov -vn -ar 44100 -ac 2 -ab 192 -f aiff ton.aiff

-vn keine Videospur wird benötigt

-ar samplerate 44100

-ab bitrate auf 192k

-ac 2- Kanal

-f angegebenes Format verwenden

Tonspur bearbeiten um sie auf CD zu brennen

$ ffmpeg -i film.flv -vn -acodec pcm_s16le -ar 44100 -ac 2 audio.wav

Tonspur als mp3

$ ffmpeg -i film.flv -vn -acodec copy audio.mp3

(bearbeitete) Tonspur und Videospur verbinden

$ ffmpeg -i film_stumm.mov -i audio.aiff -vcodec copy -async 10 -ab 128k newfilm.mov

-vcodec copy das Video einfach nur kopieren

-async 10 manchmal wird durch (mehrmaliges) Ändern des Codecs 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)

DVD kopieren

vobcopy installieren (über apt-get bei linux oder MacPorts bei OSX)

$ sudo apt-get install vobcopy
  • DVD auf Festplatte kopieren
$ vobcopy -m -o Zielverzeichnis

-m --mirror | spiegelt die gesamte DVD auf Festplatte -o --output-dir | gibt das Zielverzeichnis für die Kopien an

VOB- Dateien enkodieren

$ ffmpeg -i VTS_07_2.VOB -b 2000k -s 720x576 -acodec libmp3lame -ab 128k -async 50 output.avi

-b 2000k Videobitrate von 2000kbit/s, kann auch niedriger z.B. 900k gesetzt werden.... je nach Qualitätswunsch

-s 720x576 die Auflösung in Pixel

-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)

Clips aneinander hängen

$ cat clip1.avi clip2.avi > clip_t.avi
$ ffmpeg -i clip_t.avi -sameq clip_lang.avi

-sameq Videoqualität des Inputfiles beibehalten

HD- Format encodieren

  • VC-3 (aka Avid DNxHD) Encoding
$ ffmpeg -i input.avi -vcodec dnxhd -b <bitrate> -mbd rd -an output.mov

- <bitrate> z.B. folgende Werte: 36Mb, 60Mb, 90Mb, 120Mb, 185Mb (siehe Tabelle unten)

- -mbd rd für "best quality"

  • unterstützte Auflösungen :

Project Format Auflösung Frame Size Bits FPS <bitrate>

1080i / 59.94 DNxHD 220 1920 x 1080 8 29.97 220Mb

1080i / 59.94 DNxHD 145 1920 x 1080 8 29.97 145Mb

1080i / 50 DNxHD 185 1920 x 1080 8 25 185Mb

1080i / 50 DNxHD 120 1920 x 1080 8 25 120Mb

1080p / 25 DNxHD 185 1920 x 1080 8 25 185Mb

1080p / 25 DNxHD 120 1920 x 1080 8 25 120Mb

1080p / 25 DNxHD 36 1920 x 1080 8 25 36Mb

1080p / 24 DNxHD 175 1920 x 1080 8 24 175Mb

1080p / 24 DNxHD 115 1920 x 1080 8 24 115Mb

1080p / 24 DNxHD 36 1920 x 1080 8 24 36Mb

1080p / 23.976 DNxHD 175 1920 x 1080 8 23.976 175Mb

1080p / 23.976 DNxHD 115 1920 x 1080 8 23.976 115Mb

1080p / 23.976 DNxHD 36 1920 x 1080 8 23.976 36Mb

1080p / 29.7 DNxHD 45 1920 x 1080 8 29.97 45Mb

720p / 59.94 DNxHD 220 1280x720 8 59.94 220Mb

720p / 59.94 DNxHD 145 1280x720 8 59.94 145Mb

720p / 50 DNxHD 175 1280x720 8 50 175Mb

720p / 50 DNxHD 115 1280x720 8 50 115Mb

720p / 23.976 DNxHD 90 1280x720 8 23.976 90Mb

720p / 23.976 DNxHD 60 1280x720 8 23.976 60Mb

Player

$ ffplay film.avi

Unterstützte Codecs und Formate

$ ffmpeg -formats
  • encode/decode- Intermezzo

Datei:De-en.jpg

Ein Encoder (oder auch Coder/Codierer) ist ein System, das eine Datenquelle (z.B. ein digitales Audiosignal, ein Dateiformat, ein Computerbild, ein gegen Fehler empfindliches Datensignal) in ein für einen bestimmten Kanal geeignetes Format umwandeln soll.

Ein 'Encoder' arbeitet nach einer fest vorgegebenen Codiervorschrift, damit der Decoder auf der Empfängerseite das Signal wieder in das ursprüngliche Format zurückkonvertieren kann.

Zu einem Encoder gehört also immer ein "entgegengesetzt" arbeitender Decoder.


  • List of Video- Codecs

http://www.ffmpeg.org/general.html#SEC6


  • List of Audio- Codecs

http://www.ffmpeg.org/general.html#SEC7


  • List of File- Formats

http://www.ffmpeg.org/general.html#SEC4


  • List of Image- Formats

http://www.ffmpeg.org/general.html#SEC5


  • List of Subtitle- Formats

http://www.ffmpeg.org/general.html#SEC8