Joe*_*Joe 6 python pywin32 comtypes win32com python.net
我想使用 DirectShow 的IAMVideoProcAmp获得对网络摄像头属性的低级别访问权限。
有几个 Python 模块 ) pywin32, pywintypes, comtypes, win32com, pythoncom) 在此上下文中使用,它们似乎以某种方式相关。但我不知道从哪里开始。
我找到了一些例子(这里,这里,这里),但我不知道如何获得 IID/CLSID 来使用
import win32com.client
clsid='{9BA05972-F6A8-11CF-A442-00A0C90A8F39}'
ShellWindows=win32com.client.Dispatch(clsid)
Run Code Online (Sandbox Code Playgroud)
或者有一个明确的名字,比如
import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
Run Code Online (Sandbox Code Playgroud)
或者
from comtypes import client, GUID
graph = client.CreateObject(some_CLSID)
graph.QueryInterface(...)
Run Code Online (Sandbox Code Playgroud)
有人可以帮我弄这个吗?
我找到了另一个示例 ( dshow.py ),但它有一些我找不到的依赖项 ( interfaces, uuids)。
微软的这个页面列出了这些过程
在 IAMVideoProcAmp 接口的捕获过滤器上调用 QueryInterface。
或者
查询 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);
Run Code Online (Sandbox Code Playgroud)
编辑:我终于找到了一些到目前为止看起来不错的代码:
它似乎完全符合我要编写的内容,并使用了 DirectShow 中的一些元素(请参阅此处):
from comtypes.gen.DirectShowLib import (FilterGraph, CaptureGraphBuilder2, ...)
Run Code Online (Sandbox Code Playgroud)
jaraco.video 声称是“使用 ctypes 和 comtypes 的纯 Python 中VideoCapture模块的一个端口”。
它正在使用一个DirectShow.tlb文件(无论是什么)将定义放入comtypes
类型库 (.tlb) 是一个二进制文件,它以其他应用程序在运行时可访问的形式存储有关 COM 或 DCOM 对象的属性和方法的信息。
我终于找到了一些正在运行的示例库:
它完全符合我想要实现的目标,并使用 DirectShow 中的一些元素(请参见此处):
from comtypes.gen.DirectShowLib import (FilterGraph, CaptureGraphBuilder2, ...)
Run Code Online (Sandbox Code Playgroud)
jaraco.video 声称是“使用 ctypes 和 comtypes 的纯 Python 中的VideoCapture模块的端口”。
它使用一个DirectShow.tlb文件(无论是什么)将定义放入comtypes中
类型库 (.tlb) 是一个二进制文件,它以其他应用程序在运行时可访问的形式存储有关 COM 或 DCOM 对象的属性和方法的信息。
导入是自动生成的__init__.py并且可以轻松使用:
from api.objects import ..., IMediaControl, IAMVideoProcAmp, IAMCameraControl, ...
Run Code Online (Sandbox Code Playgroud)
并且可以使用
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)
Run Code Online (Sandbox Code Playgroud)
然后您可以结合enum文档中所述的功能使用这些功能,例如
# CameraControl_Exposure = 4
print(d.get_camera_control_property(4))
Run Code Online (Sandbox Code Playgroud)