替代在Directshow中使用ISpecifyPropertyPages的替代编程方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了替代在Directshow中使用ISpecifyPropertyPages的替代编程方式相关的知识,希望对你有一定的参考价值。
首先,我对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;
}
问题是,这是一个按钮,当您单击它时,它会创建一个窗口,其中包含我不需要访问的摄像机设置的某些属性。基本上有两个问题。首先,我不需要创建窗口,只想以编程方式访问值,其次,我只想访问此属性页中值的特定部分。有办法吗?
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
,使属性在外部可用。
以上是关于替代在Directshow中使用ISpecifyPropertyPages的替代编程方式的主要内容,如果未能解决你的问题,请参考以下文章
WebRTC Windows Native视频中的DirectShow介绍
同时使用 DirectShow 播放多个 wav 文件并记录它们 C++