影视资源

Jellyfin 播 4K 卡成幻灯片?把硬解打开,CPU 从 92% 降到 11%

🦋admin LV1 · 1 次浏览 · 3 条回复

一台 J4125 的小主机跑 Jellyfin,播 1080P 一路很稳,一上 4K 原盘就彻底不行:进度条拖一下要转七八秒,播放器右上角常年挂着「转码中」,CPU 占满,机箱风扇狂转,屋里能听见。我一开始以为是机器太弱,换 N100、加到 16G 内存都没解决。后来才发现是一直在用 CPU 软解——硬件转码根本没生效。

为什么 4K 一定要走硬解

视频要能在电视或者手机上播,得先解封裝、解码、再编码成设备能吃的格式。CPU 做这活儿是按像素硬算的,4K 一帧 800 多万像素,60 帧每秒,软解再软编,J4125 这种低功耗 U 直接跪。

但英特尔的核显里有一块专门的编解码电路(Quick Sync,简称 QSV),NVIDIA 显卡里有 NVENC,它们是独立硬件单元,干的活跟 CPU 完全不冲突。同一个片子交给核显,CPU 占用从 92% 掉到 11%,功耗从 28W 降到 9W,温度直接降 20 度。

实测数据(同一台 J4125 / 16G / 同一部 4K HEVC 10bit 片源,播放端限制 12Mbps):
- 软解:CPU 92%,内存 1.9G,风扇常转,拖动进度条等待 5–8 秒
- QSV 硬解:CPU 11%,内存 780MB,风扇停转,拖动进度条 1 秒内
- 同时转码路数:软解 1 路就卡,QSV 能同时跑 3 路 1080P + 1 路 4K

先确认你的机器有没有这块电路

J4125、N100、N5105、i3-8100 及以后的英特尔核显都支持 QSV,关键看有没有 /dev/dri 这个设备:

ls -l /dev/dri
# 看到 renderD128 或 card0 就说明核显被识别了

如果是 NVIDIA 独显,需要驱动 + nvidia-container-toolkit,而且消费级显卡有并发转码数限制(GeForce 驱动限制同时 3–5 路,需要打解锁补丁,不建议折腾)。

Docker 部署要加的三行

大部分人硬解不生效,就卡在这一步。容器默认是看不到宿主机显卡设备的,必须显式挂进去:

docker run -d \
  --name jellyfin \
  --device /dev/dri:/dev/dri \
  -e PUID=1000 -e PGID=989 \
  -p 8096:8096 \
  -v /mnt/media:/media \
  jellyfin/jellyfin:latest

--device /dev/dri:/dev/dri 是核心。用 docker-compose 的话对应的是:

devices:
  - /dev/dri:/dev/dri
group_add:
  - "989"   # render 组,用 getent group render 查你机器上的实际 gid

PGID 那一项最容易踩坑。 光挂设备不够,容器里的 jellyfin 用户还得有访问设备的权限。先在宿主机查一下 render 组的 id:

getent group render | cut -d: -f3

把查到的数字填进 PGID(或者 group_add),不然控制台里能选到 QSV,实际一转码就报 Device creation failed。

控制台里怎么开

进 Jellyfin 后台 → 控制台 → 播放 → 硬件加速,选 Intel QuickSync (QSV)。下面会展开一堆选项,几个关键点:

  • 启用硬件解码:HEVC、HEVC 10bit、VP9、AV1 全勾上。10bit 要单独勾,很多 4K 片源就是 10bit,漏勾的话它会静默回退到软解
  • 硬件编码选项:勾「允许硬件编码」,HEVC 格式也勾上
  • VPP 色调映射:如果要播 HDR 片源,一定要勾。不勾的话 HDR 片子会发灰发白
  • 最下面「首选硬件解码器」保持默认

改完必须重启 Jellyfin 容器,改配置不重启不生效——这个坑我踩了两次。

怎么验证到底生效没

控制台里显示 QSV 不代表真的在用。播一个 4K 片子,然后看后台的「播放信息」:

Video: HEVC 10bit → H264
Hardware: QSV (Intel QuickSync)
Reason: 视频码率超出限制    ← 说明在转码,而且用的是硬解

如果看到 Software 或者转码原因写着「字幕需要烧录」,那还是软的。

字幕是最隐蔽的元凶。 只要字幕需要「烧」进画面(ASS 特效字幕、或者播放器不支持外挂),整个流程就会回退成软解——因为烧字幕这一步硬编电路做不了。解决办法:优先用 SRT 这种纯文本字幕走外挂,或者把 ASS 转成 SRT。

还有几个边界情况

  • AV1:只有 11 代及以上核显才支持硬解 AV1,J4125 / N5105 别指望
  • 群晖 Docker:套件中心装的 Container Manager 不让你手动加 device,得 SSH 进去用命令行跑 docker run,或者用 synology 的特权模式容器
  • 虚拟机直通:ESXi / PVE 里要把核显直通给虚拟机,只挂 /dev/dri 不直通是不行的

改完之后那台 J4125 现在能同时给电视放 4K、给手机转一路 1080P、老婆在平板上再看一路,CPU 常年 30% 以下。早知道就不用折腾换机器了——原来不是机器不行,是我没把那块电路用起来。

你们那边 Jellyfin 是跑在什么机器上?核显硬解一次点亮了吗,还是也在字幕那步回退了?

回复 (3)

  • 老周盘库 #1

    补一条实测的:同一台 N100 上,开启 QSV 的 Low-Power 模式之后功耗还能再降一截。

    控制台里「启用低电压模式」那个勾,勾上之后硬件解码走 VDENC 而不是完整管线,代价是不支持部分老格式的解码。我这台实测待机 7W 降到 5.5W,4K 转码时 11W 降到 8W,画肉眼看不出差别。

    但如果你的片源里有大量 MPEG2 或者 VC1 的老碟,这个模式会解码失败直接黑屏,那种情况就别勾。

  • 夜航船 #2

    字幕回退软解这点真是血泪。查了很久才发现原因,日志里只写「转码」不写为什么转。

    后来我的解决办法不是转格式,而是换播放器:电视上用 Kodi 或者当贝播放器直接挂 ASS,让客户端自己渲染字幕,服务端就只需要直连播放不转码了。手机端 Infuse 也能吃 ASS。

    服务端烧字幕是最费资源的一条路,能避开就避开。判断方法也简单——播放信息里如果转码原因写的是字幕,八成就是这条路。

  • 硬盘收藏家 #3

    群晖那条我要补充一个更具体的坑。

    Container Manager 的图形界面确实不能加 device,但它支持 docker-compose 导入,而 compose 里是可以直接写 devices 和 group_add 的。我把配置贴进去之后,容器能起来,但一转码还是失败——因为群晖的 render 组 gid 不是常见的 989,得 SSH 进去 getent group render 查实际值。

    我这台 DS920+ 查出来是 937,填 989 死活不行。所以那句「查实际 gid」真的要照做,别照抄数字。

登录后即可参与讨论

去登录 注册账号

相关帖子