Debian上直接安装Jellyfin,成功开启QSV硬解
某次apt upgrade 后,Jellyfin在网页播放视频时报错,提示“视频与客户端不兼容”之类的字样。关闭硬件解码就可以播放,但是不论打开QSV硬解还是VAAPI硬解都报错。

问题描述

jellyfin.log(片段)

1
2
3
4
5
6
[2022-03-10 06:54:50.378 -05:00] [INF] Current HLS implementation doesn't support non-keyframe breaks but one is requested, ignoring that request
[2022-03-10 06:54:50.379 -05:00] [INF] /usr/lib/jellyfin-ffmpeg/ffmpeg -c:v h264_qsv -hwaccel qsv -i file:"/home/wei/downloads/porn/VID_20220128_081427_101.mp4" -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_qsv -preset 7 -look_ahead 0 -b:v 4497036 -maxrate 4497036 -bufsize 8994072 -profile:v:0 high -level 41 -g:v:0 45 -keyint_min:v:0 45 -sc_threshold:v:0 0 -vf "vpp_qsv=format=nv12" -start_at_zero -vsync -1 -codec:a:0 aac -ac 2 -ab 128000 -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpegts -start_number 0 -hls_segment_filename "/var/lib/jellyfin/transcodes/904f296c004933ba148e126a69df77e7%d.ts" -hls_playlist_type vod -hls_list_size 0 -y "/var/lib/jellyfin/transcodes/904f296c004933ba148e126a69df77e7.m3u8"
[2022-03-10 06:54:50.401 -05:00] [ERR] FFmpeg exited with code 1
[2022-03-10 06:54:50.486 -05:00] [WRN] cannot serve "/var/lib/jellyfin/transcodes/904f296c004933ba148e126a69df77e70.ts" as transcoding quit before we got there
[2022-03-10 06:54:50.489 -05:00] [ERR] Error processing request: "Could not find file '/var/lib/jellyfin/transcodes/904f296c004933ba148e126a69df77e70.ts'". URL "GET" "/videos/7a24af2c-9df3-66d4-aac8-9d671e3a6507/hls1/main/0.ts".

FFMPEG.Transcode.log(片段)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/usr/lib/jellyfin-ffmpeg/ffmpeg -c:v h264_qsv -hwaccel qsv -i file:"/home/wei/downloads/porn/VID_20220128_081427_101.mp4" -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_qsv -preset 7 -look_ahead 0 -b:v 4497036 -maxrate 4497036 -bufsize 8994072 -profile:v:0 high -level 41 -g:v:0 45 -keyint_min:v:0 45 -sc_threshold:v:0 0 -vf "vpp_qsv=format=nv12" -start_at_zero -vsync -1 -codec:a:0 aac -ac 2 -ab 128000 -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpegts -start_number 0 -hls_segment_filename "/var/lib/jellyfin/transcodes/904f296c004933ba148e126a69df77e7%d.ts" -hls_playlist_type vod -hls_list_size 0 -y "/var/lib/jellyfin/transcodes/904f296c004933ba148e126a69df77e7.m3u8"

ffmpeg version 4.4.1-Jellyfin Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10 (Debian 10.2.1-6)
configuration: --prefix=/usr/lib/jellyfin-ffmpeg --target-os=linux --extra-version=Jellyfin --disable-doc --disable-ffplay --disable-shared --disable-libxcb --disable-sdl2 --disable-xlib --enable-lto --enable-gpl --enable-version3 --enable-static --enable-gmp --enable-gnutls --enable-libdrm --enable-libass --enable-libfreetype --enable-libfribidi --enable-libfontconfig --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libdav1d --enable-libwebp --enable-libvpx --enable-libx264 --enable-libx265 --enable-libzvbi --enable-libzimg --arch=amd64 --enable-opencl --enable-vaapi --enable-amf --enable-libmfx --enable-vdpau --enable-ffnvcodec --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvdec --enable-nvenc
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
WARNING: defaulting hwaccel_output_format to qsv for compatibility with old commandlines. This behaviour is DEPRECATED and will be removed in the future. Please explicitly set "-hwaccel_output_format qsv".
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'file:/home/wei/downloads/porn/VID_20220128_081427_101.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 01:23:00.66, start: 0.000000, bitrate: 1031 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 960x540, 899 kb/s, SAR 1:1 DAR 16:9, 14.99 fps, 15 tbr, 15360 tbn, 30720 tbc (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1(und): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Device creation failed: -542398533.
[h264_qsv @ 0x5608e2e5de40] No device available for decoder: device type qsv needed for codec h264_qsv.
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_qsv) -> h264 (h264_qsv))
Stream #0:1 -> #0:1 (mp3 (mp3float) -> aac (native))
Device setup failed for decoder on input stream #0:0 : Generic error in an external library

解决方案

原因是Jellyfin没有使用/dev/dri/renderD128的权限,不信的话可以用root用户执行FFMPEG的命令试试,如果没有报错的话,那肯定是权限问题。
首先确定Jellyfin的所属用户

1
ps auxw | grep jellyfin

查看渲染设备所处的用户组

1
stat -c "%G" /dev/dri/render*

查看Jellyfin用户所属的用户组

1
2
groups `ps auxw | grep jelly | sed -n "1, 1p" | awk '{print $1}'`

可以看到两个不在一个组中,接下来把Jellyfin用户添加到/dev/dri/render*所属的组中

1
2
sudo gpasswd -a `ps auxw | grep jelly | sed -n "1, 1p" | awk '{print $1}'` `stat -c "%G" /dev/dri/render*`
newgrp render

不用重启,马上点开视频看看是不是正常了。