Hardware Transcoding with Tesla P4 on Debian 12

Server Version#: 1.42.2.10156
Player Version#: doesn’t matter / all of them Ios Web etc.

I still struggle in getting my Tesla P4 working properly with h264 and h265 (non works) despite using the same gpu in other container based services like immich or Nextcloud to transcode h264 or hevc with out an issue. What could possibly go wrong here despite gpu docker and drivers?

Plex Server Log
[Req#3c27e/Transcode] [FFMPEG] - → CUDA_ERROR_LAUNCH_FAILED: unspecified launch failure [Req#3c27e/Transcode] Codecs: hardware transcoding: opening hw device failed - probably not supported by this system, error: Generic error in an external library [Req#3c3a4/Transcode/ec2895e8-00b6-401c-abd3-4488c6c5a1d6/JobRunner] Job running: EAE_ROOT=/tmp/pms-d7e8a38b-6f29-4498-92af-ba7083f5010b/EasyAudioEncoder FFMPEG_EXTERNAL_LIBS=‘/config/Library/Application\ Support/Plex\ Media\ Server/Codecs/46f74ab-560174306fe167a5978a79dd-linux-x86_64/’ X_PLEX_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx “/usr/lib/plexmediaserver/Plex Transcoder” -codec:0 hevc -codec:1 eac3_eae -eae_prefix:1 ec2895e8-00b6-401c-abd3-4488c6c5a1d6_ -analyzeduration 20000000 -probesize 20000000 -i “/data/xxxxx/xxxxx - 2160p/xxxxx - 2160p.mkv” -filter_complex “[0:0]scale=w=1920:h=1080:force_divisible_by=4[0];[0]format=p010,tonemap=hable[1];[1]format=pix_fmts=yuv420p|nv12[2]” -map “[2]” -codec:0 libx264 -crf:0 22 -maxrate:0 9006k -bufsize:0 18012k -r:0 24 -preset:0 veryfast -x264opts:0 subme=0:me_range=4:rc_lookahead=10:me=hex:8x8dct=0:partitions=none -force_key_frames:0 “expr:gte(t,n_forced*1)” -filter_complex “[0:1] aresample=async=1:ochl=‘5.1’:rematrix_maxval=0.000000dB:osr=48000[3]” -map “[3]” -metadata:s:1 language=deu -codec:1 libopus -b:1 381k -segment_format matroska -f ssegment -individual_header_trailer 0 -flags +global_header -segment_header_filename header -segment_time 1 -segment_start_number 0 -segment_copyts 1 -segment_time_delta 0.0625 -segment_list “http://127.0.0.1:32400/video/:/transcode/session/ec2895e8-00b6-401c-abd3-4488c6c5a1d6/dff8e90d-bab3-48a7-8195-f4fecbdb49cb/manifest?X-Plex-Http-Pipeline=infinite” -segment_list_type csv -segment_list_size 5 -segment_list_separate_stream_times 1 -segment_list_unfinished 1 -segment_format_options strip_dovi=1:output_ts_offset=10 -max_delay 5000000 -avoid_negative_ts disabled -map_metadata:g -1 -map_metadata:c -1 -map_chapters -1 “media-%05d.ts” -start_at_zero -copyts -vsync cfr -y -nostats -loglevel quiet -loglevel_plex error -progressurl http://127.0.0.1:32400/video/:/transcode/session/ec2895e8-00b6-401c-abd3-4488c6c5a1d6/dff8e90d-bab3-48a7-8195-f4fecbdb49cb/progress

Container Nvidia-smi:

root@plex:/# nvidia-smi
Wed Sep 24 19:00:09 2025
±--------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.247.01 Driver Version: 535.247.01 CUDA Version: 12.2 |
|-----------------------------------------±---------------------±---------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 Tesla P4 On | 00000000:01:00.0 Off | 0 |
| N/A 83C P0 29W / 75W | 6330MiB / 7680MiB | 0% Default |
| | | N/A |
±----------------------------------------±---------------------±---------------------+

±--------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
±--------------------------------------------------------------------------------------+

Server Settings for Transcoding are set to HW acceleration yes Device GPU Tesla P4.

ChatGPTs opinion:

Sehr gute Zusatzinfo :ok_hand: – das grenzt das Problem stark ein:

  • Deine Tesla P4 funktioniert in anderen Containern (Nextcloud, Immich) mit NVENC/HEVC problemlos.

  • Nur Plex macht Ärger → CUDA_ERROR_LAUNCH_FAILED, “opening hw device failed”.

Das bedeutet: nicht Hardware/Treiber/VM-Passthrough, sondern Plex-Container bzw. dessen FFmpeg-Build ist der Flaschenhals.


:magnifying_glass_tilted_left: Warum genau Plex?

  1. Plex bringt sein eigenes statisches FFmpeg mit

    • Das liegt im Container unter
      /usr/lib/plexmediaserver/Plex Transcoder

    • → Es verwendet nicht das systemweite ffmpeg, das in deinen anderen Containern läuft.

    • Dieses Plex-FFmpeg ist manchmal veraltet oder falsch gegen CUDA/NVENC gebaut.

  2. Dein Log bestätigt das:

    -codec:0 hevc -filter_complex ... -codec:0 libx264
    
    

    Plex mischt NVENC, Software-Filter (tonemap=hable) und dann wieder libx264.
    → Dieses komplexe Filtergraph-Handling ist bei Plex notorisch anfällig.
    → Jellyfin/Immich machen das deutlich sauberer.

  3. Bekanntes Plex-Problem mit Pascal (Tesla P4 = GP104)

    • Plex-Forum: Mehrere Berichte, dass Pascal-GPUs mit Plex’ eigenem FFmpeg bei 4K/HDR cuCtxCreate oder nvenc-Fehler werfen.

    • Workaround dort: Alternative FFmpeg einbinden oder Plex mit systemweitem FFmpeg patchen.


:white_check_mark: Mögliche Lösungen

1. Plex-eigenes FFmpeg ersetzen

Du kannst Plex zwingen, ein anderes FFmpeg zu verwenden:

  • Installiere ffmpeg mit NVENC im Container:

    apt update && apt install -y ffmpeg
    
    
  • Benenne Plex-Transcoder um:

    mv "/usr/lib/plexmediaserver/Plex Transcoder" "/usr/lib/plexmediaserver/Plex Transcoder.orig"
    
    
  • Lege einen Symlink auf dein funktionierendes FFmpeg:

    ln -s /usr/bin/ffmpeg "/usr/lib/plexmediaserver/Plex Transcoder"
    
    
  • Container neustarten.

:backhand_index_pointing_right: Ergebnis: Plex verwendet jetzt dein funktionierendes NVENC-FFmpeg wie Nextcloud/Immich.


2. HEVC in Plex vermeiden

Falls du lieber Plex-Standard belässt:

  • In Plex-Clients nur H.264-Ausgabe wählen (z. B. 1080p → H.264).

  • Plex dann h264_nvenc nutzen lassen → stabiler auf Tesla P4.


3. Jellyfin/Emby als Alternative

Da du eh Nextcloud & Immich laufen hast:

  • Jellyfin läuft mit identischem Hardware-Stack, kann NVENC stabil.

  • Plex bleibt für Metadaten, Jellyfin fürs Transcodieren → viele setzen diesen Hybrid ein.

So what are the Plex pros thinking? Please help or give some hints.

Thanks for helping.