请问一下如何在程序中直接调用 dshow 输入图像

runrunrun 2004-07-24 01:22:05
Render Filter 是不是只能在 Filter 里调用,可以在程序里直接调吗?
比如我现在有一个bitmap缓冲区,想利用dshow显示,应该怎么做

还有一个问题: dshow的效率会比bitblt函数高很多吗?尤其是在30帧/秒,全屏显示的时候
...全文
177 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
happydeer 2004-07-28
  • 打赏
  • 举报
回复
这次可能被你“骗”过去了,但我还是不推荐这么用。如果以后出现无法预料到的问题,那就麻烦了,可能还要返工。
runrunrun 2004-07-28
  • 打赏
  • 举报
回复
不用建链路。 我想 Filter graph 能干的事的我也能干,后来我就做了一个IPin的派生类(其实里面什么事也没干),拿它去连接 VideoRender 的输入Pin , 就把VideoRender给'骗'过去了。

其实我对dshow也是初学,happydeer的那本书给了我不少帮助。 还希望以后能多指教
wl3c 2004-07-28
  • 打赏
  • 举报
回复
你获取IMemInputPin接口之前应该已经建好了Filter Graph链路了吧?!
happydeer 2004-07-28
  • 打赏
  • 举报
回复
呵呵,新鲜!
runrunrun 2004-07-28
  • 打赏
  • 举报
回复
还有可能是sampletime的begintime和endtime的问题。 我现在不想置同步,只想来一帧数据就显示一帧,是否可以

pMediaSample->SetTime( 0, 0 ); 把开始时间和结束时间都设成0

runrunrun 2004-07-28
  • 打赏
  • 举报
回复
现在还有一个问题:为什么我送去显示的图像只能显示第一帧,其实的图像只有在窗口重画的时候才显示(比如说把另外一个窗口从显示窗口上移开),

我猜有两种可能: 1. 同步时间 2. 关键帧

我用了下面两个函数,可是还不行,这是为什么呀

pMemAllocator->GetBuffer( &pMediaSample, 0, 0, AM_GBF_NOWAIT ) ;
pMediaSample->SetSyncPoint( TRUE ) ;

还有可能是什么原因呢?
happydeer 快来帮帮忙,我都快急死了



happydeer 2004-07-27
  • 打赏
  • 举报
回复
Filter不能脱离filter graph而独立使用!它不像DMO。directshow的video renderer会实用directdraw进行图像显示,效率自然比gdi函数高。
runrunrun 2004-07-27
  • 打赏
  • 举报
回复
UP
runrunrun 2004-07-27
  • 打赏
  • 举报
回复
谢谢你。不过我昨天忙到3点,终于做出来了。其实filter可以在应用程序中直接调用,
用下面的方法创建实例,
CoCreateInstance(CLSID_VideoRenderer, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&pVideoRender)

再想办法获取其IMemInputPin接口,直接把数据用 pMemInputPin->Receive(...) 传进去,发现居然也能显示,
但我发现用 VFW + VideoRender filter 显示的效率和 VFW + bitblt 居然是一样的,都占60% 的CPU,
然后我又用了 DivX decode filter + VideoRender Filter , 发现只占了 38% 的CPU, 真是怪事,看来瓶颈不是出在显示上,可能是在内部数据流的传输上吧


runrunrun 2004-07-24
  • 打赏
  • 举报
回复
还有,用DMO是不是可以做,我看了一下,好象机器里装的只有音频特效的DMO,没有关于video render 的

2,543

社区成员

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

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