gpt4 book ai didi

python - 使用带有 Python 的 COM 通过 DirectShow 访问网络摄像头

转载 作者:太空宇宙 更新时间:2023-11-03 11:39:48 24 4
gpt4 key购买 nike

我想获得对 webcam properties 的低级别访问权限使用 DirectShow 的 IAMVideoProcAmp .

有几个 Python 模块 )pywin32, pywintypes, comtypes, win32com, pythoncom) 在此上下文中使用,它们似乎以某种方式相关。但我不知道从哪里开始。

我找到了一些示例(hereherehere),但我无法弄清楚如何获取 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),但它有一些我找不到的依赖项(interfacesuuids)。

This Microsoft 的页面将程序列为

Call QueryInterface on the capture filter for the IAMVideoProcAmp interface.

Query the capture filter for the 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);

编辑:我终于找到了一些到目前为止看起来不错的代码:

jaraco

它似乎完全按照我想写的去做,并使用了一些来自DirectShow(see here):

from comtypes.gen.DirectShowLib import (FilterGraph, CaptureGraphBuilder2, ...)

jaraco.video 声称是“使用 ctypes 和 comtypes 的纯 Python 中的 VideoCapture 模块的端口。”

它正在使用 DirectShow.tlb文件(无论是什么)来获取定义进入comtypes

A type library (.tlb) is a binary file that stores information about a COM or DCOM object's properties and methods in a form that is accessible to other applications at runtime.

最佳答案

确定复制代码所需的值

再看一眼帖子末尾的代码摘录,我意识到您只需要 IID 而不是 IAMVideoProcAmp 的 CLSID 即可获取它的实例。

查看 this source of strmif.h 的第 8733 行, 作为接口(interface)所需的 header ,我发现 IID_IAMVideoProcAmpC6E13360-30AC-11d0-A18C-00A0C9118956

在 strmif.h 的这一部分之上,您可以识别哪些整数对应于 tagVideoProcAmpProperty 枚举中的哪些属性,例如 0 代表 VideoProcAmp_Brightness。在 strmif.h 的这一部分下面,您可以识别哪些整数对应于 IAMVideoProcAmpVtbl VTable 中的哪些函数,例如 3 对应 GetRange。我不熟悉如何在 Python 中与 COM 对象交互,但在 Java 中,您需要确定这些属性和函数索引,以便复制演示如何获取 IAmVideoProcAmp 实例的 C++ 代码摘录.

获取IAMVideoProcAmp的实例

您可能已经注意到,C++ 代码摘录在名为 pCap 的对象上调用了 QueryInterface,并指出您需要“查询 IAMVideoProcAmp 接口(interface)的捕获过滤器”。 This sibling of the article you linked解释如何做到这一点:

To create a DirectShow capture filter for the device, call the IMoniker::BindToObject method to get an IBaseFilter pointer. Then call IFilterGraph::AddFilter to add the filter to the filter graph:

IBaseFilter *pCap = NULL;
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
if (SUCCEEDED(hr))
{
hr = m_pGraph->AddFilter(pCap, L"Capture Filter");
}

既然您知道如何获取 pCap,您会注意到您需要一个名为 pMoniker 的东西,它在同一篇文章的前面定义过。代码比较长,这里省略。

用 Python 完成所有这些

正如我之前提到的,我从未使用过任何 Python COM 库,因此我无法轻易地创建一个示例,但您的目标应该是在 Python 中复制 C++ 示例中进行的函数调用以获取 IAMVideoProcAmp 并根据您的需要修改它们。

关于python - 使用带有 Python 的 COM 通过 DirectShow 访问网络摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51843523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com