【问题标题】:How to instantiate H264 Encoder on WinRT Store App如何在 WinRT Store App 上实例化 H264 编码器
【发布时间】:2017-03-13 06:41:50
【问题描述】:

我希望能够使用 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 做到这一点?

【问题讨论】:

  • 嗨,我不能给你正确的建议,但是当我面临类似的问题时,我决定使用下一个技巧Using Free-COM DLL in Windows Store C++ Project。想法是从 Windows 桌面版本的 WindowsStore 应用程序代码中可能调用一些 COM DLL。它不适用于 Windows WinRT,但具有此类 Windows 版本的设备数量非常少。此解决方案不适用于通用应用 - 仅适用于桌面。
  • 嗨@EvgenyPereguda,谢谢。知道我可以免费加载 COM 很有趣。但我真的需要这个用于移动设备。我知道我可以为移动设备编码的唯一方法是使用 Sink Writer,但这给了我文件格式(比如 mp4)的开销。我真的很想从IMFTransform::ProcessOutput 中获取样本以使用...

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


【解决方案1】:

首先使用MFCreateSinkWriterFromURL 创建文件写入器。然后,使用MFCreateMediaType 创建一个 IMFMediaType。设置其属性,其中之一将是输出格式:对具有 MF_MT_SUBTYPE guid 的媒体类型使用 SetGUID 方法,并指定 MFVideoFormat_H264 作为参数。最后,在 sink writer 上使用AddStream 方法来设置它的媒体类型。

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

【讨论】:

  • 谢谢!我现在实际上正在这样做,但问题是我没有得到编解码器输出样本,它只是保存到已经格式化为文件(例如 mp4)的流中。我需要的是通过实例化编解码器的 IMFTransform 可以在桌面上获取的视频示例。
【解决方案2】:

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

问候, 叶夫根尼·佩雷古达

【讨论】:

  • 这个答案毫无意义。 CoCreateInstance 是一个创建 COM 对象而不是 Windows 运行时对象的函数。它失败的实际原因是该类不适用于 Windows 应用商店应用程序。不过,有许多可用的 COM 类并没有实现 IInspectable。
  • 我已经写过可以通过Using Free-COM DLL in Windows Store C++ Project. 创建 COM 对象但是,Joao Carrion 尝试从 WindowsStore 的上下文中使用 CMSH264EncoderMFT,例如可访问的 GUID。我指出在 WinRT 环境中使用 Free-COM 是不可能的,因为它是特定平台的层次抽象。
  • 嗨@EvgenyPereguda,你是说我需要实现一个IMFMediaSink,而且,我假设,可能还有一个IMFStreamSink 能够从H264 编解码器获取输出帧?我现在正在研究,但是如果您不想执行标准的文件写入,从文件路由播放,那么文档会很混乱。
  • 嗨,我可以说 Media Foundation 是一个复杂的框架,但它只是在WiindowsStore 应用程序中处理视频的一种方式。关于IMSMediaSink 的实施 - 我可以建议研究WindowsSDK7 Samples - 它包括WavSink Sample 示例代码。它是 Windows 7 的示例,但它可以适用于 WiindowsStore 应用程序,它只包含 3 个文件 - 更容易研究。
猜你喜欢
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
相关资源
最近更新 更多