首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用DirectShow COM访问摄像头

用DirectShow COM访问摄像头
EN

Stack Overflow用户
提问于 2018-08-14 14:11:42
回答 2查看 3.1K关注 0票数 7

我想要使用DirectShow的IAMVideoProcAmp获得对IAMVideoProcAmp的低级别访问。

有几个Python模块(pywin32pywintypescomtypeswin32compythoncom)是在这个上下文中使用的,它们似乎有某种联系。但我不知道从哪里开始。

我找到了一些示例(这里这里这里),但是我想不出如何获得IID / CLSID来使用

代码语言:javascript
运行
复制
import win32com.client
clsid='{9BA05972-F6A8-11CF-A442-00A0C90A8F39}'
ShellWindows=win32com.client.Dispatch(clsid)

或者有一个清晰的名字

代码语言:javascript
运行
复制
import win32com.client
xl = win32com.client.Dispatch("Excel.Application")

代码语言:javascript
运行
复制
from comtypes import client, GUID
graph = client.CreateObject(some_CLSID)
graph.QueryInterface(...)

有人能帮我吗?

我找到了另一个示例(dshow.py),但是它有一些我找不到的依赖项(interfacesuuids)。

来自Microsoft的页面列出了以下步骤

在捕获过滤器上为QueryInterface接口调用IAMVideoProcAmp。

查询IAMCameraControl的捕获筛选器。

并为此说明了一些C++代码:

代码语言:javascript
运行
复制
// 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 (请看这里)中的一些元素:

代码语言:javascript
运行
复制
from comtypes.gen.DirectShowLib import (FilterGraph, CaptureGraphBuilder2, ...)

jaraco.video声称是“使用ctype和comtype的纯VideoCapture模块的一个端口”。

它使用一个DirectShow.tlb文件(不管是什么)将这些定义导入共形

类型库(.tlb)是一个二进制文件,它将有关COM或DCOM对象的属性和方法的信息存储在运行时其他应用程序可访问的表单中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-04 13:59:55

我终于找到了一个正在工作的示例库:

贾拉科

它完成了我想要实现的功能,并使用了DirectShow (请看这里)中的一些元素:

代码语言:javascript
运行
复制
from comtypes.gen.DirectShowLib import (FilterGraph, CaptureGraphBuilder2, ...)

jaraco.video声称是“使用ctype和comtype的纯VideoCapture模块的一个端口”。

它使用一个DirectShow.tlb文件(不管是什么)将这些定义导入共形

类型库(.tlb)是一个二进制文件,它将有关COM或DCOM对象的属性和方法的信息存储在运行时其他应用程序可访问的表单中。

这些导入是在__init__.py中自动生成的,可以很容易地使用:

代码语言:javascript
运行
复制
from api.objects import ..., IMediaControl, IAMVideoProcAmp, IAMCameraControl, ...

并且可以使用

代码语言:javascript
运行
复制
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结合使用。

代码语言:javascript
运行
复制
# CameraControl_Exposure = 4
print(d.get_camera_control_property(4))
票数 1
EN

Stack Overflow用户

发布于 2018-08-15 10:22:27

标识复制代码所需的值

再看一看文章末尾的代码摘录,我就会发现,为了获取IAMVideoProcAmp的一个实例,您只需要IID,而不需要CLSID。

查看这个strmif.h的来源的第8733行(作为接口所需的头),我发现IID_IAMVideoProcAmpC6E13360-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的实例,并根据您的需要对它们进行修改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51843523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档