Firefox 使用 VAAPI 硬解视频

本文记录了在 X11 下设置 Firefox 调用 VAAPI 硬解视频,提供了验证 VAAPI 是否启用的方法,对比了低码率下硬解与软解的 CPU 占用与功耗。

测试环境

名称版本
发行版Linux Mint 21
桌面环境Cinnamon 5.4.12
Firefox106.0.5
GPUR5-5500U 的核显

查看显卡支持的编码

Firefox 通过 VAAPI 硬解视频,首先要了解显卡支持解码的编码。运行 vainfo 命令,输出如下:

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
libva info: VA-API version 1.14.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so
libva info: Found init function __vaDriverInit_1_14
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.14 (libva 2.12.0)
vainfo: Driver version: Mesa Gallium driver 22.2.3 - kisak-mesa PPA for RENOIR (renoir, LLVM 14.0.6, DRM 3.48, 6.0.7-tkg-bore)
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSlice
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
VAProfileNone : VAEntrypointVideoProc

输出结果中,VAEntrypointVLD 表示显卡支持解码此格式,VAEntrypointEncSlice 表示支持编码此格式。我的核显可以解码 VP9、AVC(H264)和 HEVC,但不能解码 AV1。

设置 Firefox

确认 VAAPI 没有问题后,进行 Firefox 的设置。

在 Firefox 的地址栏输入 about:support,打开 Troubleshooting Information 页面,找到 HARDWARE_VIDEO_DECODING。如果这里的值是 available by default,那么视频硬解已经开启了。在我的电脑上,这一栏的值是 available by defaultblocklisted by env: Blocklisted by gfxInfo 两行,说明视频硬解被禁用了。不过可以修改设置,强制打开这项功能:打开 about:config,将 media.hardware-video-decoding.force-enabled 改为 true,重启 Firefox。再次进入 about:support 查看,发现此项的值变为了三行,多出的一行为:force_enabled by user: Force enabled by pref,说明上一步的设置生效了。

视频网站设置

显卡支持解码的编码种类有限,视频网站提供的编码未必受显卡支持。BiliBili 默认的编码格式是 AV1。由于我的核显不支持 AV1,现在直接打开 B 站的视频,仍然只能软解。需要修改视频编码的设置,使用 AVC(H264)格式。点击视频右下角的齿轮,在“播放策略”中选择 AVC。刷新网站,在视频上右键点击,在菜单中选择“视频统计信息”,打开“统计信息”窗口。注意第一行的 Mime Type:codecs= 开始的部分,就是视频的编码。在这张图中,codec=avc1.640032,说明视频的编码是 AVC。

BiliBili 视频统计信息
BiliBili 视频播放设置

验证 Firefox 是否使用 VAAPI

查看 Firefox 的输出

如何验证 Firefox 真的在用 VAAPI 呢?设置 MOZ_LOG 环境变量后启动 Firefox,使之打印相关信息:

1
MOZ_LOG="PlatformDecoderModule:5" firefox

播放视频,观察 Firefox 的输出。如果 VAAPI 被启用,就能看到输出大量包含 VAAPI 的日志。

查看显卡的使用情况

如果使用 Intel 核显,可以安装 intel-gpu-tools,运行 intel_gpu_top,观察解码部分的占用。但 AMDGPU 没有这样的工具。

低码率下对比软解与硬解

一般而言,分辨率和码率越高,软解占用的 CPU 越多,目前软解高码率 4K 视频,对于主流 CPU 仍然有较大的压力,在这种情况下,硬解是更优的选择。然而对于 1080P 低码率视频,硬解相对软解会有多大的优势呢?下面分别播放相同的测试视频1,观察 CPU 的占用以及功耗。

注意

在测量功耗与 CPU 占用时,不要设置 MOZ_LOG="PlatformDecoderModule:5" 环境变量,避免影响结果。

CPU 的使用,通过 htop 观察。软解时,Firefox 的三个进程占用 CPU 较高,合计使用 70% 左右;硬解时,两个进程占用 CPU 较高,合计 60% 左右。

功耗通过 tlp 观察。使用 watch -n 1 "tlp-stat -b | grep power_now" 监控功耗的变化。软解时,功耗在 8W 到 10W 间波动,大多数时候在 9W 左右;硬解时,功耗保持在 8.5W 左右,几乎不变。

因此,在低码率的场景下,硬解仍然 CPU 占用更少、功耗更低,推荐开启。