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

Get encoder name from SinkWriter or ICodecAPI or IMFTransform

本文关键字:编码器 获取 IMFTransform SinkWriter ICodecAPI      更新时间:2023-10-16

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

初始化 SinkWriter 后,我想获取它使用的基础编码器,并打印出它的名称,以便我可以看到它使用的编码器。(就我而言,编码器很可能是 MF 中包含的 H.264 视频编码器)。

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

有谁知道如何从接收器写入器获取编码器的友好名称?还是从其ICodecAPIIMFTransform界面?

到目前为止,这是一个有效的解决方案,我不能 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%确定在设置流的输入媒体类型时是否也设置了帧速率设置,但无论如何,您可以尝试在从SinkWriter检索到的ICodecAPI上设置相同的属性。然后,在获取事件后,您应该能够通过将lParam1与传递的值进行比较来识别编解码器。但这仍然非常糟糕,因为它依赖于所有编码器都支持事件通知的事实,并且如果我关于在流构造上生成的事件的假设是错误的,则需要更改不必要的参数。

有了IMFTransform,你没有编码器的友好名称。

你拥有的选项之一是检查转换输出类型并与众所周知的 GUID 进行比较以识别编码器,特别是你将有一个子类型MFVideoFormat_H264与 H264 编码器 MFT。

另一种选择是访问编码器的CLSIDIMFTransform不会得到它,但您可能会以其他方式获得它,例如通过IMFActivate或查询MFT_TRANSFORM_CLSID_Attribute属性,或通过IPersist*接口)。然后,可以在注册表中查找友好名称或枚举转换,并通过比较 CLSID 在该列表中查找转换。