d3d与dshow兼容于一个应用程序中的问题

liaozongbin 2008-03-22 10:09:41
我初学directX编程,想在一个程序中实现对两个摄像头实时抓图,并且,后面要用D3D渲染骨骼动画。
首先,在一个程序写了对两个USB摄像头实时抓图,并用GDI函数在程序中显示。然后,另一个程序,是用d3d做的骨骼动画的渲染。这两个程序都运行正确。
现在问题是,当合并这两个模块后,程序中只能抓到一帧DSHOW捕捉的图像,以后便抓到的图像,用GDI函数显示在窗口,窗口上依然一片空白。保存抓取的位图时,图像有大小,却没有任何图像信息。
抓图模块,是这样做的。建立采集过滤器图,就一个capture filter, 一个sample grabber, 一个null renderer。DSHOW中默订两个线程在管理这两个过滤器图,这两个过滤图一直处于运行状态。然后,在主线程中,有一个定时器,每隔50ms便从两个sample grabber中抓取一帧图像。
过滤器图,应该是正确的,而且,一直处于运行状态是没问题的。因为当后面,过滤器图用的是video renderer时,我可以把filter graph中流动的图像,通过IVideoWindow接口,实时地显示在窗口中。
但问题,如果用null renderer,并从sample grabber接口中抓取,只能抓到一帧。以后再也抓取不到了。
我很想知道,是哪些原因引发上面的问题,是D3D的影响呢?还是其它的呢?

这个问题在另一个论坛也发了,但觉得可能发这个论坛可能比较合适,请版主谅解。
...全文
138 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
luor 2008-07-31
  • 打赏
  • 举报
回复
为了激活缓冲模式,我们调用IsampleGrabberr::SetBufferSample方法,参数填充TRUE。你也可以使用IsampleGrabber::SetOneShot方法,这样会导致每捕获一桢后过滤图形停止。这个特性对我们如果仅想在流里面捕获一桢的需求十分有益。我们可以搜索到想要捕获的地方运行过滤图形,进行截获。但是桢的精确度还是要靠数据源的性质决定。

liaozongbin 2008-03-23
  • 打赏
  • 举报
回复
先谢过rageliu的回复!
我再检查一遍我单独用dshow写的抓图模块!
rageliu 2008-03-23
  • 打赏
  • 举报
回复
使用null renderer,只是ds方面将数据直接丢弃,不会影响到sample grabber该filter处理数据的。
估计是你50ms一次的抓图写的有问题
rageliu 2008-03-23
  • 打赏
  • 举报
回复
使用了Sample grabber不是就能处理到所有的sample了吗

呵呵,d3d和ds一起使用是要做些处理的,不然编译过不了
liaozongbin 2008-03-23
  • 打赏
  • 举报
回复
这上帖子再等一天,然后,我就结帖。多谢rageliu的帮助!
liaozongbin 2008-03-23
  • 打赏
  • 举报
回复
上面写错了,应该是用SetBufferSamples函数设置了sample grabber使用缓冲模式。
然后,在OnTimer函数中用,GetCurrentBuffer方法得到最近的一帧图像。
结果是:只能得到一帧图像,以后得到的图像没有内容。
原因在哪?大侠能帮我分析一下吗?
liaozongbin 2008-03-23
  • 打赏
  • 举报
回复
由于,昨天我发现前面的问题后,不知如何下手。只有用另一个Grabber filter试试。
于是,我用了Dshow自带的Sample grabber filter.
我现在的测试结果是这样的,当我用Sample grabber时,确实只能抓取一帧图像。
因为,我现在用陆老师写的image grabber filter实时的抓取图像,并在应用程序的视中显示,已经正确。
所以,我不认为是,我的定时器机制出了问题。
我觉得,可能是我对于Sample Grabber的使用有问题。
我是这样使用Sample grabber得。在创建filter链路时,我就用ISampleGrabber接口中SetSampleBuffer方
法,当sample 流过sample grabber时,复制到一个buffer中。
然后,在OnTimer函数中,使用sample grabber中的GetSampleBuffer方法得到最近的一帧图像。
那么,结果就是,我只能得到一帧图像,以后得到的图像没有内容。
liaozongbin 2008-03-23
  • 打赏
  • 举报
回复
谢谢大侠的回复,现在这个系统又恢复正常了!
实际上,我现在使用的是DShow捕捉,其中Grabber模块,是陆其明老师在directShow实务精选中所用的.
也就是陆老师写的ImageGrabberFilter,我只是拿过来后,整合在我的系统中。
当然,我一开始,拿过来后,单独做一个模块测试,能否在主线程中用一个50ms的定时器,不断地从两个
用Dshow过滤器图处理的摄像头中实时捕捉到图像。这个模块是成功的。
然后,我把这个模块和我写的另外一个渲染骨骼动画的模块,组合在一起。
DShow模块使用的头文件是"DShow.h", <streams.h>以及<qedit.h>,在D3D中使用的是常用的<d3d.h>和
<d3d8.h>,以及链接它们对应的导入库文件。当编译时,我发现有错误。
上网查看,有高人说,只要在包含D3d的头文件前面加上#define __D3DRM_H__即可。我用过了,确实有用。
然后,运行时,发现,只有在OnTimer函数中抓取到一帧图像,后面抓到的图像没有任何内容,程序却说抓取正确。
因为我刚学了点用Dshow,对于,其内部的实现知之甚少。所以才发了上面那个帖。
今天,我再测试时,发现又通过了。我也不知道为什么,可能是摄像头的缘故吧!

2,554

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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