硬件H264使用Media Foundation编码ID3D11Texture2D

时间:2016-03-29 00:54:54

标签: windows encoding h.264 directx-11 mft

我正在开发一个捕获屏幕并对其进行编码的项目。我已经可以使用桌面复制API(Win8 +)捕获屏幕。使用API​​我可以获得ID3D11Texture2D纹理并将它们从GPU传输到CPU,然后使用libx264对它们进行编码。

然而,将纹理从GPU拉到CPU可能是一个瓶颈,可能会降低fps。此外,libx264占用CPU周期(取决于质量)来编码帧。我在GPU本身寻找编码ID3D11Texture2D纹理,而不是使用CPU进行编码作为优化。

我已经检查了文档和一些示例代码,但我没有成功。如果有人能指出一些能够完全符合我要求的资源,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

视频编码器,硬件和软件可能有不同的外形尺寸。 Windows本身提供可扩展的API,可选择编码器,然后可以使用其他编码器作为库和SDK。您已经在使用其中一个库(x264)。硬件编码器通常是特定于供应商的,并且依赖于可用的硬件,硬件直接涉及编码过程。如果您对特定硬件的解决方案感兴趣,那么检查相应的SDK可能是有意义的。

否则,Windows中硬件支持的视频编码的典型通用接口是Media Foundation Transform (MFT)。微软仅提供股票软件H.264视频编码器,除了与其他选项共享MFT接口这一事实外,它不太可能优于x264。但是,视频硬件驱动程序通常会为可用硬件安装额外的MFT,这会增加更多由硬件实现支持的MFT。这样的例子是:

  • 英特尔®快速同步视频H.264编码器MFT
  • NVIDIA H.264编码器MFT
  • AMDh264Encoder

由不同的供应商提供,它们提供类似的功能,使用这些MFT编码H.264是利用各种硬件的硬件视频编码的好方法。

另见:

答案 1 :(得分:0)

您必须检查是否可以在GPU编码器和DirectX之间共享纹理。

我知道可以在Nvidia Decoder和DirectX之间共享纹理,因为我已经成功完成了它。 Nvidia有一些互操作能力,所以首先,看看你是否可以分享纹理来完成GPU中的所有事情。

使用Nvidia,你可以这样做:Nvidia Decoding-> GPU中的DirectX显示。

检查DirectX Display-> Nvidia Enconding是否可行(知道nvidia提供Interop)

对于英特尔和ATI,我不知道他们是否提供与DirectX的互操作。

要知道的主要是检查是否可以使用GPU编码器纹理互连DirectX纹理。