N5105 jellyfin 硬解问题探究

之前一直用i38100做NAS的宿主机,承载了docker版本jellyfin的运行。最近家里加了一台N5105的软路由,想把原来运行在i3上的docker服务移到这台小主机上。在jellyfin硬解的问题上搞了很久。写这篇文章,给各位查找相似问题提供一些思路。

首先是我的运行环境:ubuntu 22.04 server 最小化安装,内核版本是5.15.0

在网上搜索一圈后,发现解决这个问题的几个点:

1,加载正确的驱动,正确的内核,正确的配置

2,保证显卡在docker中的权限正确

3,设置正确的解码格式

基本思路就是这样,但我们需要加载什么样的驱动呢,哪个内核版本,docker中显卡权限又是怎么传递的......

不装了,摊牌了:) 其实这些问题在jellyfin的官方文档中都有介绍,下面依次对这几个问题进行总结。

创建docker

1,gpu在docker中的的权限

官方的docker是通过--group-add这个参数来传递显卡的group权限的。
image.png

在我的机器上,host中的root用户和render组可以对renderD128这个设备进行读写,其他任则没有权限。所以按照要求,我们需要把render所在的组id告诉给docker,获取render组的id如下:

getent group render | cut -d: -f3

2,GPU直通

GPU设备通常是在/dev/dri/这个路径下,可以传递单个设备,也可以将用--device将/dev/dri整个目录映射给docker。

docker run -d \
--name=jellyfin \
--volume /path/to/config:/config \
--volume /path/to/cache:/cache \
--volume /path/to/media:/media \
--user 1000:1000 \ --group-add="122" \
--net=host \
--restart=unless-stopped \
--device /dev/dri/renderD128:/dev/dri/renderD128 \
jellyfin/jellyfin

内核版本

1,Low-Power Encoding

ubuntu22.04默认使用5.15内核,这个版本其实是不支持11代cpu开启Low Power的,而jellyfin想要正常工作,又依赖这个Low Power的解码模式,原话如下:
image.png

所以,检查一下内核版本吧。

在ubuntu上,我们可以在这里下载不同版本的deb文件。请下载linux-image.deb 和linux-modules.deb这两个文件,然后使用dpkg --install *.deb来安装。

同时,还需要加载GuC和HuC两个固件:

sudo sh -c "echo 'options i915 enable_guc=2' >> /etc/modprobe.d/i915.conf" 
sudo update-initramfs -u && sudo update-grub

重启系统,检查一下GuC和HuC是否正常加载了

sudo dmesg | grep i915
[ 3.060008] i915 0000:00:02.0: [drm] GuC firmware i915/ehl_guc_70.1.1.bin version 70.1.1 
[ 3.060016] i915 0000:00:02.0: [drm] HuC firmware i915/ehl_huc_9.0.0.bin version 9.0.0

驱动

根据文档中的指示,docker中已经包含了intel media 和opencl的驱动了。

The official Docker image comes with all necessary user mode Intel media drivers and the OpenCL runtime.

可以使用下面两个命令来查看docker是否工作正常:

docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -v verbose -init_hw_device vaapi=va -init_hw_device opencl@va

通过这些设置,基本可以确保docker和host的配置没有问题了。

jellyfin中的设置

硬件加速

对于intel cpu,有两种方式可选,分别是VA-API 和QSV。简而言之,VA-API面向兼容性,QSV具有更好的性能。两种模式可共存,不过QSV对于CPU有限制,具体在这里

启用硬件解码

这个选项中,不同的CPU支持的解码能力不一,我们需要根据CPU支持的解码格式来勾选解码器。

下面展示的是11代和12代CPU的硬解码能力,可以看见,设置中给出的VP8和 AV1是11代N5105所不支持的,所以在配置这里时不应该把这两个选项勾上。
image.png

硬件编码选项

对于11代CPU(划重点),这里的Low-Power Encoding设置是必须的勾选的。前面提到过,jellyfin的VBR和CBR组件运行必须依赖Low-Power Encoding。

调试方法

找一个CPU支持的编码视频,比如说H264,用网页打开后进行播放,并调低画质。
image.png

使用intel-gpu-top这个工具查看GPU是否在进行解码。
image.png