VSR Player:基于 NVIDIA Video Effects SDK 的 Linux 实时超分视频播放器

一个直接调用 NVIDIA Video Effects SDK 的 Linux 桌面播放器,让 RTX 显卡的 AI 超分能力在 Linux 上可用。

项目地址:github.com/zhangmq/vsr-player

:warning: 声明:本文及项目文档均由 AI 生成。文中可能包含过度热情的表达,不代表作者本人的精神状态。


背景

NVIDIA RTX Video Super Resolution(RTX VSR)在 Windows 上已经可用了一段时间——通过驱动集成,浏览器(Edge、Chrome)和主流播放器(mpv、VLC)都能直接调用。但在 Linux 上,这个驱动级接口并未开放,目前没有任何播放器能在 Linux 上使用 RTX VSR。

NVIDIA Video Effects SDK 提供了相同的底层 AI 模型,也有 Linux 版本。但它不是一个拿来就能用的依赖——目前还是 Early Access 状态,附带约 1 GB 的推理运行时(TensorRT、cuDNN、NPP 等),也没有现成的播放器集成路径。

这个项目直接调用了 Video Effects SDK 的 C API,将其接入一个独立的播放器中。简单来说:驱动不做的,自己在用户态做。这显然不是最合理的路线——这类处理逻辑理应放在驱动或合成器层面——只是在驱动级 VSR 尚未支持 Linux 的情况下的一个变通方案。

特性

  • AI 超分辨率 — 通过 Tensor Cores 实时超分 2×/3×/4×
  • AI 降噪 — 可配置降噪强度(低至超高),在原始分辨率下单独生效
  • NVDEC 硬解码 — AV1、H.264、HEVC GPU 解码,帧数据零拷贝
  • Vulkan 渲染 — CUDA-Vulkan 互操作,帧数据全程不离开 GPU 显存
  • QML 叠加 UI — 半透明控件,自动隐藏、播放列表、OSD 信息面板
  • 音视频同步 — 音频主时钟,基于真实 PTS 的同步策略
  • 自适应缩放 — 根据视频分辨率和窗口大小自动选择超分倍率
  • 零系统依赖 — 所有 VFX 库(约 1.1 GB)随应用打包,仅需 libcuda.so.1

效果展示

播放器界面

VSR 4× 超分对比

原始画面(720p)

VSR 4× 超分

技术实现

整体架构

Qt Client (主线程)                        libvsrplayer (工作线程)
┌──────────────────────────┐          ┌─────────────────────────────────┐
│ QML Overlay              │          │ PlayerCore — 命令队列 +         │
│ ├─ TopBar                │  命令/   │              播放状态机          │
│ ├─ BottomBar             │  事件    │ ├─ Demuxer (libavformat)        │
│ ├─ VolumePopup           │◄────────►│ ├─ Decoder (NVDEC hwaccel)      │
│ ├─ QualityPopup          │  桥接    │ ├─ VSRProcessor (NvVFX)         │
│ ├─ SpeedPopup            │          │ ├─ Renderer (Vulkan)            │
│ ├─ PlaylistPanel         │          │ ├─ AudioOutput (PortAudio)      │
│ ├─ ProgressSlider        │          │ ├─ ClockManager (A/V 同步)      │
│ ├─ CenterPlayBtn         │          │ └─ NV12ToRGB (CUDA kernel)      │
│ └─ OsdOverlay            │          │                                 │
└──────────────────────────┘          └─────────────────────────────────┘

数据流(全 GPU,零 PCIe 拷贝)

Container → Demux → NVDEC → NV12(GPU) → NV12→RGB(GPU) → VSR → RGBA(GPU)
                                                              → CUDA-Vulkan 互操作
                                                              → Vulkan 渲染通道
                                                              → 屏幕

帧数据从解码到渲染全程留在 GPU 显存中,不经过 PCIe 总线。CUDA-Vulkan 互操作通过 VK_KHR_external_memory_cuda 扩展实现,免去了 GPU→CPU→GPU 的内存往返。

技术栈

技术
解码 FFmpeg + NVDEC (av1_nvdec / h264_nvdec / hevc_nvdec)
AI 超分 NVIDIA Video Effects SDK (libnvVFXVideoSuperRes)
推理引擎 TensorRT + cuDNN + NPP(随 SDK 打包,约 1.1 GB)
GPU 计算 CUDA (NVRTC 运行时编译 NV12→RGB kernel)
渲染 Vulkan + CUDA-Vulkan 互操作
音频 FFmpeg 解码 → PortAudio 输出
UI Qt 6.11 Quick / QuickControls

快速开始

从 Release 安装

GitHub Releases 下载最新的 vsr-player-<ver>-linux-x86_64.tar.gz

tar xzf vsr-player-*.tar.gz
cd vsr-player-*
./install.sh
export PATH="$PATH:$HOME/vsr-player/bin"
vsr-player /path/to/video.mp4

安装脚本会自动检测系统依赖、通过 pip install nvidia-vfx 安装 NvVFX 运行时,并部署到 ~/vsr-player/。无需 root 权限。

从源码构建

git clone https://github.com/zhangmq/vsr-player.git
cd vsr-player
# 准备第三方依赖(详见 docs/BUILD.md)
make -j$(nproc)
./build/vsr-player /path/to/video.mp4

关于开发过程

我对 C++ 和 CUDA 开发没什么概念,这个项目基本上是 AI 开发的——包括代码、QML UI、构建系统、文档,甚至这篇文章。我唯一的工作就是在 AI 产生幻觉时 PUA 他。

再次声明:本文及项目文档均由 AI 生成,文中可能包含夸张修辞,不代表作者本人的精神状态。

仓库与许可


如果你也有 RTX 显卡且跑 Linux,欢迎试试看。遇到问题提 Issue。