下一个代码应提供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,它们可以正常工作
预先感谢
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) [...]