FFmpeg-Befehle

# 0.  Der Desktop als Arbeitsfolder definieren. (So können die erzeugten Dateien
#     leichter gefunden werden ;-)
#
# * für macOS und Linux:

cd ~/Desktop

# * für Windows:

cd Desktop



# 1.  Die Dateien erzeugen, mit denen wir arbeiten werden.
#
#     Zuerst die Mandelbrot-Funktion, eine Fraktalkurve, bei der digitale
#     Bildfehler leicht erkennbar sind.
#
#     Die Parameter sind:
#     -f        die Standardbibliothek "lavfi" von FFmpeg
#     -i        das Element "mandelbrot" der Bibliothek [i = input file]
#     -pix_fmt  yuv420p bedeutet Y'CBCR 4:2:0 planar, ein Format, das von den
#               meisten Playern korrekt gelesen wird
#     -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

#     Die erzeugte Datei visualisieren:

ffplay mandelbrot.mov

#     Danach die Note A, bei der digitale Tonfehler leicht hörbar sind.
#
#     Die Parameter sind:
#     -f  die Standardbibliothek "lavfi" von FFmpeg
#     -i  mit dem Element "aevalsrc" der Bibliothek kann man eine mathematische
#         Funktion berechnen, in unserem Bespiel die Sinusfunktion mit der
#         Frequenz 440 Hz [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 aevalsrc="sin(440*2*PI*t)" -t 10 Note_A.wav

#     Die erzeugte Datei abspielen:

ffplay Note_A.wav



# 2.  Zusammensetzten von Bild und Ton

ffmpeg -i mandelbrot.mov -i Note_A.wav mandelaaa.mov

#     Die erzeugte Datei abspielen:

ffplay mandelaaa.mov



# 3.  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 Apple-Benützer: Sie erzeugen eine Windows-Datei, die
#     "QuickTime Player" nicht vorzuführen kann (ausser wenn der zusätzlich
#     erforderliche Codec installiert wurde).



# 4.  Die technischen Metadaten aus der Datei lesen.
#
#     Parameter:
#     -i               die Ausgangsdatei (das -i könnte hier weggelassen werden)
#     -show_format     gibt die Informationen zum Container
#     -show_streams    gibt die Informationen zu Bild und Ton

ffprobe -i mandelbrot.mov
ffprobe -i mandelbrot.mov -show_format
ffprobe -i mandelbrot.mov -show_streams
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 json
ffprobe -i mandelbrot.avi -show_format -show_streams -print_format xml
ffprobe -i mandelbrot.avi -show_format -show_streams -print_format flat

#     Siehe: avpres.net/FFmpeg/probe_json


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

ffmpeg -codecs
ffmpeg -decoders
ffmpeg -h decoder=flac
ffmpeg -encoders
ffmpeg -h encoder=ffv1
ffmpeg -filters
ffmpeg -formats
ffmpeg -layouts
ffmpeg -sample_fmts
ffmpeg -pix_fmts
ffmpeg -bsfs



# 6.  Berechnen von MD5-Hashwerte auf Bildebene.
#
#     Parameter:
#     -i  die Ausgangsdatei
#     -f  die Bibliothek "framemd5" von FFmpeg soll benützt werden
#         der Name der zu erzeugende Datei [ohne -o]

ffmpeg -i mandelbrot.mov -f framemd5 mandelbrot_mov_md5.txt
ffmpeg -i mandelbrot.avi -f framemd5 mandelbrot_avi_md5.txt



#     Von nun an müssen alle Zeilen eines Beispiels ZUSAMMEN in das Terminal
#     kopiert werden.
#     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. So wird
#     der Befehl lesbarer.



# 7.  Erzeugen einer ProRes-Datei aus TIFF-Einzelbilder und sie ins HD-Format
#     korrekt einbetten.
#
#     Parameter:
#     -f         es werden Einzelbilder verarbeitet
#     -i         die Ausgangsdatei
#     -c:v       der Video-Codec "Apple ProRes 422" wird ausgewählt
#     -profile   die Variante HQ (High Quality) von ProRes ist 3
#     -filter:v  die Grösse anpassen und ins HD Reinstellen
#     -an        kein Ton ("audio no")
#                der Name der zu erzeugende Datei [ohne -o]

ffmpeg \
  -f image2 \
  -i DUFAY_TIFF/Dufay_%06d.tif \
  -c:v prores_ks -profile:v 3 \
  -filter:v "scale=1440:1080:flags=lanczos, pad=1920:1080:240:0" \
  -an \
  Dufay_ProRes.mov

#     Bemerkung für die Windows-Benützer: Sie erzeugen eine Apple-Datei.
#
#     Siehe: avpres.net/FFmpeg/sq_ProRes



# 8.  Erzeugen einer H.264-Datei aus TIFF-Einzelbilder und sie ins HD-Format
#     korrekt einbetten.
#
#     Parameter:
#     -f         es werden Einzelbilder verarbeitet
#     -i         die Ausgangsdatei
#     -c:v       der Video-Codec "H.264" wird ausgewählt
#     -preset    "veryslow" braucht viel Zeil, erzeugt aber eine kleinere Datei
#     -filter:v  die Grösse anpassen und ins HD Reinstellen
#     -an        kein Ton ("audio no")
#                der Name der zu erzeugende Datei [ohne -o]

ffmpeg \
  -f image2 \
  -i DUFAY_TIFF/Dufay_%06d.tif \
  -c:v libx264 -preset veryslow \
  -qp 18 \
  -filter:v "scale=1440:1080:flags=lanczos, pad=1920:1080:240:0" \
  -pix_fmt yuv420p \
  -an \
  Dufay_H264_1.mp4

#     Siehe: avpres.net/FFmpeg/sq_H264



# 9.  Erzeugen einer H.264-Datei aus der soeben erzeugten ProRes-Datei.
#
#     Parameter:
#     -i         die Ausgangsdatei
#     -c:v       der Video-Codec "H.264" wird ausgewählt
#     -preset    "veryslow" braucht viel Zeil, erzeugt aber eine kleinere Datei
#     -filter:v  die Grösse anpassen und ins HD Reinstellen
#     -an        kein Ton ("audio no")
#                der Name der zu erzeugende Datei [ohne -o]

ffmpeg \
  -i Dufay_ProRes.mov \
  -c:v libx264 -preset veryslow \
  -crf 18 \
  -pix_fmt yuv420p \
  -an \
  Dufay_H264_2.mp4

#     Siehe: avpres.net/FFmpeg/im_H264


# 10. Verschiedenes

#     Ein Splitscreen zweier Dateien erzeugen.

ffmpeg \
  -i Dufay_H264_1.mp4 \
  -i Dufay_H264_2.mp4 \
  -filter_complex \
    "[0]crop=iw/2:ih:0:0, pad=iw*2:ih*1[left]; \
    [1]crop=iw/2:ih:iw/2:0[right]; \
    [left][right]overlay=w" \
  Dufay_H264_split.mp4

#     Die Differenz zweier Dateien sichtbar machen.

ffmpeg \
  -i Dufay_H264_1.mp4 \
  -i Dufay_H264_2.mp4 \
  -filter_complex \
    "[1]format=yuva444p, lut=c3=128, negate[1_mit_alpha]; \
    [0][1_mit_alpha]overlay" \
    Dufay_H264_delta.mp4

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

ffmpeg \
  -i mandelbrot.mov \
  -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" \
  mandelbrot_RGB.mov

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

ffmpeg \
  -i mandelbrot.avi \
  -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" \
  mandelbrot_YUV.avi

2018-12-14