免责声明

免责声明

问题简而言之:无法在 Chrome 中启用硬件视频加速。我的台式机集成了 GPU Intel UHD 750 和 Core i5 11600,运行 Kubuntu 20.04。

最初,我根本没有硬件加速,所以即使我intel-media-va-driver-non-free安装了VLC,也没有加速来播放视频。的输出vainfo

libva info: VA-API version 1.7.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_7
libva info: va_openDriver() returns 1
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_1_6
libva info: va_openDriver() returns -1

我搜索了解决方案,但没有找到遇到同样问题的人。我决定遵循有关相关问题的一些建议。首先,我将内核从 5.11 更新到 5.15,但这没有帮助。然后我添加了一个存储库来安装 21.xx 版本的 Intel 驱动程序,如此处评论中的建议:https://githubmemory.com/repo/HaveAGitGat/Tdarr/issues/452。升级一些软件包并安装一些保留的软件包后,我获得了视频加速。的当前输出vainfo

libva info: VA-API version 1.12.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_12
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.12 (libva 2.12.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 21.3.3 (6fdf88c)
vainfo: Supported profile and entrypoints
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileNone                   : VAEntrypointStats

等等。

下一步是在 Chrome 中启用硬件加速。我按照这里的说明进行操作https://www.linuxuprising.com/2021/01/how-to-enable-hardware-accelerated.html但这没有帮助。该chrome://gpu选项卡显示以下内容

图形功能状态

  • Canvas:仅限软件。硬件加速已禁用
  • 画布进程外光栅化:禁用
  • 合成:仅限软件。硬件加速已禁用
  • 多个光栅线程:禁用
  • 进程外光栅化:禁用
  • OpenGL:禁用
  • 光栅化:仅限软件。禁用硬件加速
  • 原始绘制:禁用
  • Skia 渲染器:启用
  • 视频解码:仅限软件。硬件加速已禁用
  • Vulkan:已禁用
  • WebGL:已禁用
  • WebGL2:禁用

检测到的问题

  • 加速视频解码已通过阻止列表、about:flags 或命令行禁用。
    禁用功能:video_decode
  • Gpu 合成已通过 blocklist、about:flags 或命令行禁用。浏览器将退回到软件合成,并且硬件加速将不可用。
    禁用功能:gpu_compositing
  • GPU 进程无法启动:GPU 进程因 SwiftShader 崩溃次数过多。
    禁用功能:所有
    ...

我也尝试在 Firefox 中启用视频加速,但失败了。此外,我安装了 Chromium,chrome://gpu现在显示几乎所有功能都已启用,但视频加速未启用。

请帮忙!

答案1

免责声明

您可能无法在基于 Chrome 的浏览器中真正获得硬件加速。但我们不要放弃:仍然可以做一些事情。

我与您的设置的差异是:

  • 环境:ArchLinux+XOrg+KDE
  • GPU:(TigerLake-LP GT2 [Iris Xe Graphics]来自lspci)。
  • 内核:5.15.7-zen1-1-zen

我想食谱应该是一样的。

需要的包

我有这些(名称可能与 Ubuntu 不同):

  • 台面
  • xf86-视频-英特尔
  • 利布瓦
  • libva-intel 驱动程序
  • libva-mesa-驱动程序
  • libva-vdpau-驱动程序
  • 梅萨-维德保
  • 英特尔gmmlib
  • 英特尔媒体驱动程序

您可能还需要一些工具来检查:

  • libva 实用工具
  • vdpau信息
  • 英特尔 GPU 工具

浏览器设置

我设置了它们chrome://flags然后重新启动浏览器。这也适用于 Chromium,而 Vivaldi 内部 URL 位于vivaldi://前缀上。

  • 覆盖软件渲染列表
  • GPU光栅化
  • 零复制光栅器
  • 使显示合成器能够使用新的 GPU 线程
  • 加速 2D 画布
  • 进程外 2D 画布光栅化

浏览器启动

您需要使用额外选项重新启动浏览器:

--enable-features=VaapiVideoDecoder

您可以编辑启动配置文件以添加此配置文件。我的现在看起来像这样:

/usr/bin/google-chrome-stable --enable-features=VaapiVideoDecoder %U

检查状态

恕我直言,这是你能做的最好的事情。

浏览器

重新启动后,您可以转到内部 URLchrome://gpu并检查。这是我自己的状态:

Graphics Feature Status
Canvas: Hardware accelerated
Canvas out-of-process rasterization: Enabled
Compositing: Hardware accelerated
Multiple Raster Threads: Enabled
Out-of-process Rasterization: Hardware accelerated
OpenGL: Enabled
Rasterization: Hardware accelerated on all pages
Raw Draw: Disabled
Skia Renderer: Enabled
Video Decode: Hardware accelerated
Vulkan: Disabled
WebGL: Hardware accelerated
WebGL2: Hardware accelerated

我保留是Raw Draw: Disabled因为它在浏览器中表现不佳。如果您想尝试一下,请返回标志并启用“启用原始绘制“ 旗帜。

vainfo

如果您安装了它,只需运行它即可。我的工作原理是这样的:

[enzo@Feynman ~] vainfo 
vainfo: VA-API version: 1.13 (libva 2.13.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 21.4.3 ()
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
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointFEI
      VAProfileHEVCMain               : VAEntrypointEncSliceLP
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSlice
      VAProfileHEVCMain10             : VAEntrypointEncSliceLP
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile0            : VAEntrypointEncSliceLP
      VAProfileVP9Profile1            : VAEntrypointVLD
      VAProfileVP9Profile1            : VAEntrypointEncSliceLP
      VAProfileVP9Profile2            : VAEntrypointVLD
      VAProfileVP9Profile2            : VAEntrypointEncSliceLP
      VAProfileVP9Profile3            : VAEntrypointVLD
      VAProfileVP9Profile3            : VAEntrypointEncSliceLP
      VAProfileHEVCMain12             : VAEntrypointVLD
      VAProfileHEVCMain12             : VAEntrypointEncSlice
      VAProfileHEVCMain422_10         : VAEntrypointVLD
      VAProfileHEVCMain422_10         : VAEntrypointEncSlice
      VAProfileHEVCMain422_12         : VAEntrypointVLD
      VAProfileHEVCMain422_12         : VAEntrypointEncSlice
      VAProfileHEVCMain444            : VAEntrypointVLD
      VAProfileHEVCMain444            : VAEntrypointEncSliceLP
      VAProfileHEVCMain444_10         : VAEntrypointVLD
      VAProfileHEVCMain444_10         : VAEntrypointEncSliceLP
      VAProfileHEVCMain444_12         : VAEntrypointVLD
      VAProfileHEVCSccMain            : VAEntrypointVLD
      VAProfileHEVCSccMain            : VAEntrypointEncSliceLP
      VAProfileHEVCSccMain10          : VAEntrypointVLD
      VAProfileHEVCSccMain10          : VAEntrypointEncSliceLP
      VAProfileHEVCSccMain444         : VAEntrypointVLD
      VAProfileHEVCSccMain444         : VAEntrypointEncSliceLP
      VAProfileAV1Profile0            : VAEntrypointVLD
      VAProfileHEVCSccMain444_10      : VAEntrypointVLD
      VAProfileHEVCSccMain444_10      : VAEntrypointEncSliceLP

vdpauinfo

与上面相同。某处存在错误导致核心转储。不过,似乎没有人注意到这一点。 :-(

但使用MALLOC_CHECK_并没有多大帮助。

[enzo@Feynman ~] MALLOC_CHECK_=2 vdpauinfo 
display: :0   screen: 0
API version: 1
Information string: OpenGL/VAAPI backend for VDPAU

Video surface:

name   width height types
-------------------------------------------
420     4096  4096  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 NV24 YV24 P010 P016 Y_U_V_444_16 
422     4096  4096  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 NV24 YV24 P010 P016 Y_U_V_444_16 
444     4096  4096  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 NV24 YV24 P010 P016 Y_U_V_444_16 
420_16  4096  4096  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 NV24 YV24 P010 P016 Y_U_V_444_16 
422_16  4096  4096  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 NV24 YV24 P010 P016 Y_U_V_444_16 
444_16  4096  4096  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 NV24 YV24 P010 P016 Y_U_V_444_16 

Decoder capabilities:

name                        level macbs width height
----------------------------------------------------
MPEG1                          --- not supported ---
MPEG2_SIMPLE                   --- not supported ---
MPEG2_MAIN                     --- not supported ---
H264_BASELINE                  51 16384  2048  2048
H264_MAIN                      51 16384  2048  2048
H264_HIGH                      51 16384  2048  2048
VC1_SIMPLE                     --- not supported ---
VC1_MAIN                       --- not supported ---
VC1_ADVANCED                   --- not supported ---
MPEG4_PART2_SP                 --- not supported ---
MPEG4_PART2_ASP                --- not supported ---
DIVX4_QMOBILE                  --- not supported ---
DIVX4_MOBILE                   --- not supported ---
DIVX4_HOME_THEATER             --- not supported ---
DIVX4_HD_1080P                 --- not supported ---
DIVX5_QMOBILE                  --- not supported ---
DIVX5_MOBILE                   --- not supported ---
DIVX5_HOME_THEATER             --- not supported ---
DIVX5_HD_1080P                 --- not supported ---
H264_CONSTRAINED_BASELINE      51 16384  2048  2048
H264_EXTENDED                  --- not supported ---
H264_PROGRESSIVE_HIGH          --- not supported ---
H264_CONSTRAINED_HIGH          --- not supported ---
H264_HIGH_444_PREDICTIVE       --- not supported ---
VP9_PROFILE_0                  --- not supported ---
VP9_PROFILE_1                  --- not supported ---
VP9_PROFILE_2                  --- not supported ---
VP9_PROFILE_3                  --- not supported ---
HEVC_MAIN                      --- not supported ---
HEVC_MAIN_10                   --- not supported ---
HEVC_MAIN_STILL                --- not supported ---
HEVC_MAIN_12                   --- not supported ---
HEVC_MAIN_444                  --- not supported ---
HEVC_MAIN_444_10               --- not supported ---
HEVC_MAIN_444_12               --- not supported ---

Output surface:

name              width height nat types
----------------------------------------------------
B8G8R8A8         16384 16384    y  
R8G8B8A8         16384 16384    y  
R10G10B10A2      16384 16384    y  
B10G10R10A2      16384 16384    y  
A8               16384 16384    y  

Bitmap surface:

name              width height
------------------------------
B8G8R8A8         16384 16384
R8G8B8A8         16384 16384
R10G10B10A2      16384 16384
B10G10R10A2      16384 16384
A8               16384 16384

Video mixer:

feature name                    sup
------------------------------------
DEINTERLACE_TEMPORAL             -
DEINTERLACE_TEMPORAL_SPATIAL     -
INVERSE_TELECINE                 -
NOISE_REDUCTION                  -
SHARPNESS                        -
LUMA_KEY                         -
HIGH QUALITY SCALING - L1        -
HIGH QUALITY SCALING - L2        -
HIGH QUALITY SCALING - L3        -
HIGH QUALITY SCALING - L4        -
HIGH QUALITY SCALING - L5        -
HIGH QUALITY SCALING - L6        -
HIGH QUALITY SCALING - L7        -
HIGH QUALITY SCALING - L8        -
HIGH QUALITY SCALING - L9        -

parameter name                  sup      min      max
-----------------------------------------------------
VIDEO_SURFACE_WIDTH              -
VIDEO_SURFACE_HEIGHT             -
CHROMA_TYPE                      -
LAYERS                           -

attribute name                  sup      min      max
-----------------------------------------------------
BACKGROUND_COLOR                 -
CSC_MATRIX                       -
NOISE_REDUCTION_LEVEL            -
SHARPNESS_LEVEL                  -
LUMA_KEY_MIN_LUMA                -
LUMA_KEY_MAX_LUMA                -


Segmentation fault (core dumped)

我怀疑某些 VDPAU 库中存在错误导致此错误以及随后无法使用硬件加速。不过,只是猜测。

真实世界

令人失望的是,现实可能与我们的愿望背道而驰。

在一个选项卡上播放视频(我使用 Youtube),然后在另一个选项卡上打开chrome://media-internals,选择玩家标签。在里面最近的玩家选择名为 的项目blob:https://www.youtube.com/...

在里面玩家属性你可以找到一行这样的内容:

kVideoDecoderName   "Dav1dVideoDecoder"

这不是硬件解码器,而应该是硬件解码器VDAVideoDecoder

下一个日志区域中你可以找到一些线索:

00:00:00.321    info    "Selected FFmpegAudioDecoder for audio decoding, config: codec: opus, profile: unknown, bytes_per_channel: 4, channel_layout: STEREO, channels: 2, samples_per_second: 48000, sample_format: Float 32-bit, bytes_per_frame: 8, seek_preroll: 80000us, codec_delay: 312, has extra data: true, encryption scheme: Unencrypted, discard decoder delay: true, target_output_channel_layout: STEREO, has aac extra data: false"
00:00:00.321    info    "Failed to initialize DecryptingVideoDecoder"
00:00:00.321    info    "Failed to initialize VDAVideoDecoder"
00:00:00.321    info    "Failed to initialize VpxVideoDecoder"
00:00:00.322    info    "Effective playback rate changed from 0 to 1"
00:00:00.322    event   "kPlay"
00:00:00.325    kIsVideoDecryptingDemuxerStream false
00:00:00.325    kVideoDecoderName   "Dav1dVideoDecoder"
00:00:00.325    kIsPlatformVideoDecoder false

您还可以intel_gpu_top在另一个终端窗口中使用(sudoArchLinux 需要,Ubuntu 不确定)。

我有四个可用的“引擎”:“渲染/3D”、“Blitter”、“视频”和“视频增强”。

在浏览器播放期间,我可以看到前两个引擎正忙,而“视频”只是闲置。我的GPU提供的视频解码引擎根本没有使用!

浏览器似乎无法使用硬件加速视频,尽管它认为应该这样做。

让我们做一个不同的检查。

可见光通信

看起来VLC可以利用硬件加速。使用 GUI 启动它,然后转到“工具”>“首选项”>“输入和编解码器”,然后选择下面的“自动”选项硬件加速解码。然后关闭它并从命令行播放测试视频(以获取一些诊断输出)。

[enzo@Feynman ~] vlc ATestVideo.AC3.1080p.x264-WRM.mkv 
VLC media player 3.0.16 Vetinari (revision 3.0.13-8-g41878ff4f2)
[00005597db23e640] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
[00005597db311900] main audio output error: too low audio sample frequency (0)
[00007ff9e8d2fc00] main decoder error: failed to create audio output
[00005597db311900] vlcpulse audio output error: digital pass-through stream connection failure: Not supported
[00005597db311900] main audio output error: module not functional
[00007ff9e8d2fc00] main decoder error: failed to create audio output
[00007ff9c8005d20] gl gl: Initialized libplacebo v3.120.3 (API v120)
[00007ff9e8c0d6b0] avcodec decoder: Using Intel iHD driver for Intel(R) Gen Graphics - 21.4.3 () for hardware decoding

最后两行表示它正在使用硬件解码。由于我们不信任日志,因此您可以在另一个终端窗口中运行intel_gpu_top并看到“视频”资源现在正在被积极使用。

火狐浏览器

我知道这有点超出了原来的范围(Chrome),但我认为值得一提。使用 Firefox,可以看到一些硬件加速的视频解码正在运行,这要归功于 XOrg 和 Wayland 下的 VA-API。

ArchLinux 维基上的指南(下面的链接)将指导您(风险由您自行承担)了解如何修改一些开关以启用硬件加速视频,而我们通常intel_gpu_top会显示 GPU 是否正在工作。

例如,Vimeo 似乎能够利用这种支持,而 YouTube 则需要特定浏览器扩展以禁用 VP9 视频编解码器。

同样,如果您也设置media.webrtc.platformencodertrue. Firefox 不支持 Mirosoft Teams。

相同的扩展名Chrome 中存在,但似乎不如 Firefox 中有效。

包起来

看起来视频解码的硬件加速正在 Linux 中发挥作用。

这将更多地指出基于 Chromium 的浏览器中的错误,而不是环境中的错误。

也许未来会更加光明。但是不是现在。

参考

主要来自 ArchLinux wiki,但我认为这些细节可以应用于大量其他发行版。

https://wiki.archlinux.org/title/Hardware_video_acceleration https://wiki.archlinux.org/title/Chromium#Hardware_video_acceleration https://wiki.archlinux.org/title/VLC_media_player#Hardware_video_acceleration https://wiki.archlinux.org/title/firefox#Hardware_video_acceleration

相关内容