HDR2SDR 全显卡过程中一些问题和解决

反馈主题:RTX 5090 在 Vulkan + libplacebo + NVENC 处理 Dolby Vision 增强层时编码速度骤降


  环境说明


  - pc01:Ubuntu 24.04、RTX 5070 Ti、NVIDIA 驱动 580.65.06、FFmpeg 自行编译(支持 --enable-libplacebo

  --enable-nvenc)、CUDA 12.6。HDR→SDR(Dolby Vision → SDR)流程稳定,转码速度 4~6×。

  - pc02:Ubuntu 24.04、RTX 5090。最初驱动 580.95.05,后回退到 580.65.06;FFmpeg 与 pc01 同源同配

  置(CUDA 12.6,libplacebo 一致),命令完全相同;输入视频是 Dolby Vision Profile 7(包含增强层 NAL

  type 63)。


  复现命令(示例)


  ffmpeg -v error -stats \

    -init_hw_device vulkan=vk:0 -hwaccel vulkan \

    -hwaccel_output_format vulkan -filter_hw_device vk \

    -fflags +genpts -i <DolbyVision_profile7.mp4> \

    -map 0:v:0 -r 24 \

    -c:v hevc_nvenc -gpu 0 -preset p5 -rc vbr \

    -vf

  libplacebo=tonemapping=mobius:colorspace=bt709:color_primaries=bt709:color_trc=bt709:format=nv12,hw

  download,format=nv12 \

    -b:v 12M -maxrate 20M -bufsize 40M \

    -pix_fmt yuv420p -an -f null -


  问题表现


  - 在 RTX 5090 环境下,上述命令编码到 ~1:38(帧号约 2350)时速度迅速从 5× 掉到 0.x×,speed 数值持续

  下降,最终几乎停止。

  - nvidia-smi 显示 GPU 利用率、Encoder 利用率同时降为 0%,显存占用维持 ~13 GB;即使强行中止,相关

  NVENC/NVDEC 进程仍残留。

  - ffmpeg 日志在掉速前后反复打印 [hevc @ …] Skipping NAL unit 63(Dolby Vision 增强层)及 libplacebo

  的 Masking blit_src 信息。

  - 同一命令在 RTX 5070 Ti 上可稳定完成,速度 4~6×,无掉速。若将 Dolby Vision 增强层预先剥离(转换成

  Profile 8 或 HDR10),RTX 5090 上也能正常运行。


  已尝试的排查


  1. 将 pc01 的 FFmpeg 可执行文件/libplacebo 拷到 pc02;问题仍在。

  2. 更新 CUDA 运行库(12.6)并重新编译 FFmpeg;无改善。

  3. 回退驱动版本(580.95.05 → 580.65.06);无改善。

  4. 同样环境下换回 RTX 5070 Ti,问题完全消失。


  结论及期望


  - RTX 5090 + Vulkan + libplacebo + Dolby Vision Profile 7 在 NVENC 转码时存在严重兼容性问题,推测是

  驱动或 Ada 架构 NVDEC/Vulkan 管线中的 Bug。

  - 希望 NVIDIA/FFmpeg/libplacebo 团队协助复现并定位,确认是否为 NVENC/NVDEC 驱动问题,并尽快修复。

  - 在修复前,只能通过更换 GPU 或剥离 Dolby Vision 增强层作为临时解决方案。

评论

Jeff_Cheng说…
> 现象回顾

- /usr/local/ffmpeg-tonemap/bin/ffmpeg 在 pc02(RTX 5090,driver 580.95.05)处理 12056120.4k_hdr_0_tmp.mp4 时,约 1 分 38 秒(帧号≈2353)速度骤降,speed 逐步逼近 0,最终停
滞;nvidia-smi 记录到此时 GPU/Encoder 利用率直接掉到 0%,显存仍占用 13 GB,说明编码管线卡死。
- 相同命令在 pc01(RTX 5070 Ti,driver 580.65.06)全程保持 4 ~ 5×。
- 将 pc01 的 ffmpeg-tonemap 可执行文件拷贝到 pc02 并用同样的 Dolby Vision 片段测试,可连续跑完 3 分钟样本,速度稳定 5×;说明 RTX 5090 本身和 NVENC 并无硬件故障,问题出在
pc02 当前的构建/依赖组合。
- 用 pc02 原生二进制在 pc01 上测试,同样 3 分钟样本也能跑完,没有掉速,证明是“特定构建 + RTX 5090” 才触发的卡死。

关键差异定位

1. CUDA 工具链来源不同
- pc01 构建:--extra-cflags=-I/usr/local/cuda-12.6/include,--extra-ldflags=-L/usr/local/cuda-12.6/lib64 …,运行时链接的是 /usr/local/cuda-12.6/lib64/libnppi*.so 等官
方 CUDA 12.6 库。
- pc02 构建:指向 /usr/lib/cuda/...,运行时实际落到系统包 cuda-libraries-12-4 提供的 /lib/x86_64-linux-gnu/libnppi*.so。
- CUDA 12.4 + RTX 5090(Ada 下一代 GPU)配合 Vulkan 硬解 + libplacebo Tonemapping 会在遇到 Dolby Vision Enhancement Layer(反复出现 Skipping NAL unit 63)时把 GPU 管线
拖死。
2. FFmpeg/Libs 版本
- pc02 二进制为 commit 7f7335ec43,pc01 为 535d4047d3;二者间 FFmpeg 改动仅涉及 MXF、LC3,与此流程无直接关系。
- 不同版本的 libplacebo 也会影响 shader 生成;但实测把 pc01 的 libplacebo 拷到 pc02 后,原构建仍会卡死,而换回 pc01 的 ffmpeg 二进制又恢复正常,佐证根因不在 libplacebo
版本。

结论 不会触发。

建议处理步骤

1. 在 pc02 安装与 pc01 一致的 CUDA 12.6 toolkit(或直接把 pc01 的 /usr/local/cuda-12.6 复制过去),重新编译 ffmpeg-tonemap,configure 建议使用:

--extra-cflags=-I/usr/local/cuda-12.6/include
--extra-ldflags='-L/usr/local/cuda-12.6/lib64 -Wl,-rpath,/usr/local/cuda-12.6/lib64'
编译完成后重新链接运行,确认速度稳定。
2. 在重编译前的应急方案:
- 直接用 pc01 的 ffmpeg-tonemap 可执行文件在 pc02 跑任务(已验证样本可行)。
- 或在转码前用 dovi_rpu/dovi_tool 把 Dolby Vision Enhancement Layer 去掉(转成 Profile 8/HDR10),再交给现有 ffmpeg,可避免触发卡死。
3. 继续保留 nvidia-smi 监控脚本(--query-gpu=timestamp,...),若仍出现 encoder=0%、GPU=0% 的状态,可快速判定是否再次遇到此类驱动问题。

附带信息

- 触发帧附近的 ffmpeg log 充满 Skipping NAL unit 63,说明正处理 DV 增强层。
- 卡死时 ffmpeg 没有报错,仅速度衰减;强制中止后 GPU 进程残留,需要 kill -9 才能释放。
- 使用 ffmpeg 6.x(系统自带)虽然不会卡死,但色调不正确,这是因为 6.x 根本不解析 DV 增强层,直接按 HDR10 路径处理。

综上,问题本质是 RTX 5090 + CUDA 12.4 库 + Vulkan/Libplacebo Tonemap + Dolby Vision 双层 的组合造成 NVENC 管线 CF;将 pc02 的 ffmpeg 构建切回 CUDA 12.6(与 pc01 一致)即可
规避。

此博客中的热门博文

uptime-kuma部署和批量添加

ffmpeg 下实现 h265 hevc编码的 hls 服务的过程一些收藏和介绍

在南京见到的农民工午饭情景