如何在WinRT Store App上实例化H264编码器

时间:2017-03-09 20:30:32

标签: windows-runtime h.264 video-encoding wrl

我希望能够使用Media Foundation IMFTransform对H264视频编码对视频帧进行编码。这在Win32中很容易实现,您可以使用MFTEnumEx枚举变换并找到H264编码器。

然而,在WinRT(商店应用程序)上,我找不到实例化的方法。 我注意到有一个类CMSH264EncoderMFT,但是没有在CoCreateInstance上使用的CLSID的定义。

使用:

CoCreateInstance(CLSID_CMSH264EncoderMFT, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IUnknown), (void **)&pUnknown);

对于WinRT应用程序,未定义CLSID_CMSH264EncoderMFT。

并尝试过:

ComPtr<CMSH264EncoderMFT> encoder = Make<CMSH264EncoderMFT>();

它说类CMSH264EncoderMFT不完整,并说“使用未定义类型'CMSH264EncoderMFT'”。甚至不知道Make的语法是正确还是合适......

有没有人知道如何为WinRT做这个?

2 个答案:

答案 0 :(得分:0)

首先使用MFCreateSinkWriterFromURL创建文件编写器。然后,使用MFCreateMediaType创建IMFMediaType。设置其属性,其中一个将是输出格式:使用MF_MT_SUBTYPE guid在媒体类型上使用SetGUID方法,并指定MFVideoFormat_H264作为参数。最后,在接收器编写器上使用AddStream方法将介质类型设置为它。

有一个例子here(当你设置MF_MT_SUBTYPE时,你需要稍微修改一下)。

答案 1 :(得分:-1)

你无法通过CMSH264EncoderMFT实例化对象,因为它没有一些必须在WinRT中具有对象的接口,例如IInspectable - Provides functionality required for all Windows Runtime classes。 CMSH264EncoderMFT不是WinRT类。您可以尝试按功能MFCreateSinkWriterFromMediaSink解决您的任务 - 此函数接受带有接口IMFMediaSink的对象。可以使用IMFMediaSink接口为对象编写代码,并从IMFTransform::ProcessOutput接收样本。我只是提请你注意 - 你不能在不是Windows运行时类的WindowsStore代码对象中实例化。

此致 Evgeny Pereguda