闲言碎语 · 2023年5月17日 0

群晖中docker搭建的jellyfin如何正确设置硬解码

如果要使用VA-API,那么最低至少应该是J1900的CPU,而如果要使用QSV则至少要N3710的CPU(DS916+)。如果低于这个,那么本文没啥用,不用看了。我是DS918+,算是最低端的可硬解的J3455的CPU

首先,ssh进入群晖,提升至root权限,然后执行命令:

ll /dev/dri

这里可以看到核显相关信息,然后需要获取renderD128这个设备的用户组,也就是videodriver的GID,常规情况下,也就是普通Linux下应该使用如下命令:

getent group render | cut -d: -f3

但是群晖是没有这个命令的,所以需要变通一下,使用下面的命令:

synogroup --get videodriver

可以看到我这里的GID是937,记住这个,后面要用。

接下来我们写一个docker compose文件

version: "3"

networks:
  work-net:
    external:
      name: work-net

services:
  jellyfin:
    image: nyanmisaka/jellyfin:latest
    container_name: jellyfin
    hostname: jellyfin-syno
    user: 100:100 #一般群晖普通用户就是这样写
    environment:
      - TZ=Asia/Shanghai
    group_add:
      - "937" #这里需要填写上面查到的用户组GID
    networks:
      - work-net
      
    volumes:
      - /volume1/docker/jellyfin/config:/config
      - /volume1/video:/media

    ports:
      - 7359:7359/udp

    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128

    restart: unless-stopped
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
      - "traefik.enable=true"
      - "traefik.http.routers.app-jellyfin.rule=Host(`v.test.com`)"
      - "traefik.http.routers.app-jellyfin.tls=true"
      - "traefik.http.routers.app-jellyfin.tls.certresolver=cloudflare"
      - "traefik.http.routers.app-jellyfin.entrypoints=websecure"
      - "traefik.http.routers.app-jellyfin.service=srv-jellyfin"
      - "traefik.http.services.srv-jellyfin.loadbalancer.server.port=8096"

把这个放到Portainer里新建的Stack里部署即可。如果提示/volume1/docker/jellyfin/config不存在,则手动创建。网络部分因为我有一个自己使用的网络,需要配合traefik做转发,可根据具体情况修改成别的,或者直接删除networks相关。

配置Jellyfin以后,进行转码设置,设置内容如下

接下来我们做个测试,以阿凡达:水之道来做测试,片源信息如下

将其转码为1080p 10Mbps看看播放效果如何

还不错,48fps,而此时的群晖cpu负载在40%左右,GPU开始工作了

实际上最关键的就是需要给docker相关的权限才能调用核显。网上的很多文章是直接在群晖系统内操作docker并且赋予最高权限,作为一个程序猿,这个做法我表示不能接受。