Synology Diskstations mit Intel-Prozessoren unterstützen (immer ?) Hardware-Beschleunigung innerhalb eines Docker-Containers. Trotz intensiver Suche habe ich keine durchgängige Anleitung gefunden wie das zu konfigurieren ist, sondern nur diverse Kommentare, die aber nur einen Teil der Lösung darstellen. Deshalb versuche ich das nun für weniger erfahrene Benutzer am Beispiel von Handbrake darzustellen. Ich habe zwar ein bisschen Erfahrung mit Linux, bin aber weit davon entfernt mich wirklich gut auszukennen. Deshalb entschuldigt, wenn nicht alles ganz korrekt ist, funktioniert hat es bei mir.
Ich gehe aber davon aus, dass
- ihr das Dockerimage jlesage/handbrake installiert habt und damit ohne HW-Beschleunigung Videos per Software rekodieren könnt
- eine SHH-Verbindung zur Diskstation herstellen könnt
Ich verwende eine DS423+ (Prozessor INTEL Celeron J4125) mit DSM 7.1.1-42962 Update 4 und Handbrake 1.6.1.
Es ist derzeit NICHT möglich die nötigen Settings per Export/Ändern/Import der Container-Settings anzugeben da Synology beim Importieren nicht vorgesehene Settings verwirft! Dies wäre eigentlich der bequemste und schönste Weg.
Folgendes Skript ist auf der Diskstation auszuführen. Man findet solche Beschreibungen auch. Es ist aber für weniger erfahrene Benutzer schwer zu verstehen, wie die einzelnen Zeilen für das eigene System abzuändern sind. Deshalb erkläre ich es Zeile für Zeile. Genau das hat mir überall gefehlt. Eine gute Erklärung findet man auch auf (
https://ryanbritton.com/2022/05/hardware-transcoding-on-synology-docker-without-privileged-mode/) die sich jedoch auf das Docker Image jellifin bezieht.
Code:
chmod -R 666 /dev/dri
docker run -d \
-p 5808:5800 \
-e USER_ID="1029" \
--device /dev/dri/renderD128:/dev/dri/renderD128 \
--device /dev/dri/card0:/dev/dri/card0 \
--name Handbrake-Hardware-Encoding-enabled \
--volume "/volume1/Filme:/Filme" \
--volume "/volume1/Filme Neu:/Filme Neu" \
jlesage/handbrake:latest
Der Zugriff auf die GPU-Treiber wird auf read-write für alle Benutzer gesetzt. Müsste man nicht immer machen da die Berechtigung bleibt, aber es schadet auch nicht. Ob die Option -R (rekursiv für alle Inhalte) nötig ist weiß ich nicht genau. Funktioniert hat es! Alternativ kann man auch „chmod 666 /dev/dri/renderD128“ und „chmod 666 /dev/dri/card0“ versuchen, ich bin nicht sicher, ob es dasselbe ist.
Nun wird der Container erzeugt, alle weiteren Zeilen sind 1 Kommando (dies wird durch den \ am Ende jeder Zeile als 1 Kommando interpretiert. Für die Eingabe in der Shell alles in eine Zeile ohne „\“ schreiben.
Erzeugt einen Docker Container, der im Hintergrund laufen soll
der Port über den dann in einem Browser zugegriffen werden soll wird auf 5808 gesetzt. Zugriff dann mittels
http://diskstation:5808/ im Browser (bei mir Edge unter Windows 11), wenn eure Diskstation im Netz "diskstation" heißt oder
http://192.168.0.99:5808/ wenn eure Diskstation diese IP-Adresse hat.
-e setzt den Environment-Parameter USER_ID des Images auf 1029. Setzt da jene ID ein die ihr auch beim normalen Ausführen des bereits funktionierenden Handbrake Docker Containers (ohne GPU) verwendet. Dies ist wichtig um Zugriff auf die lokalen Verzeichnisse der Diskstation (wo eure zu konvertierenden Videos liegen) zu erhalten. Diese ID erhält man initial mittels des Befehls "id Username" auf der Shell. Die ID müsst ihr eigentlich schon haben, da sonst das normale Docker-Image nicht korrekt laufen würde.
Code:
--device /dev/dri/renderD128:/dev/dri/renderD128 \
--device /dev/dri/card0:/dev/dri/card0 \
Intels "Quick Sync Video" Treiber (der auf der Synology bereits installiert ist) dem Container zur Verfügung stellen.
Code:
--name Handbrake-Hardware-Encoding-enabled \
"Handbrake-Hardware-Encoding-enabled" ist der Containername, unter dem das Docker-Image angezeigt wird. Unten der normale Handbrake Container ohne HW Acceleration, darüber der durch diesen Befehl erstelle Container.
Code:
--volume "/volume1/Filme:/Filme" \
--volume "/volume1/Filme Neu:/Filme Neu" \
Ich mappe hier 2 gemeinsame Ordner der Diskstation unter demselben Namen in den Docker Container. Der Name „volume1“ ist fix und hat nichts mit dem Volumenamen in der GUI zu tun! Auf meinem "volume1" befindet sich ein gemeinsamer Ordner mit dem Namen "Filme" der unter dem Namen "Filme" dann in Handbrake bei "open Source" angezeigt wird. Der Benutzer mit der oben eingestellten USER_ID muss Zugriff auf dieses Verzeichnis haben. (Das Gleiche mache ich mit dem Verzeichnis "Filme Neu")
Nimmt dieses Image (das ihr heruntergeladen habt), um den Container zu erstellen.
Nun führen wir das Skript aus. Man kann dies per SSH-Verbindung auf einer Shell machen (sudo nicht vergessen), im normalen Betrieb ist es jedoch einfacher sich im Aufgabenplaner einen Task zu erstellen.
Also "Aufgabenplaner -> Geplante Aufgabe -> Benutzerdefiniertes Skript". Als Benutzer root zuweisen. Als Zeitplan habe ich ein Datum in der Vergangenheit gewählt da ich es nur manuell starten will.
Nun die Befehle von oben ins Skript schreiben.
Wenn ihr nun das Skript im Aufgabenplaner anklickt und ausführt, sollte nach ein paar Sekunden der Container „Handbrake-Hardware-Encoding-enabled „im Docker auftauen und der Satus "Wird ausgeführt" sein und bleiben. (Bild siehe oben)
Diesen Container könnt ihr nun jederzeit normal starten und stoppen und immer wieder verwenden. Eine Neuausführung des Scripts ist nur nach Löschen des Containers (oder update) nötig.
Sollte der Container nicht auftauchen empfehle ich euch zuerst sich das Log anzusehen (man kann sich Ausführungsdetails als Mail senden lassen) bzw. das Skript über eine Konsole auszuführen. Dann sieht man die Fehler schneller. Ich habe es auch initial über die Shell erstellt und erst nachher die Aufgabe im Planer erstellt.
Wenn der Container läuft, solltet ihr über den Browser zugreifen können
http://diskstation:5808/ und unter "Video -> Video Encoder" die entsprechenden hardwarebeschleunigten Encoder angeboten bekommen. Sind die nicht da, aber Handbrake läuft, dann hat der Zugriff auf „/dev/dri/“ nicht funktioniert.
Wenn es Probleme gibt, ist es fast immer ein Rechte/Zugriffsproblem.
Im log von Handbrake kann man auch nach Start des Encoding sehen welche Formate die Hardware unterstützt: Komisch finde ich dass laut diesem Log H264 encode und decode, H265 nur encode und AV1 nur decode unterstützt wird. Aber vielleicht interpretiere ich das falsch.
Code:
CPU: Intel(R) Celeron(R) J4125 CPU @ 2.00GHz
- logical processor count: 4
Intel Quick Sync Video support: yes
Intel Quick Sync Video integrated adapter with index 0
Impl mfxhw64 library path: /opt/intel/mediasdk/lib/libmfxhw64.so.1.35
- Intel Media SDK hardware: API 1.35 (minimum: 1.3)
- Decode support: h264 hevc (8bit: yes, 10bit: yes) av1 (8bit: yes, 10bit: yes)
- H.264 encoder: yes
- preferred implementation: hardware (any) via ANY
- capabilities (hardware): lowpower breftype icq+la+i+downs vsinfo chromalocinfo opt1 opt2+mbbrc+extbrc+trellis+repeatpps+ib_adapt+nmpslice
- H.265 encoder: yes (8bit: yes, 10bit: yes)
- preferred implementation: hardware (any) via ANY
- capabilities (hardware): lowpower bpyramid icq vsinfo masteringinfo cllinfo opt1
- AV1 encoder: no
Aber … zu früh gefreut!
Leider hat bei mir selbst nach Anzeige der entsprechenden Hardware-Encoder die Konvertierung immer noch nicht funktioniert. Im Log von Handbrake fand sich folgender Fehler, der zu einen sofortigen Abbruch des Encodings führte.
Code:
Failure to initialise thread 'Quick Sync Video encoder (Intel Media SDK)'
Soweit ich das herausgefunden muss man den Low-Power Mode“ von Handbrake deaktivieren, da er nicht unterstützt wird aber per Default gesetzt ist. Dazu muss man „lowpower=0“ unter „More Settings“ in den Videoeinstellungen setzen. Man sollte ein eigenes Profil erstellen da man sonst immer wieder diese Einstellung machen muss.
Nun sollte Handbrake mit Hardware en/decoding einwandfrei laufen! Ohne Hardwarebeschleunigung finde ich Handbrake nicht wirklich nutzbar. Die Konvertierung eines Spielfilmes in HD dauerte fast 2 Tage, UHD konnte man ganz vergessen.
Die „Frames per second“ stiegen bei mir von 2-3 auf 30-40 bei Konvertierung eines HD-Films von H264 auf H265.