与大家讨论一下在视频上叠加透明窗口后闪烁的问题

Ice 2012-05-09 11:22:50
公司作了限制,代码和图片都发不出来,请大家耐心往下看。

RT,当视频处于播放状态时,在视频上画一些图案,如多边形,矩形等,对画出的图形还要实现拖动操作。所以需要响应BUTTONUP,BUTTONDOWN 消息来画图,MOUSEMOVE消息来进行图像拖动。

既定的方案是在录像上叠加一个完全透明的窗口,把鼠标画图的操作在内存设备中响应,完了再画到透明窗口上去,透明窗口只画了多边形线框,其余部分都是透明的,可以看到视频。
功能都实现了,但是透明窗口的闪烁很严重,可以看到明显的跳变。

这个问题我查了几天了,我觉得是这样的:录像是用DSHOW显示的,录像播放时窗口应该是处于不断重绘的状态,而透明窗口和视频窗口处在同一块区域,录像重绘的时候把透明窗口给画掉了,从而导致透明窗口接着重绘,透明窗口重绘又改变了录像的区域,不停循环,就会出现透明窗口闪烁的情况。

有几点需要注意的是:
1. 画图是在透明窗口的OnPaint 中画的,但这不是闪烁的原因。
2. 录像和透明窗口在完全重叠的,所以录像窗口更新应该会导致透明窗口必然的重绘。


我试过了几种方法,比如设置WS_CLIPSIBLINGS,WS_CLIPCHILDREN属性,把该窗口设置成前台窗口,把整块录像区域用ExcludeClipRect 限制更新,结果是:
1.设置WS_CLIPSIBLINGS,WS_CLIPCHILDREN属性,把该窗口设置成前台窗口照样闪烁。
2.用ExcludeClipRect 限制更新,我想要画的图形也不会在窗口上显示了,只能看到录像。
3.我把透明窗口往上移一点,在录像窗口之外的图形不会闪烁,在录像范围内的不停闪。

我的分析结果是通过这些实验看出来闪烁实际是录像更新引起的。但是我没做过DSHOW,不懂DSHOW的显示机制,希望了解这块的朋友指出我分析中的不足,谢谢!另外我想要实现的这个效果,大家有好的建议请尽管提。如果实在是不能在上层做处理的话,我估计只能把想画的位图跟录像叠加,直接在DSHOW里面的来做了。
...全文
539 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mrlgy 2014-02-08
  • 打赏
  • 举报
回复
大哥,这个闪烁怎么解决啊?
sogarme 2013-11-06
  • 打赏
  • 举报
回复
我这里的现象是视频流分辨率如果和视频窗口不一样大时,其他透明窗口重叠在视频区会出现闪烁,一样大时就没闪了; 比如 320x240的视频输入到322x240的视频区域会出现这种现象,两个都是320x240时就没这种问题了
sogarme 2013-11-05
  • 打赏
  • 举报
回复
这个要怎么弄;透明窗体在视频区狂闪
hjshow 2013-07-03
  • 打赏
  • 举报
回复
最后怎么解决的啊
王正南 2013-05-09
  • 打赏
  • 举报
回复
ddraw或者gdi绘制会一直闪
王正南 2013-05-09
  • 打赏
  • 举报
回复
用D3D overlay 就不会闪
王正南 2013-05-09
  • 打赏
  • 举报
回复
我弄了满终于ok了
germ_da 2012-12-24
  • 打赏
  • 举报
回复
同样的问题啊,一个星期了,无解啊! 恶心的是xp下面运行不会闪烁,一上win7就狂闪~
微wx笑 2012-07-10
  • 打赏
  • 举报
回复
如果是比较小的窗口的话,闪烁还 可能接受,不是那么严重,
但窗口比较大的话,就闪的特别的厉害!
微wx笑 2012-07-10
  • 打赏
  • 举报
回复
我也遇到了同样的问题,求解
公元1988年 2012-07-03
  • 打赏
  • 举报
回复
这个应该是跟视频的渲染器有关,你的视频链路最后应该是用了VMR9去渲染了吧?
如果是在XP下,把渲染改为VMR7,如果是在Vista或win7下,改为EVR
Ice 2012-05-23
  • 打赏
  • 举报
回复
貌似是MS的BUG,直接结帖了。。。

15,981

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧