如何获得d3d_aware的IMFTransform(将Windows Duplication API的输入编码为H264?

问题描述 投票:0回答:1

下一个代码应提供inputInfo和outputInfo配置,以获取IMFTransform,并且此IMFTransform用于将ID3D11Texture2D(格式为DXGI_FORMAT_B8G8R8A8_UNORM)编码为H264

我了解格式DXGI_FORMAT_B8G8R8A8_UNORM可以作为D3D_AWARE的IMFTranform上的MFVideoFormat_NV12来使用。但是我在获取IMFTranform是D3D_AWARE]时遇到问题

MFT_REGISTER_TYPE_INFO inputInfo = { MFMediaType_Video, MFVideoFormat_NV12 };
MFT_REGISTER_TYPE_INFO outputInfo = { MFMediaType_Video, MFVideoFormat_H264 };

MFT_OUTPUT_STREAM_INFO mosiBuffer;

UINT32 unFlags = MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER;

CatchError( MFTEnumEx(
    MFT_CATEGORY_VIDEO_ENCODER,
    unFlags,
    &inputInfo,      // Input type 
    &outputInfo,       // Output type 
    &ppActivate,
    &count
),(LPSTR)"Line 385");

CatchError(ppActivate[0]->ActivateObject(
    __uuidof(IMFTransform),
    (void**)& pTransform
),(LPSTR)"Line 392");

CatchError(pTransform->ProcessMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, NULL),(LPSTR)"Line 396");

IMFAttributes* imfAttributes;
CatchError(pTransform->GetAttributes(&imfAttributes), (LPSTR)"Error getAttributes from pTransform");
CatchError(imfAttributes->GetUINT32(MF_SA_D3D_AWARE,0), (LPSTR)"Error pTranform not D3D_AWARE");;

在最后一行,当我这样做时:

CatchError(pTransform->GetAttributes(&imfAttributes), (LPSTR)"Error getAttributes from pTransform");
CatchError(imfAttributes->GetUINT32(MF_SA_D3D_AWARE,0), (LPSTR)"Error pTranform not D3D_AWARE");

我收到错误消息“ Error pTranform not D3D_AWARE”,我不知道如何获取为D3D_AWARE的pTranform

我使用此Windows复制API在计算机上尝试了一些程序,然后将其编码为H264,它们可以正常工作

预先感谢

winapi video directx-11 ms-media-foundation desktop-duplication
1个回答
0
投票
您将很难在ID3D11Texture2D上使用Direct3D [9]感知的转换,因此您分别需要Direct3D 11感知和MF_SA_D3D11_AWARE

Intel H.264视频编码器MFT的典型属性:

## Intel® Quick Sync Video H.264 Encoder MFT 11 Attributes: * MFT_TRANSFORM_CLSID_Attribute: {4BE8D3C0-0515-4A37-AD55-E4BAE19AF471} (Type VT_CLSID) * MF_TRANSFORM_FLAGS_Attribute: MFT_ENUM_FLAG_HARDWARE * MFT_ENUM_HARDWARE_VENDOR_ID_Attribute: VEN_8086 (Type VT_LPWSTR) * MFT_ENUM_HARDWARE_URL_Attribute: AA243E5D-2F73-48c7-97F7-F6FA17651651 (Type VT_LPWSTR) * MFT_INPUT_TYPES_Attributes: {3231564E-3961-42AE-BA67-FF47CCC13EED}, MFVideoFormat_NV12, MFVideoFormat_ARGB32 * MFT_OUTPUT_TYPES_Attributes: MFVideoFormat_H264, MFVideoFormat_H264_HDCP * MFT_CODEC_MERIT_Attribute: 7 (Type VT_UI4) * MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE: 1 (Type VT_UI4) * MF_TRANSFORM_ASYNC: 1 (Type VT_UI4) ### IMFTransform * Streams: Input 1, Output 1 #### Attributes * MF_SA_D3D11_AWARE: 1 (Type VT_UI4) <<--------------------------------- * MFT_ENUM_HARDWARE_URL_Attribute: AA243E5D-2F73-48c7-97F7-F6FA17651651 (Type VT_LPWSTR) * MFT_ENUM_HARDWARE_VENDOR_ID_Attribute: VEN_8086 (Type VT_LPWSTR) * MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE: 1 (Type VT_UI4) * MFT_TRANSFORM_CLSID_Attribute: {4BE8D3C0-0515-4A37-AD55-E4BAE19AF471} (Type VT_CLSID) * MF_VIDEO_MAX_MB_PER_SEC: 1165381 (Type VT_UI4) * MFT_GFX_DRIVER_VERSION_ID_Attribute: 0 (Type VT_UI8) * MF_TRANSFORM_ASYNC: 1 (Type VT_UI4)

请注意,三个都不是Direct3D 9感知标记(总而言之,这已经过时了。]

您可以使用MediaFoundationVideoEncoderTransforms tool交互地检查可用的编码器MFT及其属性。

[下一件事情是,您使用MFT_ENUM_FLAG_SYNCMFT条件过滤转换。这将过滤掉所有硬件辅助编码器,您将获得的MFT是Microsoft的软件H.264编码器。它既不支持Direct3D 9也不支持Direct3D 11-请记住这一点。您可能需要更新代码以使用硬件编码器。

这是您得到的:

## H264 Encoder MFT 6 Attributes: * MFT_TRANSFORM_CLSID_Attribute: {6CA50344-051A-4DED-9779-A43305165E35} (Type VT_CLSID, CLSID_CMSH264EncoderMFT) * MF_TRANSFORM_FLAGS_Attribute: MFT_ENUM_FLAG_SYNCMFT * MFT_INPUT_TYPES_Attributes: MFVideoFormat_IYUV, MFVideoFormat_YV12, MFVideoFormat_NV12, MFVideoFormat_YUY2 * MFT_OUTPUT_TYPES_Attributes: MFVideoFormat_H264 ### IMFTransform * Stream Limits: Input 1..1, Output 1..1 * Streams: Input 1, Output 1 #### Attributes * MFT_ENCODER_SUPPORTS_CONFIG_EVENT: 1 (Type VT_UI4) [...]

© www.soinside.com 2019 - 2024. All rights reserved.