c++ - 如何在 Windows 桌面应用程序的 MediaFoundation SourceReader 中使用英特尔硬件 MJPEG 解码器 MFT?

标签 c++ video ms-media-foundation mjpeg

我正在使用 MediaFoundation SourceReader 技术开发 USB 摄像头流式桌面应用程序。该相机支持 USB3.0,并为 1080p MJPG 视频格式分辨率提供 60fps。

我用Software MJPEG Decoder MFT把MJPG转成YUY2帧,再转成RGB32帧画在窗口上。使用此软件解码器时,我只能在窗口上渲染 30fps,而不是 60fps。我已在此站点上发布了一个问题,并获得了一些使用英特尔硬件 MJPEG 解码器 MFT 解决丢帧问题的建议。

我在调用 IMFTransform::ProcessInput() 方法时遇到错误 0xC00D36B5 - MF_E_NOTACCEPTING。为了解决这个错误,MSDN 建议异步使用 IMFTranform 接口(interface)。因此,我使用 IMFMediaEventGenerator 接口(interface)为每个 In/Out 样本获取 GetEvent。成功后,我只能处理一个输入样本,然后连续 IMFMediaEventGenerator::GetEvent() 方法返回 MF_E_NO_EVENTS_AVAILABLE 错误(GetEvent() 是同步的)。

我已尝试为 SourceReader 和 IMFTransform 配置异步回调,但未调用 MFAsyncCallback::Invoke 方法,因此我计划使用 GetEvent 方法。

我是否遗漏了什么?如果是,有人指导我在我的项目中使用英特尔硬件解码器吗?

最佳答案

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

当您使用像我们的源阅读器媒体 session 这样的 API 时,媒体基金会本身会处理 MFT。它能够在适当的时候进行同步和异步消费。但是,在这种情况下,您不会执行 IMFTransform 调用,甚至从您模糊的描述来看,您的做法是错误的。

关于c++ - 如何在 Windows 桌面应用程序的 MediaFoundation SourceReader 中使用英特尔硬件 MJPEG 解码器 MFT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42028159/

相关文章:

c++ - SSE 和 iostream : wrong output for floating point types

c++ - WMAV2 MFT编码器

video - 如何在网站上提供不同格式的视频流选项

javascript - WebRTC 一个候选事件

javascript - HTML5字幕可以用css定位吗?

c++ - 如何使用 Microsoft Media Foundation 将原始 48khz/32 位 PCM 编码为 FLAC?

c++ - 更正实时 IMFMediaSource 时间戳

c++ - 是否允许在 const 定义的对象上丢弃 const 只要它实际上没有被修改?

C++:调用 OBJ、OBJ&、const OBJ& 时实现不同的方法

C++ BOOST 库和捆绑属性