DirectShow USB 网络摄像头更改视频源

2023-12-02

嘿,我正在尝试找到将我的网络摄像头上的视频源更改为“复合”的设置。似乎如果我拔掉 USB 然后重新插入并启动代码,它就会出现一个空白屏幕。但是,一旦我更改视频源(在另一个程序中),然后返回并再次运行我的代码,它就会出现。

因此,我需要一些可以让我改变这一点的东西,以便在我自己的应用程序中发生同样的事情,而不必启动另一个具有该功能来设置网络摄像头的程序。

当我拔出 USB 电缆然后将其放回并运行源代码时,应用程序的图片框是黑色的。

enter image description here

The "other program" i use to change the video source (that seems to work to bring up the image): enter image description here

After i use that "other program" i go back to the source code and run it and this is what i get then: enter image description here

我正在使用此处名为 dot Net Webcam Library 的 C# 代码:在此输入链接描述

似乎使用了DirectShow在此输入链接描述

我在源代码中注意到它列出了不同类型的视频设置(在下面的 AXExtend.cs 中找到):

public enum PhysicalConnectorType
{
    Video_Tuner = 1,
    Video_Composite,
    Video_SVideo,
    Video_RGB,
    Video_YRYBY,
    Video_SerialDigital,
    Video_ParallelDigital,
    Video_SCSI,
    Video_AUX,
    Video_1394,
    Video_USB,
    Video_VideoDecoder,
    Video_VideoEncoder,
    Video_SCART,
    Video_Black,

    Audio_Tuner = 0x1000,
    Audio_Line,
    Audio_Mic,
    Audio_AESDigital,
    Audio_SPDIFDigital,
    Audio_SCSI,
    Audio_AUX,
    Audio_1394,
    Audio_USB,
    Audio_AudioDecoder,
}

但我不确定如何在代码中调用它:

Device selectedDevice = device as Device;
imageCapture.Device = selectedDevice as Device;
imageCapture.PerformAutoScale();
imageCapture.Refresh();
imageCapture.Start();

所以我猜测“Video_Composite”是我可能需要的才能做到这一点?

任何帮助都会很棒!谢谢!

David

代码更新

foreach (Device device in Device.FindDevices())
{
   if (device.ToString() == "BackupCamera")
    {
        Device selectedDevice = device as Device;
        IGraphBuilder graphBuilder = new FilterGraph() as IGraphBuilder;
        DsDevice device1 = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)[1]; // <<--- Your Device
        Guid baseFilterIdentifier = typeof(IBaseFilter).GUID;
        object videoSourceObject;
        device1.Mon.BindToObject(null, null, ref baseFilterIdentifier, out videoSourceObject);
        IBaseFilter videoSourceBaseFilter = videoSourceObject as IBaseFilter;
        graphBuilder.AddFilter(videoSourceBaseFilter, "Source");
        ICaptureGraphBuilder2 captureGraphBuilder = new CaptureGraphBuilder2() as ICaptureGraphBuilder2;
        captureGraphBuilder.SetFiltergraph(graphBuilder);
        object crossbarObject;
        captureGraphBuilder.FindInterface(FindDirection.UpstreamOnly, null, videoSourceBaseFilter, typeof(IAMCrossbar).GUID, out crossbarObject);
        IAMCrossbar crossbar = crossbarObject as IAMCrossbar;
        int inputPinCount, outputPinCount;
        crossbar.get_PinCounts(out inputPinCount, out outputPinCount); // <<-- In/Out Pins
        // Pin Selection: Physical Input 2 (e.g. Composite) to Capture Pin 0 
        crossbar.Route(0, 2);

        imageCapture.Device = selectedDevice as Device;
        imageCapture.PerformAutoScale();
        imageCapture.Refresh();
        imageCapture.Start();
    }
}

在运行filer graph之前,您需要获取crossbar接口。您通常使用ICaptureGraphBuilder2::FindInterface为了这。这需要一个额外的过滤器和FindInterface由于这个原因,方法特别有用:

支持过滤器。如果捕获设备使用 Windows 驱动程序模型 (WDM) 驱动程序,则图表可能需要 WDM 视频捕获筛选器上游的某些筛选器,例如电视调谐器筛选器或模拟视频交叉开关筛选器。如果pCategory参数不等于NULL,该方法自动将任何所需的 WDM 滤波器插入图中.

完成此操作后,您将拥有IAMCrossbar接口,以及IAMCrossbar::Routemethod 是你如何切换输入。

也可以看看:交叉开关滤波器将当前输入更改为复合

代码片段:

IGraphBuilder graphBuilder = new FilterGraph() as IGraphBuilder;
DsDevice device = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)[1]; // <<--- Your Device
Guid baseFilterIdentifier = typeof(IBaseFilter).GUID;
object videoSourceObject;
device.Mon.BindToObject(null, null, ref baseFilterIdentifier, out videoSourceObject);
IBaseFilter videoSourceBaseFilter = videoSourceObject as IBaseFilter;
graphBuilder.AddFilter(videoSourceBaseFilter, "Source");
ICaptureGraphBuilder2 captureGraphBuilder = new CaptureGraphBuilder2() as ICaptureGraphBuilder2;
captureGraphBuilder.SetFiltergraph(graphBuilder);
object crossbarObject;
captureGraphBuilder.FindInterface(FindDirection.UpstreamOnly, null, videoSourceBaseFilter, typeof(IAMCrossbar).GUID, out crossbarObject);
IAMCrossbar crossbar = crossbarObject as IAMCrossbar;
int inputPinCount, outputPinCount;
crossbar.get_PinCounts(out inputPinCount, out outputPinCount); // <<-- In/Out Pins
// Pin Selection: Physical Input 2 (e.g. Composite) to Capture Pin 0 
crossbar.Route(0, 2);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DirectShow USB 网络摄像头更改视频源 的相关文章

  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • 如何从当前 .NET 表单/应用程序发送密钥 F12

    我非常确定以下按钮激活的表单代码应该在我的 C 应用程序中引发 Control F12 SendKeys F12 但它似乎并没有继续进入 Windows shell 并激活另一个正在侦听它的程序 我的键盘可以用 看起来发送键在某处被拦截 并
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • boost线程在中断时不打印退出消息

    我有这段代码用于执行三个线程 其中第二个线程应在按 Enter 时中断并打印退出消息 void input val DO STUFF return void process val DO STUFF try cout lt lt waiti
  • Linq Where 本地计数器关闭在 VS watch 中的结果不同

    我尝试删除前 3 个元素array与 LinQWhere扩展功能 这是一个例子 var array new 1 2 3 4 5 6 7 8 9 var count 3 var deletedTest1 0 var test1 array W
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • 控制台应用程序 .net Core 2.0 的配置

    在 net Core 1 中我们可以这样做 IConfiguration config new ConfigurationBuilder AddJsonFile appsettings json true true Build 这样就可以使
  • 如何避免选择项目时 winforms 树视图图标发生变化

    我正在一个小型 C Winforms 应用程序中尝试树视图 我已经以编程方式将 ImageList 分配给树视图 并且所有节点都很好地显示了它们的图标 but当我单击一个节点时 它的图标会发生变化 变为 ImageList 中的第一个图像
  • 根据拦截和返回值自动重试客户端WCF调用

    是否可以拦截 WCF 调用的结果并重试该操作 例如 操作的返回值可能包含状态代码 指示我传递到原始调用的会话令牌已过期 在这种情况下 我可以检索新的会话令牌并使用新的会话令牌重试调用 是否可以通过使用 WCF 拦截返回值 检查它 然后以对操
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • C++ Primer 5th Edition 错误 bool 值没有指定最小大小?

    bool 的最小大小不应该是 1 个字节吗 这有点学术性的东西 尽管它们会转换为数字 并且 与其他所有事物一样 它们最终将基本上由计算机内存中的数字表示 但布尔值不是数字 你的bool可以取值true 或值false 即使您确实需要至少 1
  • 标准 C 中的 sizeof 与 sizeof()? [复制]

    这个问题在这里已经有答案了 我看到一些直接使用 sizeof 的代码 想知道它是否是标准 C 令我惊讶的是 它运行得很好 这是一个例子 include
  • 为什么 C 函数不能返回数组类型?

    我是 C 语言新手 想知道 为什么 C 函数不能返回数组类型 我知道数组名是数组第一个值的地址 而数组是 C 中的二等公民 您自己已经回答了这个问题 数组是二等公民 C 按值返回 数组不能按值传递 因此不能返回它们 至于为什么数组不能按值传
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • SSBO 是更大的 UBO?

    我目前正在 OpenGL 4 3 中使用 UBO 进行渲染 以将所有常量数据存储在 GPU 上 诸如材料描述 矩阵等内容 它可以工作 但是 UBO 的小尺寸 我的实现为 64kB 迫使我多次切换缓冲区 减慢渲染速度 我正在寻找类似的方法来存
  • 删除对象时指针自动指向空

    假设我有一个对象和其他几个不同类类型的对象中的 10 个指向它的指针 如果对象被删除 这些指针必须设置为空 通常我会将对象的类与具有指向它的指针的类互连 以便它可以通知它们它正在被删除 并且它们可以将它们的指针设置为空 但这也有一个负担 即
  • Windows 上 libcurl 的静态库[重复]

    这个问题在这里已经有答案了 如何将此库 libcurl 静态链接到 exe 我努力了 disable share enable static 没有帮助 我使用的是MingW32 有没有一种简单的方法来静态链接这个库 这样我的应用程序就不再有
  • 当我读取 500MB FileStream 时出现 OutOfMemoryException

    我使用 Filestream 读取大文件 gt 500 MB 但出现 OutOfMemoryException 任何有关它的解决方案 我的代码是 using var fs3 new FileStream filePath2 FileMode
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐

  • 扩展 BaseRequestOptions 时注入的依赖项未定义

    我正在延长BaseRequestOptions在 Angular2 中为每个请求添加标头 我也有一个Config提供基于域的键 值对的类 我需要将其注入到我的派生类中 import BaseRequestOptions from angul
  • C# - 异步返回值

    private TaskCompletionSource
  • Xdebug 异常类的方法

    是否可以看到 Xdebug 创建的扩展 Exception 类的方法 我想获取 HTML 格式的堆栈跟踪 因此 在破解之后 没有像 Niels 展示的那样的方法 但有一个名为 exception gt xdebug message 的公共属
  • 添加谷歌服务 - 任务“:app:processDebugResources”执行失败

    我正在尝试按照此网站上的步骤在 Android Studio 中实现 GCM 客户端 在 Android 上实现 GCM 客户端 正如 设置 Google Play 服务 中提到的 我编辑了应用程序的 build gradle 文件 使其看
  • ThreeJS 中的弯曲文本对象

    有this回购协议this例如 它已经有近 2 年历史了 因此不适用于 ThreeJS 的最新版本 我遇到以下错误和警告 error THREE Matrix3 getInverse no longer takes a Matrix4 ar
  • Python - 打印列表中既没有逗号也没有撇号的项目

    我的代码的最小工作示例 Create output data file out data file open output file w out data file write Header n out data file close li
  • 恰好具有 k 个颜色边的生成树

    我有一个连通的无向图 其边为黑色或白色 并且有一个整数 k 我正在尝试编写一个算法来判断是否存在具有正好 k 个黑边的生成树 不一定必须找到实际的树 我使用克鲁斯卡尔算法来查找生成树中黑边的最小和最大可能数量 如果 k 超出此范围 则不存在
  • 手动触发IOptionsMonitor<>.OnChange

    在 ASP NET Core 2 1 中 我使用 IOptionsMonitor 并对其进行设置 以便我可以在更改 appSettings json 文件时成功获取事件 所以这是有效的 我现在想做的是通过代码手动更改选项中的一些值 并触发我
  • 带有数据流的 Apache Beam Go SDK

    我一直在使用 Go Beam SDK v2 13 0 但无法获取字数统计示例致力于 GCP 数据流 它进入崩溃循环尝试启动org apache beam runners dataflow worker DataflowRunnerHarne
  • C++:typeid 忽略低级 const 引用,但不忽略指针

    考虑以下代码 int main const int i 42 auto p i p is const int const is low level const auto q i q is const int reference to con
  • 计算三角形第三个点的坐标

    好吧 我知道这听起来应该在 math stackoverflow com 上问 但这是我在高中时忘记的令人尴尬的简单数学 而不是高级研究生的东西 我正在做一些图形编程 我有一个三角形 顺便说一句 这个三角形的两条边相等 但我不确定这是否相关
  • Oracle SQLPLUS - 当假脱机超过 50,000 条记录时,如何仅输出一次标头?

    我正在将一个大结果假脱机到磁盘 并且只想包含一次标头 我只需要一次标题 而不是每 50 000 条记录 根据文档 在第二次打印标题之前 我似乎限制为 50 000 条记录 根据文档 50 000 是最高值 我尝试将页面大小设置为零并打开标题
  • 将 ASP.NET MVC HttpContext 发送到 Web Api HttpContext

    我正在尝试上传文件 并且想将当前的 MVC HttpContext Current Request Files 传递给 Web API 我试图通过HttpFileCollectionBase作为参数将其传递给 API 但它始终为 null
  • 为什么 python 字典会改变顺序?

    python3 5中字典中存储的对象的顺序随着解释器的不同执行而变化 但对于同一个解释器实例似乎保持不变 python3 lt printf print a 1 b 2 nprint a 1 b 2 nprint a 1 b 2 nprin
  • 如何使用点列表的 (x,y) 坐标绘制网络 x 图?

    我有 x y 点 我想使用点列表的 x y 坐标来绘制图形 以便我可以看到轴 这是我的代码和图表照片 import networkx as nx import matplotlib pyplot as plt def add edge to
  • 如何使用 Jackson 正确解析流式 JSON?

    我正在尝试找出一种用 Jackson 解析流式 JSON 的干净方法 流 就像 TCP 中那样 离线 以零碎的方式进行 没有任何保证在单次读取中接收完整的 JSON 数据 也没有消息框架 此外 目标是异步执行此操作 这排除了依赖 Jacks
  • Fortran 2008 是否向后兼容以前的 Fortran 版本?

    是的 我知道 这不是想象的 这是一个真正的 Fortran 问题 我所说的早期版本是指 Fortran 2003 95 90 甚至 77 向后兼容是指可以轻松运行为 2008 年以前版本编写的代码 只需对语法进行一些细微的更改 Fortra
  • 为什么亚马逊广告报告 API 返回 .bin 而不是 .json

    我正在向亚马逊广告 API 请求一份赞助产品报告 当我发送 POST 时 我收到了 reportID 我输入 reportID 作为 GET 调用的路径的一部分来检索文档 我观察到类型 20 的响应 但是响应的内容是二进制代码 我认为 文档
  • C# 检查字符串是否为数字的代码

    我正在使用 Visual Studio 2010 我想检查一个字符串是否是数字 是否有任何内置函数来检查这一点 或者我们是否需要编写自定义代码 你可以使用int TryParse方法 例子 string s int result if in
  • DirectShow USB 网络摄像头更改视频源

    嘿 我正在尝试找到将我的网络摄像头上的视频源更改为 复合 的设置 似乎如果我拔掉 USB 然后重新插入并启动代码 它就会出现一个空白屏幕 但是 一旦我更改视频源 在另一个程序中 然后返回并再次运行我的代码 它就会出现 因此 我需要一些可以让