Jellyfin: NVIDIA-GPU für Transcodierung in Docker nutzen
Richten Sie NVENC und NVDEC in Jellyfin mit Docker Compose ein. Prüfen Sie Host, Container und echte GPU-Transcodierung mit nvidia-smi.
Was Sie einrichten
Hardware-Transcodierung von Jellyfin auf einer NVIDIA-GPU umfasst vier Schritte in fester Reihenfolge. Nur der letzte Schritt findet innerhalb von Jellyfin statt. Der Container kann keine GPU sehen, deren Treiber auf dem Host nicht geladen wurde. Jellyfin kann keine GPU verwenden, die der Container nicht sehen kann. Halten Sie diese Reihenfolge ein. Dann gibt es für jeden Fehler eine eindeutige Prüfungsstelle.
- Installieren Sie den NVIDIA-Treiber auf dem Host und bestätigen Sie die Installation mit
nvidia-smi. - Installieren Sie das NVIDIA Container Toolkit, damit Docker eine GPU an einen Container übergeben kann.
- Reservieren Sie die GPU in
docker-compose.ymlfür den Jellyfin-Dienst und bestätigen Sie anschließend, dass der Container sie sieht. - Aktivieren Sie NVENC und NVDEC in den Wiedergabeeinstellungen von Jellyfin und bestätigen Sie anschließend, dass eine tatsächliche Wiedergabe diese Funktionen verwendet.
NVENC (NVIDIA encoder) und NVDEC (NVIDIA decoder) sind fest verdrahtete Funktionsblöcke auf der Karte. Sie bestehen aus separater Hardware und sind nicht Teil der Shader-Kerne, die CUDA (compute unified device architecture) ausführen. Genau deshalb lohnt sich diese Konfiguration: Ein Stream, der bei softwarebasierter Verarbeitung mehrere CPU-Kerne auslastet, benötigt nur einen kleinen Teil eines CPU-Kerns und einen dedizierten Hardwareblock auf der GPU.
Direktwiedergabe ist jeder Transkodierung überlegen, prüfen Sie das zuerst
Bevor Sie etwas davon konfigurieren, ermitteln Sie, ob Sie aus einem einfach behebbaren Grund transkodieren. Jellyfin transkodiert, wenn der Client die Datei nicht unverändert wiedergeben kann. Der Grund gehört immer zu einer kurzen Liste: Videocodec, Audiocodec, Containerformat, bildbasierte Untertitel oder eine vom Client angeforderte Bitratenbegrenzung.
Öffnen Sie Dashboard und anschließend Playback. Beobachten Sie eine aktive Sitzung, während eine Datei wiedergegeben wird. Eine als Direct playing gekennzeichnete Sitzung überträgt die Datei unverändert und benötigt fast keine CPU-Leistung. Eine als Transcoding gekennzeichnete Sitzung zeigt den von Jellyfin ermittelten Grund. Entfernen Sie diesen Grund, muss die GPU überhaupt nicht arbeiten.
Zwei Änderungen beseitigen die meisten Transkodierungen. Setzen Sie die Qualität der Client-App auf Auto oder auf den Maximalwert. Fordert ein Client 4 Mbps an, erzwingt das die Neucodierung einer Datei mit 20 Mbps, unabhängig vom verwendeten Codec. Verwenden Sie anschließend eine native Client-App statt eines Browser-Tabs. Ein Browser ist der am stärksten eingeschränkte Player, den Sie verwenden. Eine native App auf demselben Fernseher kann dieselbe Datei häufig direkt wiedergeben.
Bildbasierte Untertitel sind die Ausnahme, die sich durch keine Client-Einstellung beheben lässt. PGS-Untertitel aus einem Blu-ray-Rip und VOBSUB aus einem DVD-Rip sind Bilder. Sie müssen daher direkt in das Video gezeichnet werden. Das bedeutet eine vollständige Neucodierung des Videostreams. Textuntertitel im SRT-Format werden als separate Spur an den Client übertragen und verursachen keinen zusätzlichen Aufwand. Wenn möglich, lohnt es sich mehr, Untertitelspuren in Text umzuwandeln als eine GPU anzuschaffen. Die serverseitige Konfiguration wird im Leitfaden zum Betrieb eines Jellyfin-Medienservers auf einem VPS behandelt.
Die meisten VPS-Tarife haben überhaupt keine GPU
Standard-VPS-Tarife enthalten keine GPU. Führen Sie diesen Befehl auf dem Server aus, bevor Sie weitere Planungen vornehmen.
lspci -nn | grep -Ei "3d|display|vga"Auf einem typischen KVM-VPS wird ein virtueller Anzeigeadapter des Hypervisors oder nichts Brauchbares ausgegeben. Dieses Gerät kann keine Videos codieren. Eine echte GPU ist nur verfügbar, wenn der Anbieter eine physische Karte an Ihre Instanz durchreicht oder Ihnen einen Teil davon zuweist. Entsprechend teuer sind diese Tarife. Welche Workloads die Kosten für einen GPU-VPS tatsächlich rechtfertigen erläutert, für wen sich ein solcher VPS eignet und für wen nicht.
Wenn keine GPU vorhanden ist, sollten Sie Direct Play anstreben und Software-Transcoding als Ausnahme betrachten. Ein einzelner Software-Transcode von 1080p-H.264 ist anspruchsvoll, auf einigen CPU-Kernen aber noch bewältigbar. Ein 4K-HDR-Software-Transcode mit Tone Mapping kann auf einem kleinen VPS nicht in Echtzeit abgeschlossen werden. Deshalb ruckelt der Stream, während die CPU dauerhaft bei 100 Prozent ausgelastet ist.
Installieren Sie den NVIDIA-Treiber auf dem Host
Jellyfin 10.11 dokumentiert unter Linux eine erforderliche NVIDIA-Treiberversion von 520.56.06. Ubuntu stellt einen Helfer bereit, der automatisch ein passendes Paket auswählt.
sudo ubuntu-drivers list --gpgpu
sudo ubuntu-drivers install --gpgpu
sudo reboot--gpgpu wählt die Headless-Servervariante des Treibers aus. Diese Variante ist für einen Medienserver geeignet, weil auf dem System keine Desktop-Umgebung läuft. Der Listenbefehl zeigt die verfügbaren Zweige an. Sie können einen Zweig anhand seines Namens festlegen, zum Beispiel sudo ubuntu-drivers install --gpgpu nvidia:570-server. Verwenden Sie einen Zweig, der tatsächlich in der Liste ausgegeben wird, nicht den hier angegebenen.
Die Servervariante installiert nvidia-smi nicht immer automatisch. Installieren Sie das passende Utils-Paket für den ausgewählten Zweig, zum Beispiel sudo apt install nvidia-utils-570-server. Prüfen Sie anschließend den Treiber.
nvidia-smiBei einem korrekten Ergebnis werden im Kopf der Tabelle die Treiberversion und die CUDA-Version angezeigt. Ihre Grafikkarte wird namentlich aufgeführt, und die Prozessliste bleibt leer. Zwei Fehler treten hier häufig auf. nvidia-smi: command not found bedeutet, dass das Utils-Paket fehlt, nicht der Treiber. NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver bedeutet, dass das Kernelmodul nicht geladen ist. Bei einer neuen Installation wurde das System dann fast immer noch nicht neu gestartet, oder Secure Boot verhindert das Laden eines nicht signierten Moduls. Prüfen Sie mit lsmod | grep nvidia, ob das Modul vorhanden ist.
NVIDIA Container Toolkit installieren
Der Treiber ermöglicht dem Host die Nutzung der GPU. Docker stellt sie trotzdem keinem Container bereit, weil dem Container sowohl die Gerätedateien als auch die Treiberbibliotheken fehlen. Das NVIDIA Container Toolkit bindet beides beim Start des Containers ein. Dies sind die Installationsbefehle von NVIDIA für Debian und Ubuntu.
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkitDie Installation des Pakets reicht nicht aus, weil Docker über die Verfügbarkeit der Runtime informiert werden muss.
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart dockernvidia-ctk runtime configure schreibt einen nvidia-Runtime-Eintrag in /etc/docker/daemon.json. Der Neustart wird häufig übersprungen. Genau das verursacht den häufigsten Fehler in dieser gesamten Einrichtung. Testen Sie die Anbindung, bevor Sie Jellyfin konfigurieren.
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smiDaraufhin sollte dieselbe Tabelle wie auf dem Host ausgegeben werden. Falls stattdessen ein Fehler zur Auswahl eines Gerätetreibers mit GPU-Funktionen auftritt, kennt der Docker-Daemon die nvidia-Runtime nicht. Führen Sie den Konfigurationsbefehl erneut aus und starten Sie den Daemon neu.
Die Jellyfin-Container-GPU in Docker Compose verfügbar machen
Dies ist die moderne Compose-Form und entspricht dem von Jellyfin veröffentlichten Beispiel.
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
user: 1000:1000
network_mode: host
restart: unless-stopped
environment:
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=all
volumes:
- /srv/jellyfin/config:/config
- /srv/jellyfin/cache:/cache
- /srv/media:/media:ro
runtime: nvidia
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]Starten Sie den Container und fragen Sie ihn direkt ab.
docker compose up -d
docker compose exec jellyfin nvidia-smiWenn dieser Befehl die Treibertabelle aus dem Container ausgibt, wurde die GPU korrekt durchgereicht. Alle verbleibenden Probleme liegen dann an einer Jellyfin-Einstellung.
Vier Zeilen in dieser Datei müssen erklärt werden. capabilities: [gpu] wird von Compose selbst benötigt. Fehlt die Zeile, verweigert Compose den Start des Dienstes, anstatt ihn ohne GPU zu starten. NVIDIA_DRIVER_CAPABILITIES=all ist wichtig, weil das Toolkit die Videobibliotheken nur dann in den Container einbindet, wenn die Videofunktion angefordert wird. Außerdem führt die Jellyfin-Dokumentation diese Variable als Voraussetzung für das offizielle Image auf. Ohne sie funktioniert CUDA, NVDEC jedoch nicht. Im Transkodierungs-Log erscheint dann Cannot load libnvcuvid.so.1. network_mode: host verwendet auch das Beispiel von Jellyfin. Die automatische Client-Erkennung über UDP-Port 7359 funktioniert in einem Bridge-Netzwerk nicht.
user: 1000:1000 ist die letzte Zeile. Sie hat nichts mit der GPU zu tun. Sie legt fest, welche Dateien Jellyfin auf Ihrem Medien-Mount lesen kann. Bei einer abweichenden Zuordnung bleibt die Bibliothek leer, anstatt einen Berechtigungsfehler zu melden. Wie PUID und PGID einen Containerbenutzer den Dateien auf der Festplatte zuordnen erklärt die Nummerierung. Es handelt sich um dieselbe Nummerierung, die Sie bereits festgelegt haben, wenn Sie den Sonarr- und Radarr-Stack in Docker Compose daneben betreiben.
Warum die meisten Anleitungen weiterhin runtime: nvidia schreiben
Die ältere Form erscheint in nahezu jeder Anleitung, die Sie finden, und sie ist nicht falsch. Sie ist historisch bedingt. Das ursprüngliche nvidia-docker2-Paket registrierte eine OCI-Runtime namens nvidia. Die einzige Möglichkeit, eine GPU in einen Container einzubinden, war daher --runtime=nvidia zusammen mit NVIDIA_VISIBLE_DEVICES. Docker 19.03 fügte das Flag --gpus und eine geeignete API für Geräteanforderungen hinzu. Compose brauchte länger, um diese Funktion zu übernehmen. Als dies geschah, wurde die Geräteanforderung unter deploy.resources.reservations.devices abgelegt. Die meisten Benutzer hatten diesen Schlüssel ignoriert, weil deploy zuvor Docker Swarm bezeichnete.
Daher funktionieren heute beide Formen. Das veröffentlichte Beispiel von Jellyfin verwendet beide gleichzeitig. Die Beibehaltung von runtime: nvidia verursacht keinen zusätzlichen Aufwand und macht die Datei mit älteren Compose-Versionen kompatibel. Wenn Sie nur runtime: nvidia beibehalten und den Block deploy entfernen, müssen Sie NVIDIA_VISIBLE_DEVICES=all beibehalten. Dieser Legacy-Pfad liest die Umgebungsvariable, um zu bestimmen, welche Geräte eingebunden werden sollen. Eine Geräteanforderung kann er stattdessen nicht auswerten.
NVIDIA-Hardware-Transkodierung in Jellyfin aktivieren
Bisher wurde Jellyfin noch nicht angewiesen, die Grafikkarte zu verwenden. Öffnen Sie Dashboard, dann Playback und anschließend Transcoding. Setzen Sie Hardware acceleration auf Nvidia NVENC. Aktivieren Sie Enable hardware encoding. Andernfalls dekodiert Jellyfin auf der GPU und kodiert anschließend auf der CPU. Dieser verwirrende Zwischenzustand zeigt GPU-Aktivität, während die CPU weiterhin stark ausgelastet wird.
Aktivieren Sie Enable enhanced NVDEC decoder. Damit wechseln Sie zwischen dem aktuellen NVDEC-Pfad und dem älteren CUVID-Pfad. Lassen Sie die Option aktiviert. Die Verarbeitung von Dolby Vision benötigt diese Option, damit NVDEC überhaupt verwendet wird.
Aktivieren Sie unter Enable hardware decoding for nur die Codecs, die Ihre Grafikkarte tatsächlich dekodieren kann. Bei dieser Einstellung treten die meisten Fehler auf. Wenn Sie AV1 auf einer Grafikkarte ohne AV1-Decoder aktivieren, wird keine Fehlermeldung angezeigt. Jellyfin fordert Hardware-Dekodierung an, erhält sie aber nicht und verwendet stattdessen Software-Dekodierung. Dadurch steigt die CPU-Auslastung, während die GPU nahezu ungenutzt bleibt. Das sieht genau so aus, als hätte Passthrough nie funktioniert.
Für die gesamte Seite gilt außerdem eine weitere Einschränkung: Hardwarebeschleunigung funktioniert nur mit dem mitgelieferten jellyfin-ffmpeg-Build. Wenn Sie den FFmpeg-Pfad auf ein System-FFmpeg gesetzt haben, erhalten Sie nur teilweise oder gar keine Beschleunigung.
Welche Codecs Ihre GPU-Generation decodieren und encodieren kann
Dies sind die von Jellyfin dokumentierten Grenzen für NVENC und NVDEC. Decodieren und Encodieren sind getrennte Fähigkeiten. Eine Karte kann die eine Fähigkeit unterstützen, ohne die andere zu unterstützen.
- H.264 8-bit: Jede NVIDIA-GPU mit NVENC und NVDEC decodiert und encodiert diesen Codec.
- HEVC 8-bit: Decodieren und Encodieren werden ab Maxwell der zweiten Generation (GM206) unterstützt.
- HEVC 10-bit: Decodieren wird ab Maxwell der zweiten Generation unterstützt, Encodieren jedoch erst ab Pascal.
- AV1: Decodieren wird ab Ampere unterstützt, Encodieren erst ab Ada Lovelace.
Die Trennung bei HEVC 10-bit verursacht in der Praxis die meisten Probleme. Eine Karte aus der Maxwell-Generation decodiert Ihre 4K-HDR-Datei auf der GPU und kann anschließend keine 10-bit-Ausgabe encodieren. Jellyfin encodiert daher stattdessen H.264 mit 8-bit. Das wird weiterhin abgespielt und ist für die meisten Clients ohnehin die richtige Wahl. AV1-Encodierung ist unabhängig von Ihrer Karte im Jahr 2026 nur selten sinnvoll, weil die clientseitige AV1-Decodierung weiterhin nur eingeschränkt unterstützt wird und ein Transcoding ohnehin erforderlich ist, um einen Client zu erreichen, der bereits Probleme hatte.
Warum Tone Mapping die GPU unbemerkt erneut auslastet
Das Tone Mapping von HDR (High Dynamic Range) zu SDR (Standard Dynamic Range) ist die Einstellung, die Ihr GPU-Budget aufbraucht. Der Grund liegt in der Architektur. Die Decodierung läuft auf NVDEC. Die Codierung läuft auf NVENC. Das Tone Mapping läuft auf keinem dieser Blöcke. Es ist ein CUDA-Filter, der auf den Shader-Kernen ausgeführt wird. Dabei handelt es sich um denselben universellen GPU-Bereich, der auch Rechenoperationen ausführt. Ein 4K-HDR-Stream, der Tone Mapping benötigt, verwendet daher den Decoder und den Encoder und belastet zusätzlich die Shader.
Jellyfin dokumentiert CUDA-Tone-Mapping als verfügbar auf jeder NVIDIA-GPU, die HEVC mit 10 Bit decodieren kann. Deshalb wird die Option auch auf Karten angezeigt und funktioniert dort, obwohl diese Karten die Last bei 4K nicht dauerhaft bewältigen können. Das zeigt sich durch einen Stream, der startet, puffert und sich nie stabilisiert, während nvidia-smi meldet, dass der Encoder kaum ausgelastet ist.
Deshalb sollten Sie die Shader-Auslastung separat überwachen.
nvidia-smi dmon -s uDer Befehl gibt einmal pro Sekunde eine Zeile mit getrennten Spalten für sm, enc und dec aus. Niedrige Werte für enc und dec neben einem hohen sm-Wert bedeuten, dass die Fixed-Function-Blöcke kaum ausgelastet sind und die Shader den Engpass bilden. In diesem Fall verursacht das Tone Mapping, die Skalierung oder das Einbrennen von Untertiteln die zusätzliche Last. Der CUDA-Pfad unterstützt außerdem Dolby Vision Profile 5 per Zero-Copy. Das ist relevant, weil die Frames ohne Zero-Copy zwischen den einzelnen Filterschritten in den Systemspeicher und zurück übertragen werden. Dieser Hin- und Rücktransport verbraucht bei jedem einzelnen Frame Bandbreite.
Was die Begrenzung gleichzeitiger NVENC-Sitzungen bei Consumer-GPUs tatsächlich beschränkt
The data behind this chart
[
{
"label": "GeForce RTX 5090",
"nvenc_engines": 3,
"max_encode_sessions": 12
},
{
"label": "GeForce RTX 4090",
"nvenc_engines": 2,
"max_encode_sessions": 12
},
{
"label": "GeForce RTX 4060",
"nvenc_engines": 1,
"max_encode_sessions": 12
}
]Das sind die von NVIDIA veröffentlichten Werte der Vergleichstabelle mit Stand August 2026, keine hier durchgeführten Messungen. Eine GeForce ist unabhängig vom Modell auf 12 gleichzeitige Encode-Sitzungen begrenzt. Die Begrenzung liegt im Treiber und nicht in der Hardware. NVIDIA hat sie im Lauf der Jahre mehrfach angehoben. Verwenden Sie daher die aktuelle Vergleichstabelle und nicht einen alten Forenbeitrag. Die Anzahl der Engines ist der Wert, der sich tatsächlich mit der GPU ändert: Die GeForce RTX 5090 verfügt über 3 NVENC-Engines, während die GeForce RTX 4060 über 1 verfügt. Mehr Engines erhöhen den parallelen Encode-Durchsatz, nicht die maximale Anzahl der Sitzungen.
Die Begrenzung zählt Encode-Sitzungen und damit nur Transcoding-Streams. Direct Play und Remuxing öffnen keine Encode-Sitzung. Data-Center-Karten wie die L4 sind in derselben Vergleichstabelle als unbegrenzt aufgeführt. Eine Data-Center-Karte wird normalerweise von einem GPU-VPS-Tarif bereitgestellt. Daher betrifft diese Begrenzung hauptsächlich Home-Server.
Wenn Sie die Begrenzung erreichen, schlägt das Transcoding fehl und das FFmpeg-Log enthält OpenEncodeSessionEx failed: out of memory (10). Die Meldung nennt den Speicher als Ursache. Eine Ablehnung wegen des Sitzungslimits verwendet jedoch denselben Code. Prüfen Sie daher zuerst die Anzahl der gleichzeitig laufenden Streams, bevor Sie nach einem VRAM-Leak suchen. In der Praxis erreichen die meisten Benutzer die Grenze des Tone-Mappings oder ihrer Upload-Bandbreite deutlich vor Sitzung zwölf.
GPU-Transkodierung nachweisen, statt der Konfiguration zu vertrauen
Eine gespeicherte Einstellung ist kein Nachweis. Geben Sie eine Datei wieder, bei der bekanntermaßen eine Transkodierung erforderlich ist, und führen Sie anschließend drei Prüfungen durch.
- Öffnen Sie Dashboard und anschließend Playback. Die aktive Sitzung muss Transcoding anzeigen und den Grund nennen. Wird Direct playing angezeigt, findet keine Transkodierung statt. Sie testen dann die falsche Datei.
- Öffnen Sie Dashboard und anschließend Logs. Öffnen Sie das neueste
FFmpeg.Transcode-Protokoll. Eine Hardware-Transkodierung zeigt-hwaccel cudaund-hwaccel_output_format cudain der Befehlszeile sowieh264_nvencoderhevc_nvencals Encoder. Wird dortlibx264angezeigt, transkodieren Sie unabhängig von den Angaben auf der Einstellungsseite per Software. - Führen Sie auf dem Host während der Wiedergabe
nvidia-smiaus. Ein Prozess von/usr/lib/jellyfin-ffmpeg/ffmpegmuss mit zugewiesenem GPU-Speicher erscheinen.nvidia-smi dmon -s umuss in den Spalten für enc und dec Werte ungleich 0 anzeigen.
Führen Sie die dritte Prüfung auf dem Host aus, nicht im Container. nvidia-smi zeigt innerhalb eines Containers normalerweise eine leere Prozessliste, weil der Befehl die Prozess-IDs außerhalb des eigenen Namespace nicht sehen kann. Die Auslastungswerte werden dagegen weiterhin korrekt angezeigt. Eine leere Prozessliste innerhalb des Containers ist kein Fehler.
Wenn Jellyfin auf Software zurückfällt, ohne Sie zu informieren
Jellyfin versucht, die Wiedergabe fortzusetzen. Wenn kein Hardwarepfad verfügbar ist, wechselt es auf Softwareverarbeitung, statt den Stream abzubrechen. Aussagekräftig sind daher die CPU-Auslastung und das FFmpeg-Log, nicht ein Fehlerbanner.
Cannot load libnvcuvid.so.1 im Transcoding-Log bedeutet, dass die Decoder-Bibliothek nie in den Container eingebunden wurde. Setzen Sie NVIDIA_DRIVER_CAPABILITIES=all und erstellen Sie den Container neu, weil eine Änderung der Umgebung docker compose up -d für die Neuerstellung benötigt. Ein einfacher Neustart übernimmt die alten Einstellungen.
No capable devices found aus h264_nvenc bedeutet, dass FFmpeg die Encoder-Bibliothek erreicht hat, aber keine verwendbare Karte gefunden wurde. Prüfen Sie docker compose exec jellyfin nvidia-smi erneut. Meist wurde die Gerätezuweisung entfernt oder der Container aus einer veralteten Datei neu erstellt.
Eine hohe CPU-Auslastung bei geringer GPU-Auslastung bedeutet, dass die Decodierung unbemerkt fehlschlägt. Deaktivieren Sie die Codecs, die Ihre Generation nicht decodieren kann. Geben Sie anschließend dieselbe Datei erneut wieder und prüfen Sie das FFmpeg-Log erneut, um festzustellen, ob -hwaccel cuda erscheint.
Wenn ein Transcoding bei 4K HDR startet und anschließend hängen bleibt, während 1080p problemlos funktioniert, ist die Grenze des Tone-Mappings erreicht. Die Installation ist nicht defekt. Bestätigen Sie dies anhand der Spalte sm in nvidia-smi dmon -s u. Verringern Sie anschließend entweder die vom Client angeforderte Auflösung oder verwenden Sie 4K-HDR-Dateien auf Clients, die sie per Direct Play wiedergeben können.
FAQ
Warum verwendet Jellyfin weiterhin die CPU, nachdem ich NVENC aktiviert habe?
Prüfen Sie das neueste FFmpeg.Transcode-Log unter Dashboard und anschließend Logs. Wenn dort libx264 angezeigt wird, wurde überhaupt kein Hardwarepfad verwendet. Das bedeutet meistens, dass der Container die GPU nicht sehen kann. Führen Sie daher docker compose exec jellyfin nvidia-smi zur Bestätigung aus. Wenn h264_nvenc angezeigt wird, die CPU aber weiterhin ausgelastet ist, läuft die Decodierung per Software. Das passiert, wenn Sie einen Codec aktiviert haben, den Ihre Karte nicht decodieren kann, oder wenn Enable hardware encoding deaktiviert blieb und deshalb nur die halbe Pipeline auf die GPU verlagert wurde.
Benötige ich die Zeile runtime: nvidia in Docker Compose weiterhin?
Nein, wenn der deploy.resources.reservations.devices-Block vorhanden ist und Sie eine aktuelle Version von Docker Compose verwenden. Der Block ist die moderne Form für Geräteanforderungen und erfüllt dieselbe Aufgabe. runtime: nvidia ist der ältere Pfad aus der nvidia-docker2-Ära. Er funktioniert weiterhin, und das von Jellyfin veröffentlichte Beispiel enthält beide Varianten. Beide Varianten gleichzeitig zu verwenden, ist unproblematisch. Wenn Sie nur runtime: nvidia verwenden, müssen Sie außerdem NVIDIA_VISIBLE_DEVICES=all beibehalten, weil dieser Pfad keine Geräteanforderung enthält, die Geräteliste aus der Umgebung übernimmt.
Wie viele Streams kann eine NVIDIA GPU gleichzeitig transcodieren?
Die von NVIDIA veröffentlichte Übersicht begrenzt GeForce-Karten seit August 2026 auf zwölf gleichzeitige Encodierungssitzungen. Rechenzentrumskarten sind als uneingeschränkt aufgeführt. Diese Obergrenze ist nur selten der begrenzende Faktor. Das Tone Mapping von HDR nach SDR läuft auf den Shader-Kernen und nicht auf NVENC. Daher können bereits einige 4K-HDR-Streams die Shader-Kerne auslasten, lange bevor der Sitzungszähler relevant wird. Messen Sie Ihren eigenen Fall mit nvidia-smi dmon -s u und beobachten Sie die Spalte sm, nicht die Anzahl der Sitzungen.
Kann ich Hardware-Transcodierung auf einem VPS ohne GPU verwenden?
Nein. Für die Encodierung ist der physische NVENC-Block erforderlich. lspci -nn | grep -Ei "3d|display|vga" zeigt auf einem gewöhnlichen VPS nur einen virtuellen Anzeigeadapter des Hypervisors. Auf einem Tarif ohne GPU besteht die realistische Lösung darin, Transcodierungen zu vermeiden: Setzen Sie die Qualitätseinstellung des Clients auf Auto, verwenden Sie statt eines Browsers eine native Client-Anwendung und wandeln Sie bildbasierte Untertitelspuren in Text um, damit sie keine erneute Video-Encodierung erzwingen.
Warum ruckelt 4K HDR, während 1080p problemlos transcodiert wird?
Die beiden Workloads verwenden unterschiedliche Teile der Karte. Eine 1080p-SDR-Transcodierung umfasst nur Decodierung und Encodierung. Beides läuft auf fest verdrahteter Hardware. Ein 4K-HDR-Stream fügt Tone Mapping hinzu. Dabei handelt es sich um einen CUDA-Filter, der auf den Shader-Kernen ausgeführt wird. Außerdem muss ein deutlich größeres Bild skaliert werden. Ein nvidia-smi dmon -s u mit niedrigen Werten für enc und dec neben einem hohen sm-Wert bestätigt dies. Dieses Muster bedeutet, dass die fest verdrahteten Blöcke nicht ausgelastet sind und die universell einsetzbaren Kerne den begrenzenden Faktor darstellen.