NVENC补丁.zip

补丁概述

本补丁用于修复 Garmin VIRB Edit(已停止更新的老软件)在 NVIDIA RTX 30 系显卡 + 新驱动(R550 及以上)上无法使用 NVENC 硬件加速编码的问题。

修复方式:通过两个 DLL 文件,让 VIRB Edit 重新使用 NVIDIA GPU 硬件加速编码(NVENC),代替默认的 CPU 软件编码(libx264)。

问题背景

VIRB Edit(2018 年停止更新)内置的 FFmpeg 3.3 使用的是 NVIDIA NVENC 旧版 preset 体系(HP/HQ/BD/LOW_LATENCY 等命名式 GUID)。

NVIDIA 从驱动 R550(2024 年初)起,彻底移除了对这些旧 preset 的支持。导致:

  • VIRB Edit 的 NVENC 初始化失败(错误:NV_ENC_ERR_UNSUPPORTED_PARAM
  • 导出视频时只能走 CPU 软件编码,GPU 硬件加速失效
  • 表现为:导出时 CPU 满载、GPU 空闲、导出速度极慢

同时,VIRB Edit 的编码器选择逻辑(dispatcher)默认把"低/中/高"质量都路由到 CPU 编码器 libx264,即使 NVENC 可用也不会调用它。

本补丁同时解决这两个问题。

补丁文件说明

文件 1:video.pipeline.ffmpeg.nvenc-fixed.dll

用途:强制 VIRB Edit 使用 NVENC 硬件编码器。

原理:VIRB Edit 的编码器选择逻辑(在 video.pipeline.ffmpeg.dll 中)默认把"低/中/高"质量都映射到 CPU 编码器 libx264,NVENC 路径永远不会被执行。本补丁修改了这个选择逻辑的一处跳转指令(jbeNOP),让所有质量设置都走 NVENC 路径。

安装方式:替换 VIRB Edit 目录下的 video.pipeline.ffmpeg.dll

原始文件校验

  • 原版 MD5:6aff49fba43dcc6feff4acea9440268a
  • 补丁版 MD5:4ecb7012618911a2fff4d22d620030ce

文件 2:nvEncodeAPI64.dll

用途:翻译旧版 NVENC API 调用,适配新驱动。

原理:这是一个"兼容 shim"(基于开源项目 nvenc_shim),通过 DLL 劫持拦截 NVENC API 调用,自动完成:

  • 将旧版 preset GUID 翻译成新版 P1-P7 preset + tuningInfo
  • 将被移除的旧速率控制模式(CBR_HQ/VBR_HQ/CBR_LOWDELAY_HQ)转换成现代等价模式
  • 自动修正结构体版本号,匹配当前驱动版本
  • 清零跨 SDK 版本含义变化的保留字段

安装方式:复制到 VIRB Edit 目录(不要替换任何文件,直接新增)。Windows 会优先加载程序目录下的同名 DLL,而不是 System32 中的真实驱动 DLL。

注意:此文件不是 NVIDIA 驱动文件,是第三方兼容层。删除它即可回滚,不影响系统驱动。

安装步骤

前提:已安装 NVIDIA 显卡驱动,且显卡为 RTX 30 系或更新(或驱动版本 R550 及以上)。
  1. 关闭 VIRB Edit
  2. 备份原文件(重要):

    • C:\Program Files\Garmin\VIRB Edit\video.pipeline.ffmpeg.dll
    • 重命名为 video.pipeline.ffmpeg.dll.bak
  3. 替换文件 1

    • video.pipeline.ffmpeg.nvenc-fixed.dll
    • 复制到 C:\Program Files\Garmin\VIRB Edit\
    • 并重命名为 video.pipeline.ffmpeg.dll
  4. 添加文件 2

    • nvEncodeAPI64.dll
    • 复制到 C:\Program Files\Garmin\VIRB Edit\(保持原名)
  5. 启动 VIRB Edit,导出视频

安装完成后,VIRB Edit 目录应包含:

C:\Program Files\Garmin\VIRB Edit\
├── video.pipeline.ffmpeg.dll        ← 补丁版(原版备份为 .bak)
├── video.pipeline.ffmpeg.dll.bak    ← 原版备份
├── nvEncodeAPI64.dll                ← shim(新增)
└── avcodec-57.dll                   ← 保持原版,不要动

验证方法

导出视频时,打开任务管理器 → 性能 → GPU,查看 Video Encode 引擎是否有占用:

  • 有占用 → 补丁生效,NVENC 硬件加速工作正常
  • 无占用且 CPU 满载 → 补丁未生效,需要排查

回滚方法

如需恢复原状:

  1. 删除 C:\Program Files\Garmin\VIRB Edit\nvEncodeAPI64.dll
  2. 删除补丁版的 video.pipeline.ffmpeg.dll
  3. video.pipeline.ffmpeg.dll.bak 重命名回 video.pipeline.ffmpeg.dll

注意事项

  1. 两个文件必须同时安装,缺一不可:

    • 只装文件 1(没有 shim):NVENC 被调用但旧 preset 被新驱动拒绝,导出失败或回落 CPU
    • 只装文件 2(没有 dispatcher 补丁):VIRB Edit 默认走 CPU 编码,shim 不被调用
  2. 仅适用于 NVIDIA 显卡。Intel 核显(如 i5-13500H 的 Iris Xe)走的是 QSV 硬件编码,与本补丁无关。
  3. 不要动 avcodec-57.dll。如果之前替换过它,请恢复原版(原版 MD5:2295be69d0fb4a44bc6b2cc513ef8d62),否则可能与补丁冲突。
  4. 不要降级驱动。本补丁就是为了解决"不降级驱动"场景下的 NVENC 兼容问题。
  5. 如果 NVIDIA 驱动更新到更新版本导致补丁失效,可尝试更新 nvenc_shim(访问 GitHub 项目获取新版)。

文件清单

文件用途安装位置
video.pipeline.ffmpeg.nvenc-fixed.dll强制使用 NVENC替换为 video.pipeline.ffmpeg.dll
nvEncodeAPI64.dll翻译旧 preset 适配新驱动直接复制(新增)

技术备注(供后续维护)

  • 问题根因:NVIDIA 驱动 R550+ 移除了旧版 NVENC preset(HP/HQ/BD/LOW_LATENCY 命名式 GUID)的支持
  • dispatcher 关键位置:video.pipeline.ffmpeg.dll 偏移 0x239b776 21(jbe)改为 90 90(NOP)
  • shim 来源:https://github.com/luizhtss/nvenc_shim
  • shim 导出的入口函数:NvEncodeAPICreateInstanceNvEncodeAPIGetMaxSupportedVersion

标签: none