首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清除media foundation中的预览窗口

清除media foundation中的预览窗口
EN

Stack Overflow用户
提问于 2018-10-30 21:42:22
回答 2查看 291关注 0票数 1

从摄像机完成预览后,是否可以清除预览窗口?我使用MFCaptureEngine,调用m>SetRenderHandle(M_hwnd)来渲染视频。但是当我停止视频的时候,我不能在窗口上画画。摄像机还剩下最后一帧画面。我需要用黑色笔刷填充窗口并绘制一些文本,但相机中的图像不能透支。

EN

回答 2

Stack Overflow用户

发布于 2018-10-31 08:13:28

从你的回答中不清楚它是MFCaptureManager是什么,但是通过代码SetRenderHandle(m_hwnd)我看到你使用IMFCapturePreviewSink::SetRenderHandle。所以,我可以说,我以前也遇到过类似的问题,这与WinXP的旧窗口系统和现在的Vista窗口系统之间的差异有关。代码通过调用IMFCapturePreviewSink::SetRenderHandle (对于IMFCapturePreviewSink,它是DirectX11 )将窗口上下文设置给渲染器,并且DirectX11拥有对窗口的完全访问权限,并且切换到当前窗口系统。因此,任何由Win95-XP生成的旧Windows API完成的调用fill the window by black brush and draw some text都不会做任何事情-因为窗口处理程序上下文被DirectX11锁定。

解决这个问题有三种方法:

使用新的基于IMFCapturePreviewSink::SetRenderSurface.

  • Create的Microsoft编写新的UI,并通过

  • Create代码中设置此IMFMediaSink -例如MFCaptureD3D/device.cpp,并从回调IMFSample中绘制原始IMFSample

致以问候。

票数 1
EN

Stack Overflow用户

发布于 2018-11-02 14:59:12

我是这样实现的:

代码语言:javascript
复制
// Sink
CComPtr<IMFCaptureSink> pSink;
m_pEngine->GetSink(MF_CAPTURE_ENGINE_SINK_TYPE_PREVIEW, &pSink);

CComPtr<IMFMediaSink> pCustomSink;
::MFCreateVideoRenderer(IID_IMFMediaSink, (void**)&pCustomSink);

CComPtr<IMFCapturePreviewSink> pPreviewSink;
pSink.QueryInterface(&pPreviewSink);
pPreviewSink->SetCustomSink(pCustomSink);

// preview
pSink.QueryInterface(&m_pPreview); // or pPreviewSink.QueryInterface(&m_pPreview)
m_pPreview->SetRenderHandle(m_hwndPreview);

但行为仍然是相同的(预览停止后无法重新绘制屏幕)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53065677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档