2017-02-03 151 views
2

我正在开发使用MediaFoundation SourceReader技术的USB摄像头流式桌面应用程序。该相机具有USB3.0支持,并可提供60fps的1080p MJPG视频格式分辨率。如何在MediaFoundation SourceReader for Window Desktop应用程序中使用Intel硬件MJPEG解码器MFT?

我使用的软件解码器MJPEG MFT到MJPG转换为YUY2帧,然后转换成RGB32帧来绘制窗口上。在使用这个软件解码器时,我能够在窗口上只渲染30fps,而不是60fps。我在这个网站上发布了一个问题,并得到了一些建议,使用英特尔硬件MJPEG解码器MFT来解决帧丢失问题。

我所面临的误差0xC00D36B5 - 调用IMFTransform :: ProcessInput()方法时MF_E_NOTACCEPTING。为了解决这个错误,MSDN建议异步使用IMFTranform接口。所以,我用IMFMediaEventGenerator接口GetEvent为每个输入/输出示例。成功,我只能处理一个输入样本,然后连续IMFMediaEventGenerator :: GetEvent()方法返回MF_E_NO_EVENTS_AVAILABLE误差(GetEvent()是同步的)。

我试着为SourceReader配置异步回调以及IMFTransform,但是MFAsyncCallback :: Invoke方法没有调用,因此我计划使用GetEvent方法。

我缺少什么吗?如果是,有人引导我使用英特尔硬件解码器到我的项目?

+0

你试过先组装在topoedit拓扑? – Mgetz

+0

感谢您的回复,Mgetz。相机支持YUY2和MJPG视频格式。最初,相机播放YUY2视频格式并需要更改MJPG格式。我知道如何在DirectShow中构建图形。我不知道如何从YUY2切换到MJPEG视频格式。请问如何为MJPG格式组装拓扑?而且,我在MediaSession拓扑中添加了这个解码器,一切都成功了,并且在事件中收到了0XC00D5212(MF_E_TOPO_CODEC_NOT_FOUND)。 – Abi

+0

因此,建议尝试使用SDK附带的topoedit实用程序来组装拓扑并测试它的工作原理。如果你不能在拓扑中构造一个拓扑......这可能是不可能的。 – Mgetz

回答

1

英特尔硬件MJPEG解码器MFT是一个asynchronous MFT,如果你是直接管理它,你有责任运用异步模型。你似乎正在这样做,但你不提供能够解决问题的信息。是的,您应该使用上面链接文章的ProcessInput,ProcessOutput部分中描述的事件模型。当你得到第一帧时,你应该进一步调试,以使其能够顺利连续处理。

当您使用API​​,如媒体会话我们的源代码的读者,你有媒体基金会本身处理与MFTS。在适当的情况下,它可以进行同步和异步消费。然而,在这种情况下,你不需要做IMFTransform的调用,甚至从你模糊的描述中可以看出你做错了。

+0

谢谢你纠正我的错误,罗马。我注册了一个异步回调,并尝试获取异步事件,但我没有从IMFAsyncCallback :: Invoke()获取任何事件。您能否告诉我如何为SourceReader注册异步回调并访问硬件MFT? – Abi

+0

我已成功为MFT注册IMFAsyncCallback回调。我收到MFTransformNeedInput事件来处理输入采样两次,但MFTransformHaveOutput事件根本不被调用。我在我的项目中附加了我正在使用的代码。 PFA dropbox链接来查看我的代码:https://www.dropbox.com/s/t6figfl9b2kyp6y/HwMJPEGDecoderMFT_Code_Query.txt?dl=0。我在我的代码中注释了ProcessOutputSample()方法并进行了检查,连续不断地接收MFTransformNeedInput事件类型。你能告诉我什么是做错了,为什么我没有收到ProcessOutputSample? – Abi

+0

@Aikaika:这只是一段代码,我不喜欢那里的一些时刻,但更重要的是它不是可运行的,我不确定是什么导致了原始问题。我绝对不喜欢你从一个由关键部分保护的代码片断顺序执行'WaitForSingleObject'的方式。 –

相关问题