使用 COM 和 Python 通过 DirectShow 访问网络摄像头

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 对象的属性和方法的信息。

Joe*_*Joe 1

我终于找到了一些正在运行的示例库:

哈拉科

它完全符合我想要实现的目标,并使用 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)