群晖用Jellyfin实现GPU硬解实时转码

实时转码到底是干嘛用的

举个例子哈:大家在手机APP端看爱奇艺、优酷、QQ视频的时候。影片是可以选择清晰度的。一般有流畅、高清、蓝光等等选项。
当然按照清晰度(分辨率)的不同,相应消耗的流量也不一样。

一般来说;极速<流畅<高清<超清720P<1080P蓝光

其实这些视频播放软件,在服务器中针对同一个视频分别存放了不通分辨率的版本。根据客户端的需求选择播放。来满足不同人群对视频源的需求。

在我们的群晖中。自带的套件Video Station 就有离线转码的功能。

DS video 客户端可让您执行离线转码以将视频转换到不同分辨率的 .mp4 格式,这是在移动设备上最兼容的视频格式。 离线转码启动后,Video Station 将开始转码视频以便可离线使用。完成离线转码后,DS video 将自动下载或在线播放转码视频供您欣赏。当然也会在我们的群晖中生成一份转码成功的视频文件。

Jellyfin 的实时转码

Jellyfin 在客户端,或者网页端播放视频的时候,是支持选择码率的。比方说我们在手机客户端上选择群晖的某个视频进行播放的时候。默认为原始码率播放。若你的原始视频是1080P。则将会以1080P 60Mbps 进行播放。当然,如果你的网络足够流畅。家里的上传宽带足够大的话。原始码率能够带给你最高清晰度的体验。但如果,你是在外面播放家里群晖的视频的话。可能会受到两方面的限制:

  • 家里的上传宽带无法达到原始码率的需求
  • 原始码率播放非常消耗手机流量

这个时候,我们就需要Jellyfin 的实时转码功能啦。比方说我们可以选择 1080P 10Mbps 、或者选择720P 3Mbps来解决刚刚提到的两点问题。

Jellyfin 实时转码消耗CPU资源

如果我们没有在Jellyfin的后台开启硬解的功能.我们的群晖将会使用CPU 来进行软解进行实时转码。在转码的过程中,CPU将会以接近100%的工作模式来帮助我们进行转码。对于CPU来说如此繁重的“体力劳动”可能会带来发热严重,群晖其他功能受到性能影响等等问题。

另外,一般我们群晖系统CPU中的核心显卡是没有用武之地的。所以,本教程将教会大家。如何利用CPU 的核心显卡进行硬解实时转码。

Jellyfin核心显卡硬解实时转码的必要条件

  • 群晖的系统版本需要:DS916+ 或 DS918+ (DS3617xs 、 DS3615xs不支持)
  • CPU 有核心显卡。当然集成的核心显卡越厉害越好
  • 黑群晖、白群晖、全洗白群晖、半洗白群晖均可

[查看系统是否支持显卡硬解转码]

SSH链接成功后。输入 ls /dev/dri 之后若如下图显示,则说明支持显卡硬解。
输出 card0 renderD128

教程开始-搭建并运行Jellyfin容器

《群晖用Jellyfin搭建媒体服务器》这篇教程中,已经教大家如何在群晖中搭建Jellyfin媒体服务器啦。
今天的这篇教程中,我们将利用命令行的方式搭建。因为图形界面的搭建没法指定容器转载核心显卡的文件。

1. 在群晖的套件中心,安装Docker套件。

2. Docker安装成功后,我们的file station中即可看到多出来一个Docker文件夹。 我们在此文件夹内建里 jellyfin 文件夹。再进入jellyfin文件夹。分别建里 config文件夹及cache文件夹。
(分别为以后jellyfin的配置文件和缓存文件准备目录)

3. 群晖系统中打开SSH功能 (控制面板->终端机和SNMP->启动SSH功能->应用)

4. 利用我们的管理员账号、密码通过ssh客户端登陆群晖系统。 通过 sudo su – 命令切换为root用户

5. 运行以下命令:以管理员身份在Docker中下载jellyfin镜像

sudo docker pull jellyfin/jellyfin

6. 运行以下命令:根据指定参数运行Jellyfin容器

sudo docker run -d --name jellyfin \
-v /volume1/docker/jellyfin/config:/config \
-v /volume1/docker/jellyfin/cache:/cache \
-v /volume1/video:/video \
-p 8096:8096 \
-p 8920:8920 \
--device=/dev/dri/renderD128 \
--restart unless-stopped \
jellyfin/jellyfin

-v 参数表示装载文件夹。所以第2-4行请根据实际情况更改。

第2-3行指定卷1的两个文件夹分别作为配置文件和缓存文件地址
第4行指定卷1下video文件夹为Jellyfin的媒体文件夹

7. 测试容器是否已经成功挂载device 下的驱动文件

运行如下代码查看运行容器(Jellyfin)的ID:

docker ps

教程继续-配置Jellyfin设置

访问 http://你的内网ip:8096 即可初始化配置Jellyfin。配置媒体库等。

具体请参照 《群晖用Jellyfin搭建媒体服务器》这篇教程中的:【二、Jellyfin的设置】,这里不再赘述

Jellyfin 后台启用硬件转码功能 [ 硬件加速选择:Video Acceleration API (VA API)(experimental) ,并勾选“启用硬件解码” ]

至此,搭建和配置结束。我们的手机端电脑端,可以实现实时硬解转码啦!

测试实时转码CPU占用率

首先,我们测试一部1080P 电影。影片参数如下图:

开启硬件加速:

后台按照我们刚刚的设置。然后播放该视频,并选择转码为 1080P 10Mbps

打开群晖分别查看 Docker容器,以及系统的CPU占用。

同时,我们链接群晖的SSH 通过 top 命令查看解码过程是否调用了显卡驱动:

关闭后台硬件加速功能。(硬件加速选择“没有”)

可以明显看出,关闭硬件加速后。转码会非常消耗CPU资源。

 


补充说明:

1、如果你的Jellyfin版本升级到10.4.3或者以下的版本,按照上面的设置硬解后保存出错的,需要多做两个步骤:

(1)给容器提权:在Docker容器中找到Jellyfin的容器,先关掉,点编辑容器的常规设置,勾选“使用高权限执行容器”;

 

(2)添加环境:在环境中添加两项,分别是 PUID(值填写为 0)和PGID(值填写为0);

2、如果你的Jellyfin版本升级到10.4.3以后,发现设置硬解后保存出错的或者硬解/转码无效的(就是设置了硬解,但是CPU依然暴红),可以回滚到10.4.3版本;或者多做以下两个步骤:

(1)用root登录ssh输入 docker ps 查看 ID(即本博文安装步骤第7步查看的ID);
(2)下面输入命令:

sudo docker exec --user root -it 容器的ID sh -c 'echo "deb http://http.us.debian.org/debian stable main contrib non-free" | tee -a /etc/apt/sources.list && apt-get update && apt-get install -y i965-va-driver-shaders && vainfo'

 

然后静静等待安装完成就OK了。

点赞
  1. yichujifa说道:
    Google Chrome Windows 10
    大佬你好,我的NAS 处理器是 D1581 ,没有集成显卡,独显是 Radeon HD 8470。 我在ESXI 将独显直通给群晖,打算在 jellyfin 开启转码。 群晖ssh 运行 “ls /dev/dri”提示 “ls: cannot access '/dev/dri': No such file or directory ” ,还需要额外的操作吗 ? https://s21.ax1x.com/2024/05/12/pke7kw9.png https://s21.ax1x.com/2024/05/12/pke7FeJ.png
    1. 博主说道:
      Google Chrome Windows 10
      首先ls /dev/dri是看核显不是看独显的命令,你这个CPU没有核显,所以敲命令肯定是没有东西的。其次群晖暂时只支持A卡独显硬解,所以你这个独显也是不能硬解的。还有,DS3622不支持硬解,如果你用开独显硬解,请使用A卡独显装DS920或SA6400的群晖系统,再装好独显驱动就可以。
  2. 不走寻常路爱你说道:
    Google Chrome Windows 10
    ERR] [16] Jellyfin.Api.Helpers.TranscodingJobHelper: FFmpeg exited with code 139 [07:52:11] [INF] [16] Jellyfin.Api.Controllers.DynamicHlsController: Current HLS implementation doesn't support non-keyframe brea ks but one is requested, ignoring that request [07:52:11] [INF] [16] Jellyfin.Api.Helpers.TranscodingJobHelper: /usr/lib/jellyfin-ffmpeg/ffmpeg -analyzeduration 200M -init_hw_d evice vaapi=va:/dev/dri/renderD128 -filter_hw_device va -hwaccel vaapi -hwaccel_output_format vaapi -autorotate 0 -canvas_size 19 20x1080 -i file:"/movie/dianying/X战:第一战.2011 UHD BluRay REMUX 2160p HEVC DTS-HD MA5.1 2Audio-CHD.mkv" -autoscale 0 -map_meta data -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -codec:v:0 h264_vaapi -rc_mode VBR -b:v 59360000 -maxrate 59360000 -bufsize 118720000 -profile:v:0 high -force_key_frames:0 "expr:gte(t,0+n_forced*3)" -filter_complex "[0:3]scale=s=3840x2160:flags=fast_bi linear[sub];[0:0]setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,scale_vaapi=format=nv12,hwdownload,format=nv12[ main];[main][sub]overlay=eof_action=pass:shortest=1:repeatlast=0,hwupload_vaapi" -start_at_zero -codec:a:0 libfdk_aac -ac 6 -ab 6 40000 -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpe gts -start_number 0 -hls_segment_filename "/config/transcodes/4184d6e3dde1e5e55e5673ff4ae5a2d0%d.ts" -hls_playlist_type vod -hls_ list_size 0 -y "/config/transcodes/4184d6e3dde1e5e55e5673ff4ae5a2d0.m3u8"
  3. 不走寻常路爱你说道:
    Google Chrome Windows 10
    整整搞了两天: 我的机器是PVE 黑裙7.0 CPU是牙膏厂7500 top 之后显示这个,我也不知道成功了没有,264可以,265是一直不行,不知道啥原因。大佬,我这个算成功了么? /usr/lib/jellyfin-ffmpeg/ffmpeg -analyzeduration 200M -init_hw_device vaapi=va:/dev/dri/renderD128 -filter_hw_device va -hwaccel vaapi -hwaccel_output_format vaapi -autorotate 0 -canva+
  4. cocoa说道:
    Google Chrome Mac OS X 10.15.7
    大神,您好! :good: 能不能给我一个核显ID 3185的驱动,我现在用的J4125 CPU。 感觉核显驱动有问题,我现在用的DSM_DS918+_42962版本。
    1. cocoa说道:
      Google Chrome Mac OS X 10.15.7
      HW control enabled的后面是yes,但不知道为啥还是不支持硬解 :lei: :lei: 是需要打显卡补丁么?
  5. maxd说道:
    Google Chrome Windows 10
    我也是同样的问题,用的是最新版jellyfin,群晖内直通ls /dev/dri回显正常,docker内回显也正常,jellyfin设置也可以打开硬解,但是实际播放就会报错 “该客户端与媒体不兼容,服务器未发送兼容的媒体格式。” 然后打i965-va-driver-shaders,报: Preparing to unpack .../i965-va-driver-shaders_2.3.0-1_amd64.deb ... Unpacking i965-va-driver-shaders:amd64 (2.3.0-1) ... Setting up i965-va-driver-shaders:amd64 (2.3.0-1) ... sh: 1: vainfo: not found 请问如何解决
    1. 博主说道:
      Google Chrome Windows 10
      用APP来播放。因为有些视频编码,浏览器不支持网页播放。
      1. maxd说道:
        Google Chrome Windows 10
        谢谢,但是app也没用,我几乎所有jelly版本试了个遍,看log里面 libva: /usr/lib/jellyfin-ffmpeg/lib/dri/i965_drv_video.so init failed 这个始终解决不了 浪费太多时间,直接换套件了,用着也还行
        1. 博主说道:
          Google Chrome Windows 10
          你试一下把视频类别从改为“混合内容”,看看能不能正常播放。
      2. maxd说道:
        Google Chrome Windows 10
        改成混合内容还是不行。。。我放弃了,直接用套件版就好
        1. 不走寻常路爱你说道:
          Google Chrome Windows 10
          混合内容在哪?
  6. cm86说道:
    WebView Android 10
    我自己是直接在套件里面安装了,不过搞不懂咋回事,内网无线看个1080p都不爽,加载半天,拖动也卡一会,核显驱动有,bios 睿频啥的也关了…烦人3455真不行
    1. 博主说道:
      Google Chrome Windows 10
      可以用第三方解码,比如KODI
  7. cm86说道:
    WebView Android 10
    为啥要在docker里面安装呢?
    1. 博主说道:
      Google Chrome Windows 10
      以前只有用Docker安装,套件没出呢。

发表回复