CLI-Adventskalender, Tag 21: Videoproduktion

CLI-Adventskalender: Videoproduktion

Avatar von Eric

Tag 21, Videoproduktion. Keine Sorge, die Plätzchen sind mir nicht zu Kopf gestiegen …

Aber: Wir machen heute mal ein bißchen was anderes. Normalerweise gehe ich mit diesen Artikeln auf ein grobes Thema oder ein konkretes Tool ein und zeige dann einen Koffer voller Anwendungsfälle. In der Hoffnung, dass irgendetwas davon nützlich für euch ist.

Heute, zeige ich euch ein komplettes Projekt, das ein konkretes Problem löst: Videoproduktion auf der Kommandozeile!

Videoproduktion

Breites Thema, deshalb konkreter: Ich möchte gerne einen Vortrag halten, mit Slides, während mein Videofenster unten in der Ecke zu sehen ist und alles was ich habe ist eine Webcam, ein Mikro und einen Texteditor.

Das ist nicht nur möglich, ich werde euch sogar zeigen wie es komplett ohne GUI geht.

Los geht’s.

Erstmal brauchen wir einen Vortrag

Wir alle haben einen anderen Prozess was Vortragsvorbereitung angeht. Das ist das Thema von vielen anderen Blogposts. Ich konzentriere mich hier auf die technische Seite.

---
title: Meine tolle Präsentation
author: Eric
date: 21. November 2023
institute: Mayflower GmbH
---

# Wer ich bin
- Ein Typ mit einem Texteditor
- Im Internet
- Der Text schreibt

# Markdown ist einfach
- aber LaTeX ist kompliziert
- Muss man halt wissen was man will

# Pandoc ist Dein Freund
- Zumindest meistens
- Kann viele Sachen in viele Sachen umwandeln
- Ist stets bemüht einen guten Job zu machen
pandoc -t beamer folien.md -o praesentation.pdf

Das ist ein denkbar unkomplizierter Weg um an Folien zu kommen, denke ich. Pandoc gibt uns ein PDF mit einer Folie pro Headline. Das ganze hat das Standard-Beamer-Template, was so ziemlich das Gegenteil von schön ist. Na ja, aber es ist benutzbar. Mit den Metadaten oben drin können wir ein wenig tunen.

---
title: Meine tolle Präsentation
author: Eric
date: 21. November 2023
institute: Mayflower GmbH
theme: Berlin
colortheme: beaver
mainfont: "Hack Nerd Font"
fontsize: 10pt
---

<<< SCHNIPP >>>

Und schon sieht es etwas hübscher aus. Geschmackssache, ich weiß. Es hat zumindest nicht mehr den Stil einer LinAlg-Vorlesung und ist jetzt mehr so Technische Informatik. Für eine Softwaretechnik-Vorlesung müssten wir uns noch etwas reinknien.

pandoc -D beamer > custom-template.tex

# Datei bearbeiten und dann

pandoc -t beamer --template=custom-template.tex folien.md -o praesentation.pdf

Das Custom-Template ist leider ein gruseliges Stück Spaghetti-Code. Bevor man das anfasst, können wir unsere Folien auch gleich in LaTeX bauen.

LaTeX ist nicht so gruselig wie es klingt

Es gewinnt sicher keine Preise für syntaktische Schönheit für moderne Augen … aber hey, es ist Code. Es ist (meiner Erfahrung nach) nach wie vor die zuverlässigste und stabilste Variante, um Typesetting durch Code zu machen; also Schrift und Grafik zielsicher auf einer Seite in einem Dokument zu platzieren.

\begin{frame}{Rückblick}
  \begin{itemize}
    \item Folien haben Text
    \item Also manchmal
    \item Und Bilder
    \item Aber nicht immer
  \end{itemize}
\end{frame}

Das schöne an diesem Ansatz ist, dass man die ganze Welt der LaTeX-Templates zur Auswahl hat und sich in Sachen Grafikdesign richtig austoben kann, wenn man denn möchte. Da es Code ist, können einmal erstellte Themes leicht abgewandelt und/oder wiederverwendet werden.

Wir zersägen das PDF

Für unseren nächsten Trick müssen wir das PDF noch in Bilder zerlegen. Hier hilft uns unser alter Freund imagemagick.

convert -density 300 input.pdf -quality 100 folie.jpg

Wenn ihr diesen Blogartikel als Challenge interpretieren wollt lässt sich das nutzen, um mit fbiviewer eine Präsentation komplett ohne Desktopumgebung zu bauen. Mehr noch: im nächsten Abschnitt können wir ein Video unter denselben Einschränkungen bauen.

Kamera ab!

Ok, cool. Wir haben unsere Folien. Wir haben Null Euro in Office-Lizenzen investieren müssen. Zeit, unseren Vortrag aufzunehmen.

Zuerst versuchen wir, unsere Webcam zu finden.

ls /dev/video*

Eine von denen wird es sein. Bei mir war es /dev/video0, aber das muss man einfach ausprobieren.

Dann brauchen wir noch ein Mikro.

arecord -l

In meinem Fall ist es „Card 2“ und „Device 0“. Das übersetzt sich zu -i hw:2,0 im nächsten Befehl.

Jetzt können wir unsere erste Aufzeichnung machen.

ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:2,0 -c:v copy -c:a aac output.mkv

Wenn wir fertig sind, beenden wir die Aufzeichnung mit STRG+C. Die Videodatei lässt sich mit jedem Videoprogramm öffnen.

vlc output.mkv

Für diejenigen die es ohne Desktopumgebung versuchen: gibt es einige Videoplayer, die den Framebuffer bespielen können. Beispielsweise:

mplayer -vo fbdev2 output.mkv

Schneiden

Der Ansatz, den ich gewählt habe, ist ein Video pro Folie. Das macht alles ordentlich und aufgeräumt und effizient. Bei manchen Vorträgen kann es ein wenig hölzern wirken. Die Methoden hier lassen sich leicht anpassen, wenn man bereit ist, ein wenig Bastelarbeit zu investieren.

Wir nehmen jetzt also Videos auf. Ich empfehle stark, das nicht in einer ununterbrochenen Aufnahme zu tun; einfach weil man so Probleme schneller bemerkt und mehr Flexibilität hat. Wenn man so Snippet-getrieben arbeitet (es gibt bestimmt einen Filmtechnik-Begriff, den ich nicht kenne) haben wir ein paar Sekunden Stille vorne und/oder hinten, die wir wegtrimmen wollen.

Mit ffmpeg können wir leicht z. B. die ersten drei Sekunden rausschneiden.

ffmpeg -ss 00:00:03 -i output.mkv -c copy folie-1.mkv

… oder die letzten Fünf:

ffmpeg -sseof -5 -i output.mkv -c copy folie-1.mkv

Oder gleich einen bestimmten Abschnitt wählen.

ffmpeg -ss 00:00:03 -i output.mkv -to 00:02:30 -c copy folie-1.mkv

Nach und nach kommt man so auf einen vollständigen Vortrag,; Video für Video. Keine Sorge, falls das Audio nicht das beste ist. Dazu kommen wir jetzt.

Sound aufmotzen

Under Video-Taschenmesser ffmpeg hilft uns, Audio zu extrahieren …

ffmpeg -i folie_1.mkv -q:a 0 -map a audio_1.mp3

… Audio zu entfernen …

ffmpeg -i folie_1.mkv -c:v copy -an folie_1_ohne_sound.mkv

… und ein neues Audio dranzuschrauben, sobald wir fertig sind:

ffmpeg -i folie_1_ohne_sound.mkv -i audio_1_verbessert.mp3 -c:v copy -c:a aac -strict experimental folie_1.mkv

Viele Dinge zur Verbesserung der Audioqualität sind auf „Hardwareebene“. Ein gutes Mikro, eine Umgebung mit wenig Hintergrundgeräuschen und Echo, ein Pop-Filter, der richtige Abstand zum Mikro und viele andere Tricks und Kniffe.

Auf Softwareebene gibt es hier einige kommerzielle One-Click-Lösungen, nicht zuletzt von Adobe, die auch einen AI-basierten Onlineservice mit eingeschränkter kostenloser Nutzung anbieten. Und vollkommen überraschend hat Adobe seine Marktposition nicht im Lotto gewonnen; die Ergebnisse können sich echt sehen lassen.

Wer aus Budgetgründen, Bildungsgründen oder ideologischer Sturheit lieber die Variante „Hütte im Wald alleine bauen“ wählen möchte, der kann folgendes versuchen.

sox hintergrund.mp3 -n noise.prof
sox audio_1.mp3 audio_1_enhanced.mp3 noisered noise.prof 0.2

Wir nehmen das Hintergrundgeräusch auf. Rauschende Heizung, knisterndes Mikro, Luftzug. Einfach mal fünf Sekunden „Stille“ aufnehmen und über die Ergebnisse staunen. Die 0.2 ist die Stärke des Effekts auf einer Skala von 0 bis 1.

Dann gibt es noch Equalizer:

ffmpeg -i audio_1.mp3 -af "highpass=f=300, lowpass=f=3400, equalizer=f=1000:t=q:w=2:g=3" audio_1_equalized.mp3

Menschliche Stimmen reichen von 300Hz bis 3400Hz. Als „Best Guess“ habe ich hier mal einen Boost auf die 1000Hz gelegt. Hier lohnt es sich zu experimentieren.

Schlussendlich (besonders wichtig, wenn man andere Tonaufnahmen reinschneidet) gibt es noch Normalisierung. Wir machen die lauten Teile leiser und die leisen Teile lauter.

ffmpeg -i audio_1.mp3 -filter:a loudnorm audio_1_normalisiert.mp3

Das schöne daran, dass alles auf der Konsole passiert? Wir können all diese Schritte in ein Bash-Skript packen. Wir gehen dann in einer Schleife alle Video-Dateien durch, splitten die Audiotracks, tun eine Reihe von Dingen mit ihnen und spielen sie wieder ein. Wir können so auch beliebig Dateien austauschen. Ich zeige euch schnell was ich meine.

Alles zusammenschneiden

convert -density 300 vortrag.pdf -quality 100 folie.jpg

dummy="dummy-folie.jpg"

# fehlende Folien ersetzen wir durch einen Platzhalter
# Auflösung ist die Auflösung der anderen Folien
if [[! -f "$dummy" ]]; then
  convert -size 1512x1134 xc:black -font Arial -pointsize 30 -fill white -gravity center -annotate +0+0 "Folie fehlt" dummy-folie.jpg
fi

echo -n "" > videoliste.txt

i=0

while true; do
  video="video-$i.mkv"
  if [[ -f "$video" ]]; then
    folie="folie-$i.jpg"
    if [[! -f "$folie" ]]; then
      folie=$dummy
    fi

    # Hier an dieser Stelle ist Platz um evtl Audioverbesserungen einzubauen.

    ffmpeg -i $folie -i $video -filter_complex "[1:v]scale=320:-1[vid];[0:v][vid]overlay=W-w-10:H-h-10" -codec:a copy output-$i.mkv

    echo "output-$i.mkv" >> videoliste.txt
    
    ((i++))
  else
    echo "Keine Videos mehr."
    break
  fi
done

ffmpeg -f concat -safe 0 -i videoliste.txt -c copy praesentation.mkv

echo "Fertig"
Shell-Weisheit des Tages
Eine Couch wird bequem, wenn Du auf ihr sitzt

Ich kann mich erinnern, als ich zum ersten Mal Windows XP benutzt habe. Alles hat sich schwerfällig und überladen angefühlt. Alles hat Ressourcen gefressen, nur um bunt und „benutzerfreundlich“ zu sein. (Ja, bestimmte Aspekte meiner Persönlichkeit haben sich über die Jahre lediglich entfaltet statt sich zu ändern.)

Ich kann mich erinnern, als ich zum ersten Mal Windows Vista benutzt habe … und einfach nur mein Windows XP zurück wollte.

Die Kommandozeile ist für Einsteiger ein unfreundlicher Ort. Wenn wir ein Terminal aufmachen ist der Großteil davon Dunkelheit, die vielleicht an den Weltraum erinnert: Ein lebensfeindliches Vakuum, unendlich groß. Intuitiv Befehle zu finden ist quasi nicht möglich. Es gibt kein freundliches Start-Menü, das die User an die Hand nimmt. „Hi! Schön, dass Du da bist. Was möchtest Du heute tun? Eine E-Mail schreiben? Im Web surfen?“

Ich kann alle verstehen, die sagen, dass sie von der Kommandozeile abgeschreckt werden.

Aber es wird besser.

Ein paar Tutorials und sie wird (zumindest technisch gesehen) benutzbar. Ein wenig Konfiguration, vielleicht ein modernes Framework wie bash-it oder oh-my-zsh und schon fallen viele nützliche Abkürzungen aus der Tüte. Ich kann gst schreiben anstelle von git status? Ich habe Tab-Vervollständigung auf Git Commits?

Ich kann mir mein Terminal nicht mehr wegdenken. Ganz gleich ob wir irgendwann mit VR-Brillen am Schreibtisch sitzen, ich werde trotzdem meine Befehle eintippen wollen.

Ich habe meine Couch-Metapher hier bewusst gewählt. Eine neue Couch ist nicht nur unvertraut, die Polster passen sich auch unserer Sitzform an, je länger wir darauf sitzen. Je mehr wir die Shell benutzen und anpassen, desto angenehmer fühlt sie sich an. Wenn es für Windows XP funktioniert, funktioniert es auch mit bash.

Avatar von Eric

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.