Chromium在Linux下的视频硬件加速问题

posts/chromium%E5%9C%A8linux%E4%B8%8B%E7%9A%84%E8%A7%86%E9%A2%91%E7%A1%AC%E4%BB%B6%E5%8A%A0%E9%80%9F%E9%97%AE%E9%A2%98

众所周知 Chromium 在 Linux 环境下即使打开了硬件加速播放视频的时候仍然会使用软解,对于一些高分辨率的播放场景使用 CPU 进行软件会比较吃力且消耗大量计算资源。截止目前的 Chromium 107 仍未解决这个问题。但通过一些额外的启动参数仍可以开启硬件加速,下面我们将讨论这个问题。

测试环境

  • Linux Distribution: Arch Linux
  • GPU: Mesa Intel® UHD Graphics 620
  • Window System: X Server / Wayland
  • Browser: Chrome Version 107.0.5304.110 (Official Build) (64-bit)
  • Desktop: GNOME 43.1

确保你的硬件加速已开启

按照 Arch Linux Wiki 的 Hardware video acceleration 的介绍对于本次测试环境的 GPU 只需要安装intel-media-driver包就足够了。对于一些其他型号的 GPU 按照 Wiki 操作即可。

安装过后可通过libva-utils包提供的 vainfo 验证是 VA-API 是否能够正常调用。

调用成功输出如下:

Trying display: wayland
vainfo: VA-API version: 1.16 (libva 2.16.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 22.4.4 ()
vainfo: Supported profile and entrypoints
      VAProfileNone                   :	VAEntrypointVideoProc
      VAProfileNone                   :	VAEntrypointStats
      VAProfileMPEG2Simple            :	VAEntrypointVLD
      VAProfileMPEG2Simple            :	VAEntrypointEncSlice
      VAProfileMPEG2Main              :	VAEntrypointVLD
      VAProfileMPEG2Main              :	VAEntrypointEncSlice
      VAProfileH264Main               :	VAEntrypointVLD
      VAProfileH264Main               :	VAEntrypointEncSlice
      VAProfileH264Main               :	VAEntrypointFEI
      VAProfileH264Main               :	VAEntrypointEncSliceLP
      VAProfileH264High               :	VAEntrypointVLD
      VAProfileH264High               :	VAEntrypointEncSlice
      VAProfileH264High               :	VAEntrypointFEI
      VAProfileH264High               :	VAEntrypointEncSliceLP
      VAProfileVC1Simple              :	VAEntrypointVLD
      VAProfileVC1Main                :	VAEntrypointVLD
      VAProfileVC1Advanced            :	VAEntrypointVLD
      VAProfileJPEGBaseline           :	VAEntrypointVLD
      VAProfileJPEGBaseline           :	VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline:	VAEntrypointVLD
      VAProfileH264ConstrainedBaseline:	VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline:	VAEntrypointFEI
      VAProfileH264ConstrainedBaseline:	VAEntrypointEncSliceLP
      VAProfileVP8Version0_3          :	VAEntrypointVLD
      VAProfileVP8Version0_3          :	VAEntrypointEncSlice
      VAProfileHEVCMain               :	VAEntrypointVLD
      VAProfileHEVCMain               :	VAEntrypointEncSlice
      VAProfileHEVCMain               :	VAEntrypointFEI
      VAProfileHEVCMain10             :	VAEntrypointVLD
      VAProfileHEVCMain10             :	VAEntrypointEncSlice
      VAProfileVP9Profile0            :	VAEntrypointVLD

当然也可使用 VLC 播放器结合intel_gpu_top进行验证,如果VideoVideoEnhance有使用率,就证明开启了硬件加速。使用 MPV 播放器在终端上播放视频观察终端输出也可以。

添加额外的启动参数开启 Chrome 的视频硬件加速

X Server

开启方式比较简单,只需要在$HOME/.config/chromium-flags.conf下添加:

--use-gl=desktop
--disable-features=UseChromeOSDirectVideoDecoder

不出意外的话,播放视频的时候使用开发者设置的 Media 就能查看开启硬件加速了。

Wayland

与 X Server 方式类似,只需要在$HOME/.config/chromium-flags.conf下添加:

--use-gl=egl
--disable-features=UseChromeOSDirectVideoDecoder

Mesa 不支持 ANGLE sync 导致的问题

由于在 Native Wayland 下硬解无法工作,所以进行硬件解码的会使用 Xwayland。其中的--use-gl=egl在部分系统上会出现 bug,在我这里表现为浏览器滚动和播放视频帧率明显下降的情况(尽管视频播放硬件加速已经打开了)。

后续希望 Mesa 能够支持 ANGLE sync 吧。

截止目前(2023 年 2 月 15 日) egl/x11: implement ANGLE_sync_control_rate 已经合并到了 Mesa 中,并且 ArchLinux 的 Mesa 已经更新到了其上游合并后的版本,现在可以在 Wayland 的下使用硬件加速进行视频硬解码了。

不同GPU对硬件解码的支持可参考:

参考链接