防止视频过度绘制窗口背景

Posted

技术标签:

【中文标题】防止视频过度绘制窗口背景【英文标题】:Prevent video from overdrawing window background 【发布时间】:2020-08-29 14:52:48 【问题描述】:

我有一个 640x480 大小的窗口。我想在该窗口的左上角放置一个 100x100 大小的视频。所以我这样做:

RECT r;

r.left = 0;
r.top = 0;
r.right = 100;
r.bottom = 100;

m_pVideoDisplay->SetVideoPosition(NULL, &r);

这会正确地将视频放在左上角并将其缩放到 100x100 像素,但由于某种原因,Media Foundation 视频渲染器也会填充我的窗口中被现在黑色的视频。我怎样才能阻止它这样做?我已经明确告诉IMFVideoDisplayControl 只绘制到我的窗口左上角的 100x100 像素。但它仍然用黑色填充了我窗口的剩余空间!我可以做些什么来让 Media Foundation 不触摸我的窗口的其余部分?

我的WM_PAINT 看起来像这样:

GetClientRect(hwnd, &rc);
BeginPaint(hwnd, &ps);      
FillRect(ps.hdc, &rc, GetStockObject(WHITE_BRUSH));         
m_pVideoDisplay->RepaintVideo();
EndPaint(hwnd, &ps); 

我希望所有未被视频占用的窗口空间都是白色的,而是黑色的。

我也尝试过这样做,但也没有用:

m_pVideoDisplay->SetRenderingPrefs(MFVideoRenderPrefs_DoNotRenderBorder);

有什么想法吗?谢谢!

【问题讨论】:

问题中的代码无法帮助我重现您的问题。请提供可重现的代码示例。 【参考方案1】:

要回答我自己的问题,这里的技巧是简单地使用CreateWindowEx() 将子窗口添加到我的父窗口,并通过调用IMFVideoDisplayControlSetVideoWindow() 让Media Foundation 渲染到子窗口而不是父窗口。然后就不会再透支了,一切都很好。我什至不必再使用SetVideoPosition(),因为我可以通过在子窗口上调用普通的MoveWindow() Win32 API 来简单地移动视频(或应用缩放)。这真的很顺利。

【讨论】:

以上是关于防止视频过度绘制窗口背景的主要内容,如果未能解决你的问题,请参考以下文章

防止过度工程

防止 AVPlayer 取消背景音频

防止网页“过度滚动”

调整大小时防止 TPaintBox 闪烁

K-Fold 如何防止模型中的过度拟合

使用 AVPlayer 时防止背景音频静音