我想要使用DirectShow的IAMVideoProcAmp获得对IAMVideoProcAmp的低级别访问。
有几个Python模块(pywin32
、pywintypes
、comtypes
、win32com
、pythoncom
)是在这个上下文中使用的,它们似乎有某种联系。但我不知道从哪里开始。
我找到了一些示例(这里、这里、这里),但是我想不出如何获得IID / CLSID来使用
import win32com.client
clsid='{9BA05972-F6A8-11CF-A442-00A0C90A8F39}'
ShellWindows=win32com.client.Dispatch(clsid)
或者有一个清晰的名字
import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
或
from comtypes import client, GUID
graph = client.CreateObject(some_CLSID)
graph.QueryInterface(...)
有人能帮我吗?
我找到了另一个示例(dshow.py),但是它有一些我找不到的依赖项(interfaces
,uuids
)。
来自Microsoft的这页面列出了以下步骤
在捕获过滤器上为QueryInterface接口调用IAMVideoProcAmp。
或
查询IAMCameraControl的捕获筛选器。
并为此说明了一些C++代码:
// Query the capture filter for the IAMVideoProcAmp interface.
IAMVideoProcAmp *pProcAmp = 0;
hr = pCap->QueryInterface(IID_IAMVideoProcAmp, (void**)&pProcAmp);
hr = m_pProcAmp->GetRange(VideoProcAmp_Brightness, &Min, &Max, &Step,
&Default, &Flags);
编辑:我终于找到了一些看起来不错的代码:
它似乎完成了我试图编写的内容,并使用了DirectShow (请看这里)中的一些元素:
from comtypes.gen.DirectShowLib import (FilterGraph, CaptureGraphBuilder2, ...)
jaraco.video声称是“使用ctype和comtype的纯VideoCapture模块的一个端口”。
它使用一个DirectShow.tlb
文件(不管是什么)将这些定义导入共形。
类型库(.tlb)是一个二进制文件,它将有关COM或DCOM对象的属性和方法的信息存储在运行时其他应用程序可访问的表单中。
发布于 2018-10-04 13:59:55
我终于找到了一个正在工作的示例库:
它完成了我想要实现的功能,并使用了DirectShow (请看这里)中的一些元素:
from comtypes.gen.DirectShowLib import (FilterGraph, CaptureGraphBuilder2, ...)
jaraco.video声称是“使用ctype和comtype的纯VideoCapture模块的一个端口”。
它使用一个DirectShow.tlb
文件(不管是什么)将这些定义导入共形。
类型库(.tlb)是一个二进制文件,它将有关COM或DCOM对象的属性和方法的信息存储在运行时其他应用程序可访问的表单中。
这些导入是在__init__.py
中自动生成的,可以很容易地使用:
from api.objects import ..., IMediaControl, IAMVideoProcAmp, IAMCameraControl, ...
并且可以使用
def _get_camera_control(self):
return self._get_graph_builder_interface(IAMCameraControl)
def get_camera_control_property(self, i):
video_properties = self._get_camera_control()
return video_properties.Get(i)
然后,您可以将这些函数与文档中所述的enum
结合使用。
# CameraControl_Exposure = 4
print(d.get_camera_control_property(4))
发布于 2018-08-15 10:22:27
标识复制代码所需的值
再看一看文章末尾的代码摘录,我就会发现,为了获取IAMVideoProcAmp
的一个实例,您只需要IID,而不需要CLSID。
查看这个strmif.h的来源的第8733行(作为接口所需的头),我发现IID_IAMVideoProcAmp
是C6E13360-30AC-11d0-A18C-00A0C9118956
。
在strmif.h的这一节上,您可以识别哪些整数对应于tagVideoProcAmpProperty
枚举中的哪些属性,例如0
for VideoProcAmp_Brightness
。在strmif.h的这一部分下面,您可以识别哪些整数对应于IAMVideoProcAmpVtbl
VTable中的哪些函数,例如3
for GetRange
。我不熟悉如何在Python中与COM对象交互,但在Java中,您需要确定这些属性和函数索引,以便复制演示如何获取IAmVideoProcAmp
实例的IAmVideoProcAmp
代码摘录。
获取IAMVideoProcAmp
实例
正如您可能已经注意到的,C++代码摘录调用了名为pCap
的内容的QueryInterface
,并注意到您需要“查询捕获筛选器以获取IAMVideoProcAmp接口”。你链接到的这篇文章的兄弟姐妹解释了如何做到这一点:
要为设备创建一个DirectShow捕获过滤器,请调用IMoniker::BindToObject方法来获得一个IBaseFilter指针。然后调用IFilterGraph::AddFilter将过滤器添加到筛选图中: IBaseFilter *pCap = NULL;hr = pMoniker->BindToObject(0,0,IID_IBaseFilter,(void**)&pCap);如果(成功( hr )){hr= m_pGraph->AddFilter(pCap,L“捕获过滤器”)};
现在您已经知道了如何获取pCap
,您注意到您需要一个名为pMoniker
的东西,这是在同一篇文章前面定义的。代码相当长,所以我省略在这里。
所有这些都是用Python完成的
正如我前面提到的,我从来没有使用过任何Python库,所以我不能轻易地编写一个示例,但是您的目标应该是在Python中复制C++示例中的函数调用,以获取IAMVideoProcAmp
的实例,并根据您的需要对它们进行修改。
https://stackoverflow.com/questions/51843523
复制相似问题