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

时间:2014-01-06 09:07:08

标签: c++ winapi encoding ms-media-foundation mft

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

在我初始化SinkWriter之后,我想获得它使用的底层编码器,并打印出它的名字,这样我就能看到它使用的编码器。 (就我而言,编码器很可能是MF中包含的H.264 Video Encoder

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

有谁知道如何从sinkwriter获取编码器的友好名称?或者从ICodecAPIIMFTransform界面?

2 个答案:

答案 0 :(得分:1)

这是迄今为止有效的解决方案,我并非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设置相同的属性。 {1}}。然后,在获得事件后,您应该能够通过将SinkWriter与传递的值进行比较来识别编解码器。但是这仍然非常差,因为它依赖于所有编码器都支持事件通知并且如果我关于在流构造上生成的事件的假设是错误的,则需要不需要的参数更改的事实。

答案 1 :(得分:0)

拥有IMFTransform您没有编码器的友好名称。

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

另一种选择是到达编码器的CLSIDIMFTransform没有得到它,但您可能会使用它,例如通过IMFActivate或查询MFT_TRANSFORM_CLSID_Attribute属性,或通过IPersist*接口)。然后,您可以查看注册表以获取友好名称或枚举转换,并通过比较CLSID查看该列表中的转换。