如何在 Windows 中使用 H264 视频编码器 MFT 编码位图

Posted

技术标签:

【中文标题】如何在 Windows 中使用 H264 视频编码器 MFT 编码位图【英文标题】:how encode bitmap with H264 video encoder MFT in windows 【发布时间】:2016-02-18 12:42:21 【问题描述】:

我的应用程序通过 GDI 或 DXGI 方法对捕获的帧进行编码。目前我正在使用帮助 x264 库进行编码。 AFAIK x264 是基于软件的库,我想在 GPU 的帮助下进行编码,这样可以节省 CPU 周期,希望速度也会更快。 经过搜索,我找到了一个H.264 Video Encoder MFT,它正在做h264编码。 但我回答了几个问题。 1) 它比 x264 编码库快吗? 2) 可以借助此 MFT 对位图帧进行编码吗? - 我只见过 MFVideoFormat_I420、MFVideoFormat_IYUV、MFVideoFormat_NV12、MFVideoFormat_YUY2、MFVideoFormat_YV12 这些格式受支持 3) 它是硬件加速的(意味着它使用 CPU 或 GPU)吗? - 最初我的理解是它使用 GPU,但在阅读这篇文章 MFT Encoder (h264) High CPU utilization 后我感到困惑。 4) H.264 Video Encoder MFT 可以单独使用而不使用 sink writer,因为我必须在网络上发送数据? 5)Windows中还有其他选择吗?

可能有些问题很傻,请随时编辑。

【问题讨论】:

我在其他一些问题中发现,使用硬件编码器必须设置标志 MFT_ENUM_FLAG_HARDWARE。我希望它会自动检测硬件。 我找到了一个替代选项,但它是第三方实现。我看起来类似于 Windows 的 H.264/AVC Wrapper lib。 【参考方案1】:

Media Foundation H.264 视频编码器是软件编码器。根据我的 [主观] 经验,它比 x264 慢,也许更重要的是,x264 提供了更广泛的设置,特别是在选择速度超过质量范围的模式时。无论哪种方式,股票 MS 编码器都不是硬件加速的。

但是,可能还有其他可用的 MFT(通常与相应的硬件驱动程序一起安装)进行硬件加速 H.264 编码。您可以通过枚举 MFT 来发现它们,也许最流行的是 Intel Quick Sync Video (QSV) Encoder。

HardwareVideoEncoderTransform app 进行枚举并为您提供相关详细信息:

典型输入是 NV12,有些提供其他输入选择(例如 32 位 RGB)。如果您需要其他格式,则必须预先转换输入。

硬件支持的编码器 CPU 消耗低,其效率取决于硬件实现。是的,您可以独立使用它们,完全独立使用它们或包装为 DirectShow 过滤器并包含在正常的 DirectShow 管道中。

备用 H.264 编码器通常基于 SDK,或以 DirectShow/MFT 形式封装在这些 SDK 之上,因为供应商将其实现打包成多媒体开发人员已经熟悉的众所周知的形式。

【讨论】:

感谢@Roman R。实际上我很困惑,因为我已经阅读了很多硬件加速 H264 编码器的地方。请参考***.com/questions/31236646/…、***.com/questions/23251666/…和Encoding H.264 video using hardware MFTs。 我的理解是媒体基础 H264 编码器内部使用的是基于硬件的编码器。 当谈到 H.264 编码时,Media Foundation 看到了 MFT 选项并选择了一个合适的选项。它通常更喜欢硬件而不是库存软件实施。如果您打算直接使用 MFT,则必须决定采用哪一种。来自 MS 的只有 SW。 什么意思“Media Foundation 看到了 MFT 的选择并选择了一个合适的”,谁来做。假设我正在使用我的应用程序,它只是调用 X264 API,所以我们必须编写逻辑来选择硬件 MFT 而不是软件一个或任何已经在 Windows 中实现的东西。这可能是一个愚蠢的问题,但我有点困惑。 能否请您提出替代品的名称?

以上是关于如何在 Windows 中使用 H264 视频编码器 MFT 编码位图的主要内容,如果未能解决你的问题,请参考以下文章

TSINGSEE青犀视频webrtc相关内容编译如何在c++端编码出H264?

mp4v2再学习 -- H264视频编码成MP4文件

怎样可以让Windows Media Player可以播放MP4格式电影

如何正确使用带有 YUV_420_888 和 MediaCodec 的 ImageReader 将视频编码为 h264 格式?

视频知识点(20)- H264码流如何在SPS中获取宽高信息?

视频知识点(20)- H264码流如何在SPS中获取宽高信息?