前言

买了一台N5105的小主机,一是为了安装好Debian后配置原生的docker环境7*24小时跑各种各样的项目,二是平时轻度的文字或者编程工作就不需要开放在桌子上那台主力机了,其实是因为主机开起来有七八十瓦功耗而且宿舍电费要自交

在快快乐乐的安装好了Edge并同步了所有数据以后我欢天喜地的访问了自己搭建的Jellyfin想看看N5105的解码能力,然后我就发现了不对劲——Jellyfin强制触发了转码,将HEVC的片源转码为了H264,而且视频播放一卡一卡的,CPU占用显著提高,很明显,此时浏览器调用了软件解码。

打开mission center一看,Video decode/encode占用为0,核显大哥摸鱼呢!

hdwaredecorednotenable.webp

访问edge://gpuVideo Acceleration Information全部都是空的,果然没有启用硬解

nooutput.webp

解决方案

首先安装vainfo,检查你设备当前编解码的硬件支持情况

sudo apt install vainfo
╭─[fridayssheep@allinone:~/.config]—{>_<:127}—(22:36:31)—(4ms)
╰─$> vainfo
Trying display: wayland
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.22 (libva 2.22.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 25.4.2 ()
vainfo: Supported profile and entrypoints
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileNone                   : VAEntrypointStats
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSliceLP
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSliceLP
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile1            : VAEntrypointVLD
      VAProfileVP9Profile2            : VAEntrypointVLD
      VAProfileVP9Profile3            : VAEntrypointVLD
      VAProfileHEVCMain422_10         : VAEntrypointVLD
      VAProfileHEVCMain444            : VAEntrypointVLD
      VAProfileHEVCMain444            : VAEntrypointEncSliceLP
      VAProfileHEVCMain444_10         : VAEntrypointVLD
      VAProfileHEVCMain444_10         : VAEntrypointEncSliceLP

如果你这里输出像下面这样或者部分为空

libva info: va_openDriver() returns -1
vaInitialize failed with error code -1 (unknown libva error),exit

请前往https://bluesky-soft.com/en/DXVAChecker.html 查询你显卡对应的编解码支持情况,如果确定不是显卡硬件不支持对应的编解码方式请自行安装显卡驱动(你知道我在说谁) FKU,NVIDIA

nvidia平台可以安装nvidia-vaapi-driver 来获取对NVIDIA显卡的VAAPI的支持

sudo apt install nvidia-vaapi-driver

intel核显/显卡建议安装non-free固件来使用Quick Sync Video以获得更高效的解码速度

sudo apt install intel-media-va-driver-non-free intel-gpu-tools

intel-gpu-tools是用来查看视奸intel显卡解码情况的,在终端输入sudo intel_gpu_top 检查Video 的占用情况即可得知是否调用了显卡进行硬解,其他平台也可以安装nvtop来检查ENG/DEC项是否有占用

sudo apt install top

安装后直接在终端输入nvtop即可查看视奸

Firefox

  • 如果图形界面运行在 X11 上,则 Firefox 版本需要 >= 81

  • 如果图形界面运行在 Wayland 上,则 Firefox 版本需要 >= 77

Firefox浏览器的配置最为简单,在 Firefox 地址栏中输入 about:config,搜索 media.ffmpeg.vaapi.enabled设置为true,搜索media.ffvpx.enabled,并设置为false,然后关掉浏览器再打开播放视频你就可以看到显卡的硬解发挥作用了

firefox.webp

你也可以在地址栏里输入about:support来查看编解码的支持情况

firefoxhdwareinfo.png

Chrome

在你的用户文件夹下的.config文件夹创建chrome的配置文件

vim ~/.config/chromium-flags.conf

按下i开始编辑,写入下面的命令来忽略Chrome 的显卡黑名单并启用Chrome浏览器的硬解编码能力(你可以按下Shift+Insert来粘贴)

--use-gl=angle --use-angle=gl --ignore-gpu-blocklist --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL,VaapiVideoDecodeLinuxGL,VaapiVideoEncoder,VaapiIgnoreDriverChecks --disable-gpu-driver-bug-workaround

如果你有NVIDIA显卡,可以尝试加入VaapiOnNvidiaGPUs 来启用NVIDIA显卡的解码能力

--use-gl=angle --use-angle=gl --ignore-gpu-blocklist --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL,VaapiVideoDecodeLinuxGL,VaapiVideoEncoder,VaapiIgnoreDriverChecks,VaapiOnNvidiaGPUs --disable-gpu-driver-bug-workaround

完毕后,按下Esc退出编辑模式,输入:wq退出编辑器

打开Chrome,访问chrome://flags/#disable-accelerated-video-decode 确保这个选项是已启用

enablehdwaresupport.png

访问chrome://gpu 来确保Video Acceleration Information 有了输出信息

chromedecordyes.png

同样的,关掉浏览器再打开播放一个视频就可以看到正常调用显卡解码了

chromehdwaredecode.webp

Edge(最煞笔的一个)

很多教程都觉得Edge也是Chromium类浏览器所以就把开启方法归进了和Chrome一样的创建一个chromium-flags.conf 配置文件,我真的是觉得佩服,但凡自己动动指头安装一下Edge就知道这种方法吊用没有。你要是跟着那些教程搞上半天然后访问edge://gpu你会发现Video Acceleration Information 这里还是空的

我找了一圈也没有找到Edge的配置文件位置,包括创建一个edge-flags.conf 或者加上一个microsoft也没有用,所以我们直接修改edge的.desktop文件的启动Exec命令

首先复制官方 .desktop 文件到自己的用户目录

mkdir -p ~/.local/share/applications
cp /usr/share/applications/microsoft-edge.desktop ~/.local/share/applications/

请不要直接修改位于/usr/share/applications.desktop文件,因为每次更新后这个文件都会被覆盖掉

Linux 桌面会优先读取用户目录下~/.local/share/applications/的启动项,这个路径下的 .desktop 文件会覆盖系统的同名文件

修改复制后的文件

vim ~/.local/share/applications/microsoft-edge.desktop

先在命令模式下输入/Exec后按下回车查找所有的Exec启动指令,跳转以后按下i进入编辑模式参照上文Chrome部分修改Exec文件添加(你可以按下Shift+Insert来粘贴)对应的启动参数,注意把启动参数加到%U的前面,修改完毕后按下Esc退出编辑模式,然后按下n查找下一处,跳转后再次按下i进入编辑模式并重复刚才的操作直到全部修改完毕。

changeedgeexec.webp

全部完成后,按下ESC 退出编辑模式,输入:wq退出编辑器

在程序菜单栏里面找到Edge的图标并打开它,同样的,访问edge://flags/#disable-accelerated-video-decode 确保这个选项是已启用,访问edge://gpu 来确保Video Acceleration Information 有了输出信息

edgehdwaresupport.png

同样的,关掉浏览器再打开播放一个视频就可以看到正常调用显卡解码了

edgedecordyes.webp