从摄像机完成预览后,是否可以清除预览窗口?我使用MFCaptureEngine,调用m>SetRenderHandle(M_hwnd)来渲染视频。但是当我停止视频的时候,我不能在窗口上画画。摄像机还剩下最后一帧画面。我需要用黑色笔刷填充窗口并绘制一些文本,但相机中的图像不能透支。
发布于 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.
IMFMediaSink -例如MFCaptureD3D/device.cpp,并从回调IMFSample中绘制原始IMFSample致以问候。
发布于 2018-11-02 14:59:12
我是这样实现的:
// 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);但行为仍然是相同的(预览停止后无法重新绘制屏幕)。
https://stackoverflow.com/questions/53065677
复制相似问题