首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得一个d3d_aware的IMFTransform (将输入从Windows from编码到H264)?

如何获得一个d3d_aware的IMFTransform (将输入从Windows from编码到H264)?
EN

Stack Overflow用户
提问于 2019-11-20 07:44:48
回答 1查看 515关注 0票数 0

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

我知道DXGI_FORMAT_B8G8R8A8_UNORM格式可以看作是IMFTranform上的D3D_AWARE的MFVideoFormat_NV12。但是我在获取D3D_AWARE的IMFTranform时遇到了问题

代码语言:javascript
运行
复制
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");;

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

代码语言:javascript
运行
复制
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,他们工作

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2019-11-24 06:13:25

您将很难将Direct3D 9感知转换与ID3D11Texture2D一起使用,因此您需要分别使用Direct3D 11感知和MF_SA_D3D11_AWARE

英特尔H.264视频编码器MFT的典型属性:

代码语言:javascript
运行
复制
## 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 --请记住这一点。您可能需要更新代码以获取硬件编码器。

这就是你得到的:

代码语言:javascript
运行
复制
## 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)

[...]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58944556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档