Chrome

在 Chrome、Kubuntu 20.04 中啟用硬體影片加速

  • January 14, 2022

簡而言之:無法在 Chrome 中啟用硬體影片加速。我的台式機集成了 GPU Intel UHD 750 和 Core i5 11600,它執行 Kubuntu 20.04。

最初,我根本沒有硬體加速,所以即使是 VLC 播放影片也沒有加速,儘管我已經intel-media-va-driver-non-free安裝了。的輸出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,但這並沒有幫助。然後我添加了一個 repo 來安裝英特爾驅動程序的 21.xx 版本,如此處評論中所建議的: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.linuxupprising.com/2021/01/how-to-enable-hardware-accelerated.html但沒有幫助。該chrome://gpu選項卡顯示以下內容

圖形功能狀態

  • 帆布:僅限軟體。禁用硬體加速
  • 畫布程序外光柵化:已禁用
  • 合成:僅限軟體。禁用硬體加速
  • 多個光柵執行緒:禁用
  • 程序外光柵化:禁用
  • OpenGL:已禁用
  • 光柵化:僅限軟體。禁用硬體加速
  • 原始繪圖:已禁用
  • Skia 渲染器:已啟用
  • 影片解碼:僅限軟體。禁用硬體加速
  • Vulkan:已禁用
  • WebGL:已禁用
  • WebGL2:已禁用

檢測到的問題

  • 已通過阻止列表、about:flags 或命令行禁用加速影片解碼。

禁用功能:video_decode

  • Gpu 合成已通過阻止列表、about:flags 或命令行禁用。瀏覽器將退回到軟體合成,硬體加速將不可用。

禁用功能:gpu_compositing

  • GPU 程序無法啟動:GPU 程序使用 SwiftShader 崩潰太多次。

禁用功能:所有

我還嘗試在 Firefox 中啟用影片加速,但失敗了。此外,我安裝了 Chromium,chrome://gpu現在顯示幾乎所有功能都已啟用,但影片加速未啟用。

請幫忙!

免責聲明

您可能不會在基於 Chrome 的瀏覽器中真正獲得硬體加速。但我們不要投降:有些事情還是可以做的。

我與您的設置的區別是:

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

我想配方應該是一樣的。

需要的包

我有這些(名稱可能與 Ubuntu 不同):

  • 檯面
  • xf86-影片-英特爾
  • 圖書館
  • libva 英特爾驅動程序
  • libva 表驅動程序
  • libva-vdpau-驅動程序
  • vdpau 表
  • 英特爾-gmmlib
  • 英特爾媒體驅動程序

您可能還需要一些工具來檢查:

  • libva-utils
  • vdpauinfo
  • 英特爾 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/...

Player 屬性中,您可以找到這樣的行:

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

看起來 VLC 可以利用硬體加速。使用 GUI 啟動它,然後轉到 Tools > Preferences > Input & Codecs 並選擇Hardware-accelerated decoder下的“Automatic”選項。然後關閉它並從命令行播放測試影片(以獲取一些診斷輸出)。

[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),但我認為值得一提。由於 VA-API,在 XOrg 和 Wayland 下,使用 Firefox 可以看到一些硬體加速的影片解碼。

ArchLinux wiki 上的指南(下面的連結)將指導您(風險自負)如何修改一些切換以啟用硬體加速影片,而我們通常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

引用自:https://unix.stackexchange.com/questions/679185