问题简而言之:无法在 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
在另一个终端窗口中使用(sudo
ArchLinux 需要,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.platformencoder
为true
. 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