另一种方法程序而不是DirectShow中使用ISpecifyPropertyPages(Alter

2019-10-20 08:37发布

要开始了,我在这DirectShow的东西太可怕了。 我几乎不知道它是如何工作的。 我试图从一个这就是所谓的利益x和y的区域相机访问此“值”,至少这就是它被称为在相机随附的相机程序。 基本上,它从左向右或从上到下(相机未实际移动)的摄像机的视图。 问题是我无法找到该怎么做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;
}

问题是,这种它的一个按钮,当你点击它,它会创建一些我不需要访问摄像机设置的属性的窗口。 基本上,有两个问题。 首先,我不需要想创建一个窗口,我只是想以编程方式和第二访问值,我只想从这个属性页面访问值的特定部分。 有没有办法做到这一点?

Answer 1:

该IAMCameraControl接口似乎最近来找你想要的东西,但它不正是你想要的。 我不记得有一个标准的DirectShow接口,你想要做什么。

您将看到IBaseFilter的属性页是由驱动程序的过滤器来实现。 该驱动器可以自由地做任何他想做的有关内部接口的所有知识。 没有必要将这些接口展现给外部用户。 如果你是幸运的,然后相机厂商的属性页使用COM接口,供应商愿意文件,这样就可以使用它。

所以,如果他们提供,你可以使用一个官方的COM接口我想请相机销售。 如果他们不这样做,你可以尝试反向工程他们做什么(不那么容易),并希望他们不改变下一个软件版本的界面。

至于在评论中给出的一般问题:

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

DirectShow的基于COM。 DirectShow的定义就像几个COM接口IFilterGraph为您使用的所有设备和过滤器的容器。 通过DirectShow中定义的另一个COM接口是IBaseFilter这是所有过滤器(设备,转换过滤器),你可以使用的基本接口。

单个COM对象是由DirectShow中有时执行,但像设备的特定对象IBaseFilter为您的拍摄设备是由硬件供应商所提供的一些DLL中实现。

你的情况gcap.pVCapIBaseFilter接口捕获设备。 在COM对象可以实现多个接口。 在你的代码pVCap查询( QueryInterface ),如果它支持接口ISpecifyPropertyPages。 如果是这种情况,则OlePropertyFrame被创建,其显示由所述相机对象实现的属性页。 完全控制转到这是实现ISpecifyPropertyPages接口的相机对象。 当相机对象显示属性页可以直接访问它自己的特性。 但它也可以通过以下方式像另一个界面,使性能获得外部IMyCameraSpecificInterface



文章来源: Alternative way to program instead of using ISpecifyPropertyPages in Directshow