Wer wie ich Videos von Spielen captured und dadurch viel Rohmaterial in großen Bitraten liegen hat, braucht die Hilfe seiner Grafikkarte um dieses Rohmaterial möglichst schnell in handhabbare Größen umzuwandeln.
Moderne Video Hardware nutzen
Das Ausgangsmaterial ist mit 5 Mb/s erstellt worden, was den Kodiervorgang beim Bildschirmcapturen beschleunigt, zum Ansehen reichen aber 2 Mb/s VBR locker aus. Früher habe ich zum Recodieren meinen Achtkerner benutzt, was schon einmal 70% der Realzeit eines Videos benötigt hat.
Heute macht das die Nvidia Grafikkarte für mich und das mit meistens 10x Geschwindigkeit meines Achtkerners 🙂
Wie man auf dem Bild schön sehen kann, wird die Video Engine voll ausgenutzt. Das spiegelt sich dann in so einer FFMpegausgabe wieder:
Faktor 18 – 23 wurden im Schnitt gesichtet, kommt halt auch drauf an, ob man Schwarzbilder oder Aktion kodiert. Wie ich schon bei meinem OpenShot Artikel geschrieben habe, hängt das Endergebnis auch stark von der Resthardware des PCs ab.
FFMpeg sorgt für den Hardwaresupport
Der Befehl „ffmpeg -hwaccels“ gibt einem die für FFMpeg verfügbaren HW-Encoder aus:
$ ffmpeg -hwaccels
ffmpeg version 4.1.4 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9 (GCC)
…
Hardware acceleration methods:
vdpau
cuda
vaapi
qsv
drm
opencl
qsv
cuvid
Auf Nvidia-Grafikkarten sieht der Befehl zum Kodieren dann so als Script aus:
#!/bin/bash
NAME=$(basename „$1“ .mp4)
ffmpeg -hwaccel cuvid -threads 8 -c:v h264_cuvid -i „$1“ -map 0:1 -map 0:0 -c:v:0 h264_nvenc -b:v:0 2000k -c:a:0 copy -f mp4 „/home/<username>/$NAME.mp4“
Damit wird eine VBR Rate von 2.000 Kb/s, der h264_cuvid Decoder für h264 Videos und der h264_nvenc Encoder für des Reencoden genutzt. Es beschleunigt den Vorgang nämlich sehr, wenn die Grafikkarte auch Dekodiert. Die Option „-hwaccel“ gibt den zu nutzenden Treiber an.
Anmerkung: Obiges Script kann nur einen Video- und einen Audiostream verarbeiten, Dual-Ton Tracks muß man selbst einbauen.
Verscripten geht immer…
Das Script nimmt als Argument ein mp4 Video, extrahiert den Dateinamen und erzeugt das Ausgabevideo im Homeverzeichnis ( passenden Benutzernamen einsetzen ). Ein „chmod 700 script“ gepaart mit einem „mv script ~/.local/bin/“ macht das ganze dann in der eigenen Shell leicht ausführbar.
Auch für nicht Nvidia-Grafikkarten gibt es verschiedene Codecs, die die Sache beschleunigen, wie man in obiger FFMpeg Ausgabe sehen kann. Allerdings sind Nvidia-Grafikkarten die schnellsten im Test vom Linux-Magazin gewesen, aus dem ich mir meinen optimierten Befehl hergeleitet habe.Das könnte sich bei der derzeitigen Dominanz von AMD natürlich bereits geändert haben.
Infos: https://www.linux-magazin.de/ausgaben/2017/11/ffmpeg-mit-gpus/