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
| 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
|
不用重启,马上点开视频看看是不是正常了。