Wie auch schon vom letzten Rust-Vortrag musste ich auch dieses Mal das Video nachbearbeiten:

Dieses Mal habe ich für die Videoaufzeichnung auf meinem Laptop nicht Vokoscreen, sondern OBS-Studio verwendet. Dieses verbraucht weniger Ressourcen und somit hat dieses mal die lokale Aufzeichnung auch geklappt. Dennoch hatten wir zwischendurch den Eindruck, dass OBS-Studio stört und wir hatten die Aufzeichnung abgebrochen, wodurch zwei Dateien entstanden sind.

Verbinden von Dateien mit gleichem Codec

Für das Aneinanderhängen von Dateien habe ich zwei Anleitungen gefunden:

Damit habe ich mir dann diesen Befehl zusammengestellt:

console ffmpeg -f concat -safe 0 \ -i <(for i in 2021-01-21*.mkv; echo "file $PWD/${(q)i}") \ -codec copy -ss 3:29 \ -metadata 'title=Programmierung in Rust' \ -metadata 'author=Jörg Sommer <joerg@jo-so.de>' \ -metadata year=2021 -metadata date=2021-01-21 \ -metadata 'copyright=© 2021 Jörg Sommer <joerg@jo-so.de>, CC BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0/deed.de>' \ -metadata 'comment=See <https://jo-so.de/2021-01/Rust-Vortrag.html>' \ ~/Projekte/website/pages/2021-01/Rust-Vortrag.mp4

Die entscheidenden Optionen sind -f concat -i DATEI, wobei in der DATEI zeilenweise die Einträge für die Eingabedateien in der Form file … stehen müssen. Ich habe dafür keine Datei erstellt, sondern lasse diese von der Zsh generieren. Da diese jedoch in einem anderen Verzeichnis liegt, erachtet ffmpeg die Datei als unsicher und ich musste die Option -safe 0 angeben.

Der Rest ist dann wieder das Kopieren der Daten mit -codec copy und das Abschneiden des Anfangs mit -ss. Da sowohl das Containerformat mkv, als auch das Format mp4 das Videoformat h264 und das Audioformat aac unterstützen, konnte ich in dem Schritt auch einfach das Containerformat wechseln, da mkv mindestens vom Firefox 84 nicht erkannt wird.

Konvertierung von Formaten mit FFmpeg

Da das Videoformat vp9 kleinere Dateien erstellt als h264 wollte ich auch das Video als webm anbieten. Die Konvertierung von h264 in vp9 für webm ist sehr einfach, jedoch läuft es bei mir schrecklich langsam (Faktor 0,2): ffmpeg -i Rust-Vortrag.mp4 Rust-Vortrag.webm

Grau ist alle Theorie: Nach zehn Stunden Konvertierung kam eine webm-Datei von 620 MB heraus, die größer als die mp4-Datei mit 540 MB war. Also kam nicht die erwartete Verbesserung heraus und ich habe die Datei verworfen. Leider unterstützt mein Prozessor (i7‑4720HQ, Haswell) nicht das VP9-Format, weshalb die Rechenzeit nicht wesentlich kürzer wird.

Für die Konvertierung habe ich noch den Tipp bekommen, dass eine zweiphasige Konvertierung bessere Ergebnisse liefert:

ffmpeg -i vid.mkv -threads $(nproc) -b:v 500k -pass 1 -an -f null /dev/null &&
ffmpeg -i vid.mkv -threads $(nproc) -row-mt 1 -b:v 500k -pass 2 vid.webm

In der ersten Phase wird das Video analysiert und aufgrund dieser Daten dann das Video in der zweiten Phase umgewandelt. Allerdings habe ich diese zwanzig Stunden Arbeit nicht ausprobiert.

Sound-Verbesserung mit sox

Für die Verbesserung des Tons (in diesem Fall einer Big-Blue-Button-Aufzeichnung) kann man auch die Tonspur aus einem Video extrahieren und mit sox nachbearbeiten. Im konkreten Fall ging es vor allem um die Entfernung von Rauschen, was mit noisered passiert. Die Reduktionen des Lautstärke (mit vol …) war notwendig, weil sox gewarnt hatte: »sox WARN highpass: highpass clipped 1231 samples; decrease volume?«

% ffmpeg -i webcams.webm -vn -acodec flac sound-old.flac
% sox sound-old.flac -n noiseprof sound.nprof
% sox --temp /var/tmp sound.flac sound-neu.flac \
  vol 0.97 \
  noisered sound.nprof \
  remix - \
  vol 0.95 \
  highpass 100 \
  norm \
  compand 0.05,0.2 6:-54,-90,-36,-36,-24,-24,0,-12 0 -90 0.1 \
  vad -T 0.6 -p 0.2 -t 5 \
  fade 0.1 \
  reverse \
  vad -T 0.6 -p 0.2 -t 5 \
  fade 0.1 \
  reverse \
  norm -0.5
% ffmpeg -threads $(nproc) -i deskshare.webm -i sound-new.flac \
  -vcodec copy -acodec libopus -map 0:v -map 1:a joined.webm