我想在后端服务器上运行一个程序,该程序解码视频,使用 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 运行时和媒体驱动程序包作为安装的组件。
对于英特尔硬件,i965
和iHD
(专有媒体驱动程序包)驱动程序均可用作 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-ce
NVIDIA 硬件通过软件包直接在当前版本上受支持nvidia-container-toolkit
。还存在 nvidia-docker2 实现的先前版本(现已弃用)。请参阅这个项目更多细节。
对于 VAAPI(以及潜在的 QuickSync 支持),您需要以特权方式传递 DRI 设备节点,如下所示这个例子。
答案2
有一个简单的方法:安装一个加速功能,ffmpeg
然后运行ffmpeg -codecs
并 grep264