下一段代码应提供inputInfo和outputInfo配置以获取IMFTransform,并使用此IMFTransform将ID3D11Texture2D(格式为DXGI_FORMAT_B8G8R8A8_UNORM)编码为H264
我知道DXGI_FORMAT_B8G8R8A8_UNORM格式可以看作是IMFTranform上的D3D_AWARE的MFVideoFormat_NV12。但是我在获取D3D_AWARE的IMFTranform时遇到了问题
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复制应用程序接口,然后它编码为H264,他们工作
提前感谢
发布于 2019-11-24 06:13:25
您将很难将Direct3D 9感知转换与ID3D11Texture2D
一起使用,因此您需要分别使用Direct3D 11感知和MF_SA_D3D11_AWARE
。
英特尔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)
请注意,three不是Direct3D 9感知标记(总而言之,这已经过时了)。
可以使用MediaFoundationVideoEncoderTransforms tool以交互方式检查可用的编码器MFT及其属性。
下一件事是使用MFT_ENUM_FLAG_SYNCMFT
条件过滤转换。这将过滤掉所有硬件辅助的编码器,你得到的MFT是微软的软件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)
[...]
https://stackoverflow.com/questions/58944556
复制相似问题