替代在Directshow中使用ISpecifyPropertyPages的替代编程方式

问题描述 投票:1回答:1

首先,我对DirectShow的内容感到恐惧。我几乎不知道它是如何工作的。而且我正在尝试从称为关注区域x和y的摄像机访问此“值”,至少这是该摄像机随附的Camera程序中所谓的值。基本上,它会将摄像机的视图从左到右或从上到下移动(摄像机不会实际移动)。问题是我在Directshow中找不到该方法。

但是幸运的是,我遇到了一个带有源代码的程序,该程序可以使用DirectShow来访问此值。因此,查看完代码后,我发现了它,代码看起来像这样。.

case IDC_DEVICE_SETUP:
{
    if(gcap.pVCap == NULL)
        break;

    ISpecifyPropertyPages *pSpec;
    CAUUID cauuid;
    hr = gcap.pVCap->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pSpec);
    if(hr == S_OK)
    {
         hr = pSpec->GetPages(&cauuid);
         hr = OleCreatePropertyFrame(ghwndApp, 30, 30, NULL, 1,
                        (IUnknown **)&gcap.pVCap, cauuid.cElems,
                        (GUID *)cauuid.pElems, 0, 0, NULL);
         CoTaskMemFree(cauuid.pElems);
         pSpec->Release();
    }
    break;
}

问题是,这是一个按钮,当您单击它时,它会创建一个窗口,其中包含我不需要访问的摄像机设置的某些属性。基本上有两个问题。首先,我不需要创建窗口,只想以编程方式访问值,其次,我只想访问此属性页中值的特定部分。有办法吗?

c++ camera directshow
1个回答
3
投票

IAMCameraControl界面似乎离您想要的东西最近,但这并不是您想要的。我不记得有一个标准的DirectShow接口可以满足您的要求。

您在IBaseFilter中看到的属性页是由过滤器的驱动程序实现的。驾驶员可以根据内部接口的所有知识自由地做他想做的任何事情。无需向外部用户展示这些接口。如果您很幸运,那么相机供应商的属性页正在使用供应商愿意记录的COM接口,以便您可以使用它。

因此,我会问相机供应商是否提供了您可以使用的官方COM接口。如果没有,您可以尝试对他们的工作进行逆向工程(不是那么容易),并希望他们不要在下一个软件版本中更改界面。

关于评论中给出的一般性问题:

COM是一个编程接口,它定义了如何创建对象,如何定义这些对象的接口(例如方法)以及如何在对象上调用方法。

DirectShow基于COM。 DirectShow定义了几个COM接口,例如IFilterGraph,作为您使用的所有设备和筛选器的容器。 DirectShow定义的另一个COM接口是IBaseFilter,它是您可以使用的所有过滤器(设备,转换过滤器)的基本接口。

个别的COM对象有时由DirectShow实现,但是设备特定的对象(如捕获设备的IBaseFilter由硬件供应商提供的某些DLL实现。

在您的情况下,gcap.pVCap是捕获设备的IBaseFilter接口。在COM对象中可以实现多个接口。如果您的代码支持接口QueryInterface,则将查询pVCap(ISpecifyPropertyPages)。在这种情况下,将创建OlePropertyFrame,该OlePropertyFrame显示由相机对象实现的属性页。完全控制转到实现ISpecifyPropertyPages接口的相机对象。当照相机对象显示属性页面时,它可以直接访问其自己的属性。但是它还可以通过导出另一个接口,例如IMyCameraSpecificInterface,使属性在外部可用。

© www.soinside.com 2019 - 2024. All rights reserved.