陆其明吧 关注:196贴子:6,653

请陆老师指点一下下,关于虚拟摄像头的实现。

只看楼主收藏回复

其实我觉得虚拟摄像头有点类似Source Filter,更确切的说应该是推模式的Source Filter,就好像SDK里面的那个Ball(弹球)例子一样。

我现在有几个问题不是很清楚,希望陆老师指点一下。
1.通常我们开发的Filter都在DirectShow Filters里面,而那些虚拟摄像头软件的Filter却和真实摄像头一样注册在Video Capture Source里面,请问它是怎么实现的?

2.通常我们开发的Filter都是通过CoCreateInstance函数创建的,而那些虚拟摄像头软件的Filter却和真实摄像头一样可以用IMoniker::BindToObject函数创建,请问它是怎么实现的?

我是顺着气味一路到此的,希望大家支持我。


1楼2006-06-10 19:01回复
    0. 是的,跟push source filter很像!
    1. 使用IFilterMapper2::RegisterFilter进行注册,filter category指定CLSID_VideoInputDeviceCategory即可。
    2. 通过枚举得到的Moniker应该都可以BindToObject来创建为filter。对于filter来说,不需要另外的实现


    2楼2006-06-10 20:07
    回复
      非常感谢陆老师这么及时的回复,在您的指点下,我已经成功的将Ball注册到了Video Capture Source里面,并且能够通过IMoniker::BindToObject创建Filter了。

      但是现在有一个小问题,描述如下。

      我直接使用IGraphBuilder::Render函数可以正常的建立Graph。
      但是用ICaptureGraphBuilder2::RenderStream却失败(参数分别为:&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pFilter, NULL, NULL),函数返回值为0x80070057。

      我通过GraphEdit查看Filter信息时,发现Pin的ClsPinCategory为{00000000-0000-0000-0000-000000000000},而不是PIN_CATEGORY_PREVIEW(fb6c4282-0353-11d1-905f-0000c0cc16ba),这也许就是问题所在!

      请问陆老师ClsPinCategory由注册时的哪个参数决定,或者说我怎样注册才能使ClsPinCategory变为PIN_CATEGORY_PREVIEW?

      再次感谢!


      3楼2006-06-11 10:20
      回复
        你要在output pin上实现IKsPropertySet接口,这样就能支持pin category


        4楼2006-06-11 10:52
        收起回复
          • 221.234.153.*
          陆老师,您的指点非常的精确,让我少走了不少弯路,由衷的感谢!

          请原谅我在此帖中再提最后一个问题(我看过“本吧内发帖注意...”,但是觉得再开一个帖不划算:)。

          为什么我在下面这个常量的初始化上,无论设置Pin的名字为什么,然后到GraphEdit里面查看,都会发现Pin的名字变成了"A Bouncing Ball!"呢?
          const AMOVIESETUP_PIN sudOpPin =
          {
           L"Output", // Pin string name
           ...
          };
          这个名字是怎么来的呢?代码里面压根都没有出现"A Bouncing Ball!"呀。

          麻烦陆老师给解释一下。

          (备注:我的Filter名字为"Bouncing Ball",会不会跟这个有关系?)


          5楼2006-06-11 14:15
          回复
            怎么变成匿名发表了?


            6楼2006-06-11 14:19
            回复
              你在所有文件里找一下"A Bouncing Ball!"这个字符串不就知道了


              7楼2006-06-11 15:10
              回复
                啊。。。
                哇塞。。。
                好糗啊。。。
                伤自尊啊。。。

                m_paStreams[0] = new CBallStream(phr, this, L"A Bouncing Ball!");

                原来在这里,我倒。。。

                谢谢陆老师提醒,这个帖子就到这里了,以后我会常来的


                8楼2006-06-11 16:03
                回复
                  • 219.134.112.*
                  陆老师,你好,想问你一问题.

                  就是在移动平台 windows mobile 2003 怎么样去捕获一个捕获摄像头数据?


                  9楼2007-01-23 14:46
                  回复
                    • 219.133.40.*
                    好奇怪的现象,我按照上述思路实现了一个虚拟摄像头。一切都正常。acmcap.exe、graphedit、QQ聊天等都正常。但我试图用Flash捕获摄像头驱动时却不成功。不知Flash对摄像头有什么特殊要求否?
                    wxd@tencent.com


                    10楼2007-05-17 22:09
                    收起回复
                      • 218.19.231.*
                      我修改Ball,继承IAMStreamConfig跟IKsPropertySet并注册到video capture source里,skype,qq都可以检测到,qq可以实现视频通讯。目前存在以下问题请大家帮忙看看:
                      1,暴露IAMStreamConfig跟IKsPropertySet接口后,用AMCAP可以启动视频,但关闭时在SAFE_RELEASE(gcap.pVSC);删除IAMStreamConfig对象出错。这可能时因为IAMStreamConfig的实现我目前是简单的返回值,不使用IAMStreamConfig的话运行不会出错。
                      2,球运动速度很快。
                      3,GraphEdt显示的filter graph不完全,没有我注册的正在使用的ball filter。
                      4,ball filter用VMR render出错。
                      5,这些错误有的可能跟IUnKnown接口有关,AddRef() ,Release(),QueryInterface应该如何实现?曾照着directshow事务竞选DES扩展source例子改写但运行出错。


                      11楼2007-06-07 17:06
                      回复
                        • 58.47.3.*
                        不好意思打搅大家了。俺什么函数都不懂,俺确实遇到了难题,反正帮谁都是帮,帮忙不用看人吧!多积一份德,会多一份好运的。
                         其实对于各位高手应该是小菜一叠,就是我的电脑安装了好几个虚拟摄相头,现在好多设备找不到真正的USB摄相头了。我把虚拟摄相程序都完美卸载了,但是还是一样,问题没有得到解决,老是那个注册页面。我想全部卸掉。谢谢!
                         ■ 多谢好心的人,给我发邮件:jim130@126.com

                         ■ 最后再次感谢!


                        12楼2007-08-08 11:35
                        回复
                          • 218.19.64.*
                          "你要在output pin上实现IKsPropertySet接口,这样就能支持pin category。"

                          实现IKsPropertySet接口是什么做?让pin继承IKsPropertySet吗?


                          13楼2007-10-16 12:24
                          回复
                            谢谢陆老师之前给其他网友的指点。我也按照以上提示,调试成功了Ball in Virtual WebCam。

                            13楼的朋友:
                            在自定义CSourceStream上实现IKsPropertySet接口需要如下工作:
                            1、在自定义类上多重继承IKsPropertySet接口
                            2、在类定义内加入宏DECLARE_IUNKNOWN
                            3、加入三个INonDelegatingUnknown函数(QueryInterface, Addref, Release)
                            4、加入并实现IKsPropertySet接口。


                            14楼2008-06-07 15:11
                            收起回复
                              • 218.19.231.*
                              但是这样做出来的虚拟摄像头似乎不被netmeeting跟windows xp自带的windows messenger识别?!


                              16楼2008-06-10 16:17
                              回复