检查 GPU 和 H264 硬件解码支持

nih*_*hit 1 h.264 gpu ubuntu

我想在后端服务器上运行一个程序,该程序对视频进行解码,使用 OpenGL 在其上应用滤镜,然后使用 h.264 将视频编码为新文件。为了验证该过程是否尽可能快,我想确保我可以访问 GPU 以及硬件解码/编码功能,即使程序在 Docker 容器中运行也是如此。

有什么方法可以验证我是否可以访问实际硬件而不是软件模拟?

Den*_*gai 6

根据应用于您的问题的标签以及通过 Docker 进行容器化的提及来判断,我假设您打算在 Ubuntu 上运行它。

您的查询中省略了有关特定硬件的详细信息,因此,我将包含与检查常见 GPU 的硬件加速编码和解码功能有关的所有相关信息,这些 GPU 支持特定于平台的硬件加速 API,通常是 NVIDIA 的 NVENC 和 NVDEC(分别用于编码和解码)、AMD 的 AMF 和 Intel 的 QuickSync 和 VAAPI 实现。

1.关于NVIDIA的NVENC和NVDEC:

编译并运行 Philip Langdale 的nv-video-info项目,其中包含 nvencinfo 和 nvdecinfo 程序。有关使用方法,请参阅Jaroslav Svoboda 的博客文章作为入门知识。该项目依赖于 nv-codec-headers 包,您可以从此处获取并构建该包。

nvencinfo程序将向您展示 NVIDIA GPU 的 NVENC 编码功能,此处报告的信息将取决于 GPU 的架构以及是否存在受支持的 GPU 驱动程序。如果您使用的是较旧的设备驱动程序,则可能不会显示所有 NVENC 功能。

请参阅下面运行 RTX 2080 的系统(我正在使用的笔记本电脑)的示例:

Loaded Nvenc version 9.1
Nvenc initialized successfully
Device 0: GeForce RTX 2080
==========================================================
                             Codec |   H264   |   HEVC   |
==========================================================
        Input Buffer Formats       |          |          |
----------------------------------------------------------
                              NV12 |        x |        x |
                              YV12 |        x |        x |
                              IYUV |        x |        x |
                            YUV444 |        x |        x |
                              P010 |        . |        x |
                         YUV444P10 |        . |        x |
                              ARGB |        x |        x |
                            ARGB10 |        x |        x |
                              AYUV |        x |        x |
                              ABGR |        x |        x |
                            ABGR10 |        x |        x |
----------------------------------------------------------
               Limits              |          |          |
----------------------------------------------------------
                     Maximum Width |     4096 |     8192 |
                     Maximum Hight |     4096 |     8192 |
         Maximum Macroblocks/frame |    65536 |   262144 |
        Maximum Macroblocks/second |   983040 |   983040 |
                Max Encoding Level |       51 |       62 |
                Min Encoding Level |        1 |        1 |
               Max No. of B-Frames |        4 |        5 |
      Maxmimum LT Reference Frames |        8 |        7 |
----------------------------------------------------------
            Capabilities           |          |          |
----------------------------------------------------------
      Supported Rate-Control Modes |       63 |       63 |
           Supports Field-Encoding |        0 |        0 |
               Supports Monochrome |        0 |        0 |
                      Supports FMO |        0 |        0 |
   Supports QPEL Motion Estimation |        1 |        1 |
             Supports BDirect Mode |        1 |        0 |
                    Supports CABAC |        1 |        1 |
       Supports Adaptive Transform |        1 |        0 |
          Supports Temporal Layers |        0 |        0 |
    Supports Hierarchical P-Frames |        0 |        0 |
    Supports Hierarchical B-Frames |        0 |        0 |
   Supports Separate Colour Planes |        1 |        0 |
             Supports Temporal SVC |        0 |        0 |
Supports Dynamic Resolution Change |        1 |        1 |
   Supports Dynamic Bitrate Change |        1 |        1 |
   Supports Dynamic Force Const-QP |        1 |        1 |
   Supports Dynamic RC-Mode Change |        0 |        0 |
      Supports Sub-Frame Read-back |        1 |        1 |
     Supports Constrained Encoding |        1 |        0 |
            Supports Intra Refresh |        1 |        1 |
   Supports Custom VBV Buffer Size |        1 |        1 |
       Supports Dynamic Slice Mode |        1 |        1 |
     Supports Ref Pic Invalidation |        1 |        1 |
            Supports PreProcessing |        0 |        0 |
           Supports Async Encoding |        0 |        0 |
          Supports YUV444 Encoding |        1 |        1 |
        Supports Lossless Encoding |        1 |        1 |
                      Supports SAO |        0 |        1 |
             Supports ME-Only Mode |        1 |        1 |
       Supports Lookahead Encoding |        1 |        1 |
              Supports Temporal AQ |        1 |        1 |
          Supports 10-bit Encoding |        0 |        1 |
      Supports Weighted Prediction |        1 |        1 |
   Supports B-Frames as References |        2 |        3 |
       Supports Emphasis Level Map |        1 |        0 |
----------------------------------------------------------
              Profiles             |          |          |
----------------------------------------------------------
                                   | Baseline |     Auto |
                                   |     Main |     Main |
                                   |     High |   Main10 |
                                   |      MVC |  Main444 |
                                   |  High444 |          |
                                   |     Auto |          |
----------------------------------------------------------
               Presets             |          |          |
----------------------------------------------------------
                                   |  default |  default |
                                   |       ll |       ll |
                                   |       hp |       hp |
                                   |       hq |       hq |
                                   |   bluray |   bluray |
                                   |     llhq |     llhq |
                                   |     llhp |     llhp |
                                   |  Unknown |  Unknown |
                                   | lossless | lossless |
==========================================================
Run Code Online (Sandbox Code Playgroud)

同样,nvdecinfo将向您展示支持 NVDEC 的 GPU 上可用的解码功能。与上面提到的可用功能相同的警告也适用于此。

以下是 RTX 2080 GPU 上的 nvdecinfo 输出示例:

Device 0: GeForce RTX 2080
-----------------------------------------------
Codec | Chroma | Depth | Max Width | Max Height
-----------------------------------------------
MPEG1 |    420 |     8 |      4080 |       4080
MPEG2 |    420 |     8 |      4080 |       4080
MPEG4 |    420 |     8 |      2032 |       2032
  VC1 |    420 |     8 |      2032 |       2032
 H264 |    420 |     8 |      4096 |       4096
MJPEG |    400 |     8 |     32768 |      16384
MJPEG |    420 |     8 |     32768 |      16384
MJPEG |    422 |     8 |     32768 |      16384
MJPEG |    444 |     8 |     32768 |      16384
 HEVC |    420 |     8 |      8192 |       8192
 HEVC |    420 |    10 |      8192 |       8192
 HEVC |    420 |    12 |      8192 |       8192
 HEVC |    444 |     8 |      8192 |       8192
 HEVC |    444 |    10 |      8192 |       8192
 HEVC |    444 |    12 |      8192 |       8192
  VP8 |    420 |     8 |      4096 |       4096
  VP9 |    420 |     8 |      8192 |       8192
  VP9 |    420 |    10 |      8192 |       8192
  VP9 |    420 |    12 |      8192 |       8192
-----------------------------------------------
Run Code Online (Sandbox Code Playgroud)

2.关于Intel的VAAPI和QuickSync功能支持:

VAAPI 的功能可以通过libva-utils 中包含的vainfo实用程序进行简单查询。编解码器支持通常受到 GPU 世代的限制,只有 IceLake (ICL+) 在正常和高位深度编码场景下公开支持高级编解码器的整个功能集,例如 HEVC 和 VP9 编码。

以下是旧版 Skylake 测试平台上 vainfo 的示例输出:

libva info: VA-API version 0.40.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/local/lib/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_40
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.40 (libva 1.7.3)
vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 1.8.4.pre1 (glk-alpha-71-gc3110dc)
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileVP9Profile0            : VAEntrypointVLD
Run Code Online (Sandbox Code Playgroud)

为了进行翻译,编码功能与入口点相关联Slice,而解码功能与入口点相关联VLD。低功耗编码支持通过 Slice 入口点公开LP

相同的信息也可以映射到 QuickSync 的功能,但有一些警告:早于 IceLake (ICL+) 的硬件不会公开所有编码器功能,例如(官方)VP9 编码支持等。要确认功能支持,请参阅可用的文档媒体驱动程序包中。

请注意,QuickSync 支持需要 libmfx 运行时和媒体驱动程序包作为已安装组件存在。

对于 Intel 硬件,i965iHD(专有媒体驱动程序包)驱动程序都可以用作 VAAPI 驱动程序,这可以通过环境变量 进行设置LIBVA_DRIVER_NAME。这可以全局设置,也可以在应用程序启动时设置。

FFmpeg 还可以通过指令设置要使用的驱动程序-init_hw_device。例如,要将iHD驱动程序与 FFmpeg 一起使用,请使用-init_hw_device vaapi=va:/dev/dri/renderD128,driver=iHD硬件设备初始化选项,该选项还将设备类型设置为 VAAPI,绑定到 DRM 节点/dev/dri/renderD128,之后可以通过 来使用派生设备-filter_hw_device va维基百科上提供了更多文档。

ffmpeg 中的hwmap过滤器还可用于从 VAAPI 上下文派生 QuickSync 设备,如 wiki 上所述

对于支持 AMD VCE(和 VCN)的硬件,VAAPI 仅在使用标准台面驱动程序(即 radeon(si) 和 amdgpu 开源驱动程序)时可用。AMDGPU-PRO 专有驱动程序包仅公开对 AMF 的支持(通过 Vulkan 互操作)。

3.AMD的案例:VAAPI和AMF:

如上所述,只要使用台面驱动程序,任何支持 VCE(和 VCN)的 AMD GPU 都将公开 VAAPI 支持。同样,功能支持也可以通过 libva-util 的 vainfo 打印出来。

AMF 明确要求安装和加载amdgpu-pro驱动程序,因为它使用仅由专有驱动程序使用的Vulkan 互操作性。

有关 AMD AMF 的功能支持,请使用此 wiki获取更多信息。与 NVIDIA 和 Intel 不同,AMD 跨多代硬件的 VCE(和 VCN)实施并不总是升级。

例证:在 Polaris 上,添加的 HEVC 编码支持取消了对 B 帧的支持,从而削弱了 H.264/AVC 编码器。迄今为止,其编码器尚未实现加权预测。

关于 Docker 的注意事项:

docker-ce当前版本通过软件包直接支持 NVIDIA 硬件nvidia-container-toolkit。还存在先前(现已弃用)版本的 nvidia-docker2 实现。请参阅此项目了解更多详细信息。

对于 VAAPI(以及可能的 QuickSync 支持),您需要以特权方式传递 DRI 设备节点,如本示例所示。