我需要在正确的GPU(实现编码器的GPU)上创建D3D设备和上下文。MFT_ENUM_ADAPTER_LUID
的文档说它需要Windows 10,实际上NVENC MFT甚至在Win10上也没有公开该属性。MFT_ENUM_HARDWARE_URL_Attribute
的文档说,该值是设备驱动程序的符号链接(symbolic link),实际上NVENC MFT不返回任何GUID链接,该值与MFT_FRIENDLY_NAME_Attribute
中的相同,特别是L"NVIDIA H.264 Encoder MFT"
MFT_ENUM_HARDWARE_VENDOR_ID_Attribute
似乎可以正常工作,返回L"VEN_10DE"
,因此我可以将其解析为一个数字,并与VendorId
结构的DXGI_ADAPTER_DESC
字段进行匹配。但是,该属性的文档说该支持是可选的。
我不喜欢可选,我想要可靠。如何将硬件编码器MFT与GPU匹配?即将有AMD拥有两个GPU的PC,例如华硕FX505DY,在这种系统上,厂商ID技巧将无法使用。
最佳答案
MFT实例[至少在实例化阶段]不是特定于设备的。如果您的系统中有两个启用NVENC的视频适配器,则编码器MFT相同,具有相同的CLSID。
您可以通过 MFT_MESSAGE_SET_D3D_MANAGER
消息来指定要使用的GPU,该参数将封装D3D设备并且特定于GPU。在此处为编码器选择GPU。
此外,FYI NVIDIA H.264编码器MFT特别无法与主视频适配器(包括但不限于this)一起使用,即使不是在所有地方,至少在许多系统中也无法正常工作。据我了解,这是Nvidia的错误,他们将在MFT实现中对其进行修复。