DirectShow 过滤器未显示为输入捕获设备

2023-12-11

从捕获源过滤器的优秀示例开始here我编写了自己的输入捕获设备,该设备在 Graph Studio Next 中运行良好,但在 Skype 或类似应用程序中并未显示为捕获设备(即网络摄像头)。

因为我想了解发生了什么,所以我请您帮助我找出那些应用程序需要什么来显示这样的设备。

一些相关代码:

dll.cpp

DEFINE_GUID(CLSID_VirtualCam, 0x8e14549a, 0xdb61, 0x4309, 0xaf, 0xa1, 0x35, 0x78, 0xe9, 0x27, 0xe9, 0x33);

const AMOVIESETUP_MEDIATYPE AMSMediaTypesVideo = 
{
    &MEDIATYPE_Video,
    &MEDIASUBTYPE_NULL
};

const AMOVIESETUP_PIN AMSPinVCam[] =
{
    {
        L"Output",             // Pin string name
        FALSE,                 // Is it rendered
        TRUE,                  // Is it an output
        FALSE,                 // Can we have none
        FALSE,                 // Can we have many
        &CLSID_NULL,           // Connects to filter
        NULL,                  // Connects to pin
        1,                     // Number of types
        &AMSMediaTypesVideo      // Pin Media types
    }
};

const AMOVIESETUP_FILTER AMSFilterVCam =
{
    &CLSID_VirtualCam,  // Filter CLSID
    FILTER_NAME,     // String name
    MERIT_PREFERRED,      // Filter merit
    1,                     // Number pins
    AMSPinVCam             // Pin details
};

CFactoryTemplate g_Templates[] = 
{
    {
        FILTER_NAME,
        &CLSID_VirtualCam,
        CVCam::CreateInstance,
        NULL,
        &AMSFilterVCam
    },
};

过滤器.cpp

CVCam::CVCam(LPUNKNOWN lpunk, HRESULT *phr) : CSource(LPCSTR(FILTER_NAME), lpunk, CLSID_VirtualCam)
{
    ASSERT(phr);
    CAutoLock cAutoLock(&m_cStateLock);
    m_paStreams = (CSourceStream **) new CVCamStream*[1];
    m_paStreams[0] = new CVCamStream(phr, this, FILTER_NAME);
}

HRESULT CVCam::QueryInterface(REFIID riid, void **ppv)
{
    if (riid == _uuidof(IAMStreamConfig) || riid == _uuidof(IKsPropertySet))
    {
        HRESULT hr;
        hr = m_paStreams[0]->QueryInterface(riid, ppv);
        if (hr != S_OK) return hr;
    }
    else return CSource::QueryInterface(riid, ppv);

    return S_OK;
}

CVCamStream::CVCamStream(HRESULT *phr, CVCam *pParent, LPCWSTR pPinName) : CSourceStream(LPCSTR(FILTER_NAME),phr, pParent, pPinName), m_pParent(pParent)
{
    hdc = GetDC(NULL);

    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    screen_height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    screen_width = GetSystemMetrics(SM_CXVIRTUALSCREEN);

    GetMediaType(8, &m_mt);
}

CVCamStream::~CVCamStream()
{
    Gdiplus::GdiplusShutdown(gdiplusToken);
    DeleteDC(hdc);
} 

HRESULT CVCamStream::QueryInterface(REFIID riid, void **ppv)
{   
    if(riid == _uuidof(IAMStreamConfig)) *ppv = (IAMStreamConfig*)this;
    else if(riid == _uuidof(IKsPropertySet)) *ppv = (IKsPropertySet*)this;
    else return CSourceStream::QueryInterface(riid, ppv);

    AddRef();
    return S_OK;
}

我省略了与链接示例非常相似的其他功能,我猜配置是在这些功能中进行的。

您是否发现我的缺陷导致过滤器不被识别为视频捕获设备的任何证据?

当然,过滤器已注册(我在 DirectShow 过滤器管理器中看到它)。


不幸的是,您所指的 DirectShow 输入设备项目不是一个 API,它旨在将类似相机的实现带入任何启用视频捕获的应用程序中。

您开发的视频源仅对使用 DirectShow API 进行视频捕获并与您的过滤器具有匹配位数的应用程序可见。尽管相当多的应用程序仍在使用 DirectShow,但它们的使用率往往会随着时间的推移而缓慢下降。例如,新的 Skype 不使用 DirectShow,而 Skype for Business 只是前 Lync 的新名称,这意味着在视频捕获方面与 Skype 几乎没有共享源代码。

我在这篇文章中提供了更多技术细节:虚拟 DirectShow 源的适用性帖子中的图片应该说明您的视频源“可见”的应用程序(绿色框):

也可以看看:

  • DirectShow 虚拟摄像机不会出现在某些配置的列表中
  • 浏览器无法识别虚拟驱动摄像头
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DirectShow 过滤器未显示为输入捕获设备 的相关文章

  • C# 返回一个数的倍数和余数?

    我想找到给定数字的 3 的所有倍数 并找到余数 例如 给定数字 10 3 的倍数 3 6 9 余数 1 给定数字 11 3 的倍数 3 6 9 余数 2 到目前为止我的算法 但不是代码 是这样的 检查 X 是否是 3 的倍数 是 返回倍数
  • 为什么不继承 std::allocator

    我创建了自己的分配器 如下所示 template
  • C 位域内存使用情况

    我需要处理以下形式的一些数据 typedef struct unsigned n1 12 unsigned n2 12 unsigned n3 12 unsigned n4 1 unsigned n5 35 data 我确保它们总共最多有
  • C# OpenFileDialog 中的 Stackoverflow/CLR 错误

    下面的代码是我的悲伤示例之一 三个 这是一个简单的 OpenFileDialog 调用 会导致程序崩溃 在 XP 上 如果对话框保持打开状态几秒钟 就会发生崩溃 在 Vista 上 如果用户选择 我的电脑 则会发生崩溃 在VS2008中 调
  • 如何计算最低系统要求?

    对于我用 Visual C 编写的应用程序 Testing 不 真的 这就是全部
  • 静态方法中的统一

    一个可能很简单的问题 但很奇怪为什么我不知道该怎么做 Unity PRISM 和静态方法 在这种特殊情况下 需要使用扩展方法 但一般来说 如何在静态方法中访问 统一提供的实例 想想例如我想访问一个日志服务来记录我在静态方法中所做的一些事情
  • 从字符串末尾删除多个字符类型

    我有一个构建地址字段的循环 其中一些字段在字符串末尾可能为空 List
  • 将一串数据标记为结构向量?

    因此 我有以下数据字符串 该数据是通过 TCP winsock 连接接收的 并且想要进行高级标记化 将其转换为结构向量 其中每个结构代表一条记录 std string buf 44 william adama commander stuff
  • 无法将 MVC 4 部署到服务器

    我的 Web 应用程序只是一个用 VS 2010 MVC 4 制作的简单 Web 应用程序 没有任何外部代码 它只是 VS 2010 的默认应用程序 我有 Plesk 的豪华 Windows 托管 我从未更改过帐户中的任何功能 我将所有文件
  • 结构对类型大小的贡献

    我想知道为什么有以下两种类型 struct double re 2 and double re 2 C 中的大小相同吗 struct 不会增加一点大小开销吗 不 它只是将所有元素组合成一个更高级别的元素 其大小只是各个元素大小的总和 加上一
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a

随机推荐

  • 使用子选择更改表

    我有两张桌子 一个是字段信息表 另一个是字段数据表 默认情况下 所有字段数据表列都设置为某种类型的文本字段 varchar text 等 我想做的是这个 而不是创建手动 ALTER TABLE 查询 ALTER TABLE field da
  • 仅将元素放入 iframe 内,否则恢复

    EDIT 1 这是drag html 主页
  • 如何在具有多个域的 ASP.NET MVC4 应用程序中允许 Windows 身份验证?

    关于 MVC4 应用程序中的 Windows Auth 的两个问题 如何设置才能针对两个 Windows 域进行身份验证 我正在尝试做的事情 Authorize Roles DOMAINONE Group Name public class
  • 相互依赖的类模板和 std::is_base_of 专业化

    我对以下情况感到有点困惑 我在其中启用了专业化is base of is base of需要正在检查的类型的完整定义可用 但是 正在专门化的类型被用作正在检查的基类的类型的成员 因此两者都需要在另一个之前定义 并且我无法转发声明继承关系 令
  • onActivityResult 中的空意图附加内容

    我有两项活动 首先像这样调用第二个 Intent intent new Intent this Second class startActivityForResult intent 1 返回第二个数据 Intent intent new I
  • 使用 Google Maps SDK 在地图上绘制错误的折线

    我正在尝试使用 Google Maps SDK 在地图上绘制路线 This是我正在调用的 URL 我解析对坐标数组的 JSON 响应 id jsonResponse NSJSONSerialization JSONObjectWithDat
  • 在 C++ 程序中添加不必要的大括号 { } 是否会减慢速度?

    这可能是一个愚蠢的问题 但我对 C 和一般编程很陌生 我在这里找不到答案 我知道在 C 中 在某些情况下是可选的 例如 如果您有一个简单的 if 语句 其中仅执行一个操作 则不需要用 将其括起来 我只是想知道额外的括号是否对程序的速度有任何
  • 使用链接器脚本重命名符号

    是否可以使用链接描述文件或映射文件来重命名符号 我正在尝试修改一些用 C 和 Fortran 混合编写的代码 以便它可以在 Linux 上与多个 Fortran 编译器一起工作 目前它是为 Solaris Studio 编译器编写的 并且启
  • Volley - NetworkImageView 有时不显示错误图像?

    所以我决定尝试一下新的排球库如上所示谷歌IO 2013 我在使用简单的解决方案时尝试过NetworkImageView在一个上显示多个图像GridView 它运行良好并显示图像 但如果我让它下载图像 然后在下载过程中关闭 WiFi 它不会显
  • Visual Studio 2010 Professional Beta 2 上的 Windows Mobile 6 Standard SDK 刷新安装问题

    当我安装Windows Mobile 6 标准 SDK 更新我收到错误 未安装 Visual Studio 2005 SP1 或更高版本 我安装了 Visual Studio 2010 Professional Beta 2 请你告诉我如何
  • 使用 props 以纯文本或数组访问对象路径

    考虑以下对象和存储在对象内的值的路径 var obj a 1 b a x 2 b 3 c 4 var path b a x 获取对象路径中的内容的最佳方法 最佳性能 是什么 使用 eval path obj concat path var
  • vba中dim和set有什么区别

    请原谅我 我是 VBA 新手 有时我用 Dim r as Range r Range A1 其他时候我用 Set r Range A1 有什么不同 我什么时候应该使用什么 没有理由使用set除非引用对象引用 最好只在这种情况下使用它 对于所
  • 画布上的 Android Center 文本

    我正在尝试使用下面的代码显示文本 问题是文本没有水平居中 当我设置坐标时drawText 它将文本的底部设置在此位置 我希望绘制文本 以便文本也水平居中 这是进一步显示我的问题的图片 Override protected void onDr
  • Toast 类型中的方法 makeText 不适用于参数

    我正在使用 ViewPagerIndicator 并尝试使用 Toast 在滚动到下一个片段页面时显示 我收到以下错误 The method makeText Context CharSequence int in the type Toa
  • C# 获取文件更改事件

    我确实有一个程序可以在文本文件中记录一些特定事件 它使文件保持打开状态 现在我想编写第二个应用程序 在表单上显示这些日志 我可以为另一个进程打开的文本文件中的任何更改设置事件吗 或者我必须定期阅读 thanks 看看文件系统观察者类
  • 选择对不同数据库服务器上的 2 个表进行查询

    我试图通过在经典 ASP 中查询 2 个数据库 Sybase 来生成报告 我创建了 2 个连接字符串 数据库的 connA数据库 B 的 connB 两个数据库都存在于同一服务器上 不知道这是否重要 Queries q1 SELECT co
  • 如何读写Excel文件

    我想从 Java 读取和写入一个 3 列 N 行的 Excel 文件 在每个单元格中打印一个字符串 谁能给我简单的代码片段 我是否需要使用任何外部库或者 Java 是否有内置支持 我想做以下事情 for i 0 i
  • 尝试从谷歌搜索编辑框获取并打印数据,但出现 InvalidElementStateException

    我试图在谷歌搜索编辑框中写一个单词并捕获所有相关的列表项并显示它 但在这样做时我遇到了例外 org openqa selenium InvalidElementStateException 元素已禁用 因此不能用于操作 我经历了相同的异常相
  • 如何从另一个组件调用一个组件方法?

    我有一个包含按钮的标题组件 我希望该按钮在单击时显示另一个组件 模式页面 我可以做这样的事情吗 这是我的标题组件 import ComponentToDisplay from components ComponentToDisplay in
  • DirectShow 过滤器未显示为输入捕获设备

    从捕获源过滤器的优秀示例开始here我编写了自己的输入捕获设备 该设备在 Graph Studio Next 中运行良好 但在 Skype 或类似应用程序中并未显示为捕获设备 即网络摄像头 因为我想了解发生了什么 所以我请您帮助我找出那些应