检查 GPU 和 H264 硬件解码支持

检查 GPU 和 H264 硬件解码支持

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

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

答案1

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

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

1.关于NVIDIA的NVENC和NVDEC:

编译并运行 Philip Langdale 的nv-视频信息项目,其中包含 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 |
==========================================================

同样,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
-----------------------------------------------

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

VAAPI 的功能可以通过以下方式轻松查询:维亚诺实用程序作为 libva-utils 的一部分包含在内。编解码器支持通常受 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

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

相同的信息也可以映射到 QuickSync 的功能,但有一些注意事项:比 IceLake (ICL+) 更旧的硬件不公开所有编码器功能,例如(官方)VP9 编码支持等。要确认功能支持,请参阅文档可在媒体驱动程序包裹。

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

对于英特尔硬件,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 中的过滤器也可用于从 VAAPI 上下文派生 QuickSync 设备,如维基百科

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

3. AMD 的案例:VAAPI 和 AMF:

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

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

对于 AMD AMF 的功能支持,使用本维基了解更多信息。与 NVIDIA 和 Intel 不同,AMD 跨多代硬件的 VCE(和 VCN)实现并不总是升级。

例如:在 Polaris 上,增加了 HEVC 编码支持通过剥离对 B 帧的支持,削弱了 H.264/AVC 编码器. 到目前为止,未实施加权预测在他们的编码器上。

关于Docker的注意事项:

docker-ceNVIDIA 硬件通过软件包直接在当前版本上受支持nvidia-container-toolkit。还存在 nvidia-docker2 实现的先前版本(现已弃用)。请参阅这个项目更多细节。

对于 VAAPI(以及潜在的 QuickSync 支持),您需要以特权方式传递 DRI 设备节点,如下所示这个例子

答案2

有一个简单的方法:安装一个加速功能,ffmpeg然后运行ffmpeg -codecs并 grep264

相关内容