FFmpeg-Befehle

# 0.  Die Personen, die Homebrew auf Mac OS X installiert haben, können mit
#     folgendem Befehl FFmpeg jedesmal aktualisieren, wenn eine neue Version
#     bereitgestellt wird. Der Computer muss natürlich ans Internet
#     angeschlossen sein.

brew update
brew upgrade ffmpeg



# 1.  Zuerst das Desktop als Arbeitsfläche definieren, wo die erzeugten Dateien
#     erscheinen werden, damit sie leicht wiedergefunden werden können und damit
#     man nicht ständig den ganzen Pfad eintippen muss.
#
#     Bemerkung: Eine Datei oder ein Ordner kann auch ins Terminal-Fenster
#     "gezogen" werden, so muss man den Namen und/oder den Pfad nicht eintippen.

cd ~/Desktop



# 2.  Die Datei erzeugen, mit der wir arbeiten werden. Es handelt sich um die
#     Mandelbrot-Funktion, eine Fraktalkurve, bei der digitale Fehler leicht
#     erkennbar sind.
#
#     Die Parameter sind:
#     -f  die Standardbibliothek "lavfi" von FFmpeg
#     -i  das Element "mandelbrot" der Bibliothek [i = input file]
#     -t  die gewünschte Dauer in Sekunden
#         und am Ende der Name der zu erzeugende Datei [ohne -o]

ffmpeg -f lavfi -i mandelbrot -t 10 -pix_fmt yuv420p mandelbrot.mov



# 3.  Testbilder im DV-Format für NTSC und für PAL erzeugen.

ffmpeg -f lavfi -i testsrc -t 10 -target ntsc-dv testbild_ntsc.dv
ffmpeg -f lavfi -i testsrc -t 10 -target pal-dv testbild_pal.dv

#     In den erscheinenden technischen Informationen sehen Sie, dass die Datei
#     "testsrc" im Format RGB24 ist und dass sie umgewandelt wird:
#     - für DV NTSC: in YUV 4:1:1 mit einem Bild von 720 x 480 rechteckige Pixel
#       im Seitenverhältnis 8:9
#     - für DV PAL:  in YUV 4:2:0 mit einem Bild von 720 x 576 rechteckige Pixel
#       im Seitenverhältnis 16:15
#     Und auch die Vorführgeschwindigkeit ist verschieden.



# 4.  Eine Tondatei erzeugen.
#
#     Ich benütze die mathematische Funktion, die eine Sinuskurve mit 440 Hz
#     generiert, was der Note A entspricht.

ffmpeg -f lavfi -i aevalsrc="sin(440*2*PI*t)" -t 10 note_a.wav

#     Möchten Sie aber lieber Ihr Instrument mit einem 432-Hz-Diapason stimmen,
#     dann wählen Sie:

ffmpeg -f lavfi -i aevalsrc="sin(432*2*PI*t)" -t 10 diapason.wav



# 5.  Umwandlung des Containers. Zum Beispiel von MOV zu AVI.
#     Parameter:
#     -i  die Ausgangsdatei [i = input file]
#     -c  die gewünschte Umwandlung (in unserem Fall: keine, weil wir nur den
#         Container ändern wollen, nicht aber das darin enthaltene Video)
#         der Name der zu erzeugende Datei [ohne -o]

ffmpeg -i mandelbrot.mov -c copy mandelbrot.avi

#     Bemerkung für die Mac-OS-X-Benützer:
#     "QuickTime Player" ist nicht imstande diese Datei vorzuführen (ausser wenn
#     der zusätzlich erforderliche Codec installiert wurde). Sie können, zum
#     Beispiel, "VLC" benützen. Haben Sie FFmpeg mittels Homebrew installiert,
#     dann können Sie auch folgenden Befehl benützen:

ffplay mandelbrot.avi



# 6.  Umwandlung des Bildformates. Zum Beispiel von 4:3 zu 16:9 ohne dass das
#     Bild reingestellt wird, also ohne Balken auf der Seite -- d.h. was man
#     NICHT machen sollte!

ffmpeg -i mandelbrot.mov -aspect 16:9 falsch.mov

#     Richtige Umwandlung mit schwarze Balken rechts und links ("pillarbox").

ffmpeg -i mandelbrot.mov -vf pad=854:480:107:0:000000 richtig.mov

#     Umwandlung mit roten, grünen oder blauen Balken.

ffmpeg -i mandelbrot.mov -vf pad=854:480:107:0:ff0000 rot.mov
ffmpeg -i mandelbrot.mov -vf pad=854:480:107:0:00ff00 gruen.mov
ffmpeg -i mandelbrot.mov -vf pad=854:480:107:0:0000ff blau.mov



# 7.  Umwandlung des Videoformates. Zum Beispiel von H.264 zu MPEG-4 mit einer
#     Kompression.
#
#     Parameter:
#     -b:v      die Bitrate des Bildstromes [b:v = bitrate of video]
#     -pix_fmt  das Pixelformat (siehe unter 10.)

ffmpeg -i mandelbrot.avi -t:v 20 -b:v 1000k -pix_fmt yuv420p komprimiert_1000k.avi
ffmpeg -i mandelbrot.avi -t:v 20 -b:v 10k -pix_fmt yuv420p komprimiert_10k.avi



# 8.  Umwandlung der Rohdaten. Zum Beispiel von NTSC zu PAL.

ffmpeg -i testbild_ntsc.dv -target pal-dv testbild_pal_neu.dv



# 9.  Die technischen Metadaten aus der Datei lesen.
#
#     Parameter:
#     -i               die Ausgangsdatei (das -i kann auch weggelassen werden)
#     -show_format     gibt die Informationen zum Container
#     -show_streams    gibt die Informationen zum Bild und zum Ton
#     -show_data       fügt show_streams einen kurzen "hexdump" hinzu
#     -show_versions   gibt die Version der verwendeten FFmpeg-Komponenten

ffprobe -i mandelbrot.mov
ffprobe -i mandelbrot.mov -show_format
ffprobe -i mandelbrot.mov -show_streams
ffprobe -i mandelbrot.mov -show_data
ffprobe -i mandelbrot.mov -show_streams -show_data
ffprobe -i mandelbrot.mov -show_versions
ffprobe -i mandelbrot.mov -show_format -show_streams -show_data -show_versions
ffprobe -i mandelbrot.mov -show_format -show_streams

#     Ausgabe im Format "json", das mittels einem Java-Programm bearbeitet kann,
#     oder "xml", das z.B. mittels einer Styldefinition XSLT gestalten werden
#     kann.
#
#     Parameter:
#     -print_format  gibt das Format an, in dem die Metadaten gewünscht werden

ffprobe -i mandelbrot.avi -show_format -show_streams -print_format flat
ffprobe -i mandelbrot.avi -show_format -show_streams -print_format json
ffprobe -i mandelbrot.avi -show_format -show_streams -print_format xml

#     Einzelne Elemente kann man z.B. mittels "jq" aus dem Format "json" picken.
#
#     Die Ausgangsdaten des Teils vor dem | werden dem Teil danach als
#     Eingangsdaten geliefert.

ffprobe -i mandelbrot.mov -show_format -print_format json | jq '.format.format_long_name'
ffprobe -i mandelbrot.avi -show_format -print_format json | jq '.format.format_long_name'
ffprobe -i testbild_ntsc.dv -show_streams -print_format json | jq '.streams[0].sample_aspect_ratio'
ffprobe -i testbild_pal.dv -show_streams -print_format json | jq '.streams[0].sample_aspect_ratio'



# 10. Die Listen der möglichen Parametern anzeigen.

ffmpeg -codecs
ffmpeg -decoders
ffmpeg -h decoder=flv
ffmpeg -encoders
ffmpeg -filters
ffmpeg -formats
ffmpeg -layouts
ffmpeg -sample_fmts
ffmpeg -pix_fmts
ffmpeg -bsfs



# 11. Berechnen von MD5-Hashwerte auf Bildebene.
#
#     Parameter:
#     -f  die Bibliothek "framemd5" von FFmpeg soll benützt werden

ffmpeg -i mandelbrot.mov -f framemd5 mandelbrot_mov_frames.md5
ffmpeg -i mandelbrot.avi -f framemd5 mandelbrot_avi_frames.md5
cat mandelbrot_mov_frames.md5
cat mandelbrot_avi_frames.md5



# 12. DPX-Einzelbild-Dateien erzeugen...
#
#     Parameter:
#     -n:a  kein Ton soll einbezogen werden [n:a = no audio]
#     -f    die Bibliothek "image2" von FFmpeg soll benützt werden
#     %05d  fünfstellige Zahlen, wenn nötig mit Nullen beginnend

mkdir DPX
ffmpeg -i mandelbrot.mov -n:a -f image2 DPX/mandelbrot_%05d.dpx
ffplay DPX/mandelbrot_%05d.dpx

#     ... und wieder zu einer einzigen Videodatei zusammenfügen.

ffmpeg -f image2 -i DPX/mandelbrot_%05d.dpx -vcodec rawvideo -y mandelbrot_new.mov
ffplay mandelbrot_new.mov



# 13. "Vergnügliches"
#     Alle Zeilen eines Beispiels müssen ZUSAMMEN in das Terminal kopiert
#     werden. Und ffplay wird benötigt.
#     [Das Zeichen \ am Ende der Zeilen löscht fürs Terminal den Sprung zur
#     neuen Zeile, damit es als einen einzigen Befehl ausgeführt wird.]

ffplay -i mandelbrot.mov -vf "crop=iw/2:ih:0:0,split[tmp],pad=2*iw[left];\
[tmp]hflip[right];[left][right]overlay=W/2"

# Die R'G'B'-Komponenten (RGB-Komponenten) sichtbar machen.

ffmpeg -f lavfi -i testsrc=d=60 -filter_complex \
"split=4[a][b][c][d];[a]pad=iw*4:ih[w];[b]lutrgb=g=0:b=0[x];\
[c]lutrgb=r=0:b=0[y];[d]lutrgb=r=0:g=0[z];[w][x]overlay=w:0[wx];\
[wx][y]overlay=w*2:0[wxy];[wxy][z]overlay=w*3:0" -f nut - | ffplay -

# Die Y'CbCr-Komponenten (YUV-Komponenten) sichtbar machen.

ffmpeg -f lavfi -i testsrc=d=60 -filter_complex \
"split=4[a][b][c][d];[a]pad=iw*4:ih[w];[b]lutyuv=u=128:v=128[x];\
[c]lutyuv=y=0:v=128[y];[d]lutyuv=y=0:u=128[z];[w][x]overlay=w:0[wx];\
[wx][y]overlay=w*2:0[wxy];[wxy][z]overlay=w*3:0" -f nut - | ffplay -

2016-09-01