跳转到内容

媒体服务器与核显转码 ​

媒体服务器(Jellyfin、Plex 等)最吃资源的环节不是播放,是转码——客户端网络带宽不够,或者设备不支持原始编码时,服务器要实时把视频转成另一种格式。用 CPU 软转码,一路 4K 转码就能吃满好几个核;用核显(Intel Quick Sync、AMD VCN)做硬件转码,同样的负载 CPU 占用可能只有个位数百分比。

这篇讲用哪种客户机形态跑媒体服务器,以及怎么把核显接给它用。具体软件用开源的 Jellyfin 举例,其他方案思路类似。

适合谁:容器还是虚拟机 ​

形态优点代价
LXC 容器(推荐)直接共享宿主机的核显(/dev/dri),资源占用小,配置简单只能用宿主机现有的核显,不能独占一张独立显卡
虚拟机 + GPU 直通可以直通一张独立显卡,转码能力更强(NVENC 等),也适合同时跑其他需要该显卡的服务这张显卡宿主机和其他客户机都不能用了;虚拟机不能快照/迁移

多数家庭场景核显的转码能力就够用(现代 Intel 核显能同时处理好几路 4K 转码),优先选容器方案。只有当你需要独立显卡的编码能力、或者要把显卡同时用于其他重负载(AI 推理等)时,才考虑虚拟机直通,见显卡直通。

核显不能同时给多个客户机独占使用

核显在容器方案里是共享的——同一块核显的 /dev/dri 设备节点可以映射给多个 LXC 容器同时使用(Linux 的 DRM 驱动支持多进程共享)。这和 PCI 直通不同,直通是排他的,一旦直通给某台虚拟机,宿主机和其他客户机都用不了。

资源规划 ​

项建议说明
形态非特权 LXC 容器,Debian/Ubuntu 模板默认就应该用非特权,见特权与非特权容器
vCPU2–4硬件转码本身不太吃 CPU,但字幕处理、封装格式转换、缩略图生成仍然用 CPU
内存2–4 GB视媒体库大小和是否开启重度的元数据/封面抓取而定
系统盘8–16 GB只放程序和配置,不放媒体文件
媒体存储单独的存储,通过 bind mount 挂进容器见下文

媒体文件不要放在容器的系统盘里

容器的根文件系统通常比较小,也不是为存放几百 GB 到几 TB 的媒体库设计的。把实际的电影/剧集目录放在宿主机的一块单独存储上(参见加一块新盘),再通过 bind mount 挂进容器,方便扩容、备份和以后换容器时不用搬数据。

创建容器 ​

按创建第一个容器的步骤建一个 Debian 或 Ubuntu 的非特权容器,装好之后按官方安装方式装 Jellyfin(apt 仓库或官方安装脚本,以 Jellyfin 官方文档 为准)。

挂载媒体目录:容器创建后到 资源 → 添加 → 挂载点,把宿主机上存放媒体的目录挂进容器(例如挂到 /mnt/media)。非特权容器下会遇到 UID 映射导致的权限问题,处理方式见特权与非特权容器里的挂载点权限一节。

把核显接给容器 ​

这是启用硬件转码的关键步骤:把宿主机的 /dev/dri(DRM/VAAPI 渲染节点)设备映射进非特权容器,并处理好宿主机和容器内的用户组权限。这部分配置细节(设备号、render 组的 GID 映射、PVE 9 起的 Web UI 设备透传方式)见 在容器里使用核显。

装好之后在 Jellyfin 的 控制台 → 回放 → 转码 里,把硬件加速类型改成对应你 CPU 厂商的选项(Intel 通常是 VAAPI 或 QSV,AMD 是 VAAPI),并按 Jellyfin 官方硬件加速文档勾选支持的编解码格式。

先确认核显在宿主机上能用

在容器里排查之前,先在宿主机 shell确认核显本身工作正常:

sh
ls /dev/dri/
vainfo

看到 renderD1xx 设备节点、vainfo 能列出支持的编码格式,说明宿主机这一侧没问题,再去处理容器的设备映射。宿主机上看不到,说明是驱动或 BIOS 里核显被关闭的问题,和容器无关。

检查结果 ​

  1. Jellyfin 网页界面能正常访问,媒体库扫描能看到 bind mount 进来的文件。
  2. 播放一个客户端不支持直接播放的格式(或者手动强制降低画质),触发转码。
  3. 播放的同时在宿主机 shell执行 intel_gpu_top(Intel)或对应厂商的工具,能看到视频引擎有负载,说明确实走了硬件转码而不是 CPU 软转码。
  4. 对比同一段素材软转码和硬转码时的 CPU 占用(htop),硬件转码应该明显更低。
  5. Jellyfin 播放日志或转码信息里能看到 VAAPI/QSV 之类的加速器标识,而不是 libx264 纯软件编码器。

常见问题 ​

转码时 CPU 还是很高,看不出核显在工作。 大概率是转码设置没有真正启用硬件加速,或者容器里进程用户没有权限访问 renderD* 设备。回到在容器里使用核显检查设备映射和用户组。

No VA display found 或权限被拒绝。 检查容器内 Jellyfin 运行用户是否已加入映射后对应的组,以及设备节点的属主/权限是否与映射的 GID 一致。

想同时用这块核显跑别的容器(比如另一个转码任务)。 可以,核显支持多进程共享,重复上面的设备映射步骤给另一个容器即可,注意观察总体负载,核显的编码引擎数量有限。

想用独立显卡(更强的编码能力)。 换成虚拟机 + PCI 直通的方案,见显卡直通,代价是这张显卡会被这台虚拟机独占。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。