Docker Image Handbrake jlesage HW-Acceleration

Tanzbaerli

Benutzer
Mitglied seit
06. Dez 2012
Beiträge
27
Punkte für Reaktionen
25
Punkte
53
Habe seit Kurzem die DS423+ auf die ich nach 10 Jahren DS213+ umgestiegen bin.

Handbrake läuft bei mir recht gut (und langsam). Der Celeron J4125 sollte ja HW-Acceleration unterstützen aber hatte bisher irgendjemand Erfolg Handbrake im Docker mit HW-Acceleration zu betreiben.

Bitte keine Diskussion ob das sinnvoll ist oder dass die CPU zu schwach ist ... das ist ein anderes Thema.

Es gibt zwar bei jilsage eine Anleitung aber ich komme damit bisher nicht klar.
Handbrake Anleitung

Das fängt schon mit dem "Run command" an.
Bei "Image->Starten->Ausführungsbefehl" versuche ich "--device /dev/dri" anzugeben was immer dazu führt dass der Container gar nicht mehr startet.

Sollte dies gelingen (möglicherweise über shell) frage ich mich ob der nötige Treiber überhaupt dort auch installiert ist oder muss man den auch noch (wie) installieren?

Es wäre toll wenn jemand dem das gelungen ist die nötigen Schritte postet!
 

Tanzbaerli

Benutzer
Mitglied seit
06. Dez 2012
Beiträge
27
Punkte für Reaktionen
25
Punkte
53
Habe inzwischen über Export/edit/Import der Konfiguration probiert aber mir ist die Syntax des jason files nicht klar. Wie trägt man da ein dass das Device "exposed" wird?
Ist das der richtige Weg?

Entweder starter der Container nicht mehr oder es hat keine Auswirkung.

Glaube langsam das geht gar nicht auf dem Synology, habe keinerlei Beiträge im Netz gefunden wo jemand das geschafft hat, nur Tips wie es gehen sollte/könnte.
 

EDvonSchleck

Gesperrt
Mitglied seit
06. Mrz 2018
Beiträge
4.703
Punkte für Reaktionen
1.120
Punkte
214
Wozu musst du die Filme recodieren, wenn das die DS nebenbei beim Mediaserver z.B. Plex oder Jellyfin direkt machen kann?
Mich würde das interessieren, was das Anliegen dahinter ist.
 

Tanzbaerli

Benutzer
Mitglied seit
06. Dez 2012
Beiträge
27
Punkte für Reaktionen
25
Punkte
53
Eigentlich habe ich klar gesagt. Bitte keine Diskussion ob das sinnvoll ist oder dass die CPU zu schwach ist ... das ist ein anderes Thema.

Warum will man Filme umkodieren? Wenn dich das interessiert mache einen Thread dazu auf!
 

EDvonSchleck

Gesperrt
Mitglied seit
06. Mrz 2018
Beiträge
4.703
Punkte für Reaktionen
1.120
Punkte
214
Wie bist du denn drauf? Es war eine einfache Frage, warum du dir filme mit Handbrake kodieren willst, anstatt es direkt beim Abspielen zu machen? Auf die Frage hast du nicht geantwortet. Scheinbar hast du die Frage nicht verstanden.

Abgesehen macht es eh nicht viel Sinn neu zu codieren. Mit einer solchen Aussage musst du dich nicht über eine mangelnde Unterstützung wundern.
 

haydibe

Benutzer
Sehr erfahren
Mitglied seit
12. Apr 2016
Beiträge
1.522
Punkte für Reaktionen
412
Punkte
103
@Tanzbaerli: das geht nicht über die Docker-UI. Das gilt auch für exportien, ändern und neu importieren der Konfiguration.

Wenn, geht es via SSH-Verbindung im Terminal mit `sudo docker run...` oder `sudo docker-compose`. Wenn man kein bock auf SSH hat, dann kann man sich Portainer aufsetzen und den Container darüber starten. Wichtig: wenn man den Container nachträglich mit der Synyo-UI editiert, werden alle Konfiguration entfernt, mit denen die Syno nichts anfangen kann.
 
  • Like
Reaktionen: Tanzbaerli

Tanzbaerli

Benutzer
Mitglied seit
06. Dez 2012
Beiträge
27
Punkte für Reaktionen
25
Punkte
53
Wie bist du denn drauf? Es war eine einfache Frage, warum du dir filme mit Handbrake kodieren willst, anstatt es direkt beim Abspielen zu machen? Auf die Frage hast du nicht geantwortet. Scheinbar hast du die Frage nicht verstanden.

Abgesehen macht es eh nicht viel Sinn neu zu codieren. Mit einer solchen Aussage musst du dich nicht über eine mangelnde Unterstützung wundern.

Weißt du ich finde es echt lähmend dass bei vielen Threads immer die Frage kommt warum man das machen will und das ist eigentlich gar nicht das Thema.

2 Hauptgünde um Videofiles zu konvertieren sind
  • Ein kompatibles Format zu erzeugen (brauche ich nicht da KODI sowieso alles abspielen kann)
  • Ein Format der Videodatei zu erzeugen das bei gleicher Qualität viel weniger Platz benötigt (H265 z.Bsp) ... das möchte ich
Und da das NAS sowieso immer läuft kann man das dafür verwenden.
Weiters ist es technisch interessant das so zu machen und die Geschwindigkeit zu vergleichen.
 

Tanzbaerli

Benutzer
Mitglied seit
06. Dez 2012
Beiträge
27
Punkte für Reaktionen
25
Punkte
53
@Tanzbaerli: das geht nicht über die Docker-UI. Das gilt auch für exportien, ändern und neu importieren der Konfiguration.

Wenn, geht es via SSH-Verbindung im Terminal mit `sudo docker run...` oder `sudo docker-compose`. Wenn man kein bock auf SSH hat, dann kann man sich Portainer aufsetzen und den Container darüber starten. Wichtig: wenn man den Container nachträglich mit der Synyo-UI editiert, werden alle Konfiguration entfernt, mit denen die Syno nichts anfangen kann.

Danke für deine Hinweise. Leider findet man überall nur Schnipsel und Hinweise wie das gehen sollte und keine wirklich Anleitung für nicht so erfahrene Benutzer.

Wie du unten siehst habe ich es aber inzwischen hingebracht, mir fehlen aber noch ein paar Details. Dann werde ich versuchen eine genaue Anleitung (für unerfahrene Nutzer) zu posten.

Handbrake.jpg
 

Tanzbaerli

Benutzer
Mitglied seit
06. Dez 2012
Beiträge
27
Punkte für Reaktionen
25
Punkte
53
Puh ... harte Arbeit um es wirklich zum Laufen zu bringen.

Trotz Auswahlmöglichkeit der Hardwarebeschleunigung gab es noch ein kniffliges Problem das eigentlich ein Fehler von Handbrake in Zusammenarbeit mit der GPU ist und kein Diskstation Problem.

Aber ... es zahlt sich unbedingt aus!

Die Konvertierungsgeschwindigkeit desselben HD Videos (H264 zu H265) steigt von 2-3 Frames pro Sekunde auf 39 Frames pro Sekunde bei einer CPU-Auslastung von 46%. 🥳

Zum Vergleich: Ein Ryzen 5700G (software recoding auf 16 threads unter Windows mit 100% CPU Auslastung!) schafft ca. 52 frames pro Sekunde.

Dachte nie dass die DS423+ so leistungsfähig ist! Habe zum Glück dieses Modell erworben, dachte ursprünglich dass ich die GPU nicht brauche aber wenn die so gut ist!

Wie gesagt folgt eine genaue Anleitung ... dazu brauche ich aber noch etwas Zeit da sie vernünftig Schritt für Schritt alles erklären soll ich noch ein paar Dinge ausprobieren möchte. Man muss ja "nebenbei" auch noch arbeiten.
 

Tanzbaerli

Benutzer
Mitglied seit
06. Dez 2012
Beiträge
27
Punkte für Reaktionen
25
Punkte
53
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

Code:
chmod -R 666 /dev/dri

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.

Code:
docker run -d \

Erzeugt einen Docker Container, der im Hintergrund laufen soll

Code:
-p 5808:5800 \

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.

Code:
-e USER_ID="1029" \

-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.

1.png

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")

2.png

Code:
jlesage/handbrake:latest

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.

3.png

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.

4.png

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.

5.png

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.
 

Anhänge

  • 4.png
    4.png
    41,3 KB · Aufrufe: 8

ctrlaltdelete

Benutzer
Contributor
Sehr erfahren
Maintainer
Mitglied seit
30. Dez 2012
Beiträge
14.036
Punkte für Reaktionen
6.048
Punkte
569
WOW, vielen Dank!!!
 

Mahoessen

Benutzer
Mitglied seit
20. Jul 2016
Beiträge
1.075
Punkte für Reaktionen
220
Punkte
83
TOP und super beschrieben, auf meiner DS218+ mit J3355, TS-Container von der SatAnlage(TvHeadend) zu H265, SD Auflösung, über 60 fps average!
 

plang.pl

Benutzer
Contributor
Sehr erfahren
Mitglied seit
28. Okt 2020
Beiträge
15.028
Punkte für Reaktionen
5.401
Punkte
564

synick

Benutzer
Mitglied seit
03. Nov 2024
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
Moin zusammen,

und vielen Dank an Tanzbärli für die saubere Arbeit.

Ich hätte hier einen, womöglich einfacheren, Ansatz für alle die den Portainer nutzen.

Arbeitsschritte:

- Stack handbrake-stack.txt herunterladen.
- Wie oben schon angesprochen, im Terminal folgende Befehle ausführen (ggf anpassen):


sudo chmod -R 666 /dev/dri
mkdir /volume1/docker/handbrake
mkdir /volume1/docker/handbrake/config
mkdir /volume1/docker/handbrake/output
mkdir /volume1/docker/handbrake/storage
mkdir /volume1/docker/handbrake/trash
mkdir /volume1/docker/handbrake/watch


- handbrake-stack.txt mit einem Editor öffnen und Group-id und User-ID anpassen. Ich hatte das erst vergessen: hat aber trotzdem funktioniert.

- Im Portainer auf Stacks gehen und dort "+ Add Stack". anwählen
- Oben in Kleinbuchstaben(!) den Containernamen angeben und in den Inhalt von handbrake-stack.txt in denWebeditor einfügen.

-Blauen Button "Update the Stack" (oder so ähnlich) drücken, fertig.

Der Container sollte jetzt laufen und über eure <Synologyip>:5800 solltet Ihr jetzt Zugriff auf Handbrake mitsamt der INTEL Codecs haben.

Weitere Infos:

In diesem Stack habe ich einige Optionen aus diesem Manual eingearbeitet, unter anderem schon "lowpower=0". Das müsst Ihr also nicht mehr im Fenster angeben. Diese Optionen werden jetzt zwangsweise vom Intel Chip genutzt, egal was Ihr in Handbrake eingebt. Also nach Belieben im Webedior (Stack) anpassen.

Weiter Standard Einstellungen in diesem Stack:

--target-usage 1
Es wird die beste Quaaĺitätseinstellung verwendet die die GPU kann. Standard war 2.

--lookahead-depth 60
Es wird nicht 40 sondern 60 Frames vorrausgeschaut. Das könnte bei der Komprimierung etwas länger dauern, dürfte aber die Bildqualität verbessern.

--force-cqp 1
Hiermit wird auf jeden Fall die Bildqualität konstant gehalten. Beim Streaming will an einen guten Kompromis zwischen Qualität und Datenrate haben, nicht aber bei der Komprimierung von Videodateien.

Happy compressing...
 
Zuletzt bearbeitet:


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat