gpt4 book ai didi

c++ - 从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:49 45 4
gpt4 key购买 nike

我正在使用 SinkWriter 以使用媒体基础对视频进行编码。

在初始化 SinkWriter 之后,我想获取它使用的底层编码器,并打印出它的名称,这样我就可以看到它使用的是什么编码器。 (在我的例子中,编码器很可能是 MF 中包含的 H.264 Video Encoder)。

我可以获得对编码器的 ICodecAPI 和 IMFTransform 接口(interface)的引用(使用 pSinkWriter->GetServiceForStream),但我不知道如何使用这些接口(interface)获取编码器的友好名称。

有谁知道如何从 sinkwriter 获取编码器的友好名称?或者从它的 ICodecAPIIMFTransform 接口(interface)?

最佳答案

到目前为止,这是一个有效的解决方案,我不能 100% 确定它是否有效,但可以做的是:

1) 在启动时枚举所有可以使用的编解码器(据我所知,在这种情况下是 H264 编码器)并订阅设置更改事件

MFT_REGISTER_TYPE_INFO TransformationOutput = { MFMediaType_Video, MFVideoFormat_H264 };
DWORD nFlags = MFT_ENUM_FLAG_ALL;
UINT32 nCount = 0;
CLSID* pClsids;
MFTEnum( MFT_CATEGORY_VIDEO_ENCODER, nFlags, NULL, &TransformationOutput, NULL, &pClsids, &nCount);
// Ok here we assume nCount is 1 and we got the MS encoder
ICodecAPI *pMsEncoder;
hr = CoCreateInstance(pClsids[0], NULL, CLSCTX_INPROC_SERVER, __uuidof(ICodecAPI), (void**)&pMsEncoder);
// nCodecIds is supposed to be an array of identifiers to distinguish the sender
hr = pMsEncoder->RegisterForEvent(CODECAPI_AVEncVideoOutputFrameRate, (LONG_PTR)&nCodecIds[0]);

2) 不能 100% 确定在设置流的输入媒体类型时是否也设置了帧速率设置,但无论如何您可以尝试在您检索到的 ICodecAPI 上设置相同的属性来自 SinkWriter。然后在获取事件后,您应该能够通过将 lParam1 与传递的值进行比较来识别编解码器。但这仍然很差,因为它依赖于所有编码器都支持事件通知这一事实,并且如果我关于在流构建时生成事件的假设是错误的,则需要进行不必要的参数更改。

关于c++ - 从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20946419/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com