我想在后端服务器上运行一个程序,该程序对视频进行解码,使用 OpenGL 在其上应用滤镜,然后使用 h.264 将视频编码为新文件。为了验证该过程是否尽可能快,我想确保我可以访问 GPU 以及硬件解码/编码功能,即使程序在 Docker 容器中运行也是如此。
有什么方法可以验证我是否可以访问实际硬件而不是软件模拟?
根据应用于您的问题的标签以及通过 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 硬件,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 中的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 设备节点,如本示例所示。
归档时间: |
|
查看次数: |
13272 次 |
最近记录: |