我正在尝试使用多个摄像头构建DirectShow应用程序,这些摄像头可以在任意时间连接,断开连接或连接到预览监视器,而使应用程序的中央处理图处于运行状态。该架构如下所示:
在this post(以及其他资源)的协助下,我开始工作了GMFBridge,以在程序启动时构造和连接源图和处理图,并在理论上运行这三个图。但是,由于没有附加渲染窗口,所以我真的不知道。
我discovered的一件事是在Color Space Converter
和渲染器之间需要Smart Tee
过滤器,视频才能正常工作。因此,我假设Color Space Converter
和网桥过滤器之间的Smart Tee
过滤器将强制执行所需的视频格式。
现在,我正在尝试构建一个监视器窗口图,该图以桥源过滤器开始,并馈入渲染器。第一次尝试拒绝连接引脚,因为它们无法就媒体类型达成共识。 (异常中的错误消息是“这些引脚之间没有通用的媒体类型”。)我在它们之间放置了Color Space Converter
,可以构建图形,但生成了黑色渲染器窗口。我使用GraphEdit
连接到运行的图形,发现Color Space Converter
输入的媒体类型为ARGB32
,而输出为RGB565
。我怀疑这是造成黑屏的原因,因此我寻找了一种使输出成为RGB32
以匹配相机格式的方法。我发现无法直接设置Color Space Converter
的输出格式,您必须将其连接到仅接受所需格式的过滤器。在this post中,我发现“来自RGBFilters示例的TransNull32确实做到了这一点。”
一旦意识到在系统上找不到TransNull32
过滤器,我便开始寻找“神奇的” RGBFilters。在this post中,我找到了一个指向Wikipedia页面的链接,该页面具有包含RGBFilters源代码Windows Server 2003 R2 Platform SDK的Microsoft SDK最新版本的下载链接。
我从该镜像文件刻录了光盘,然后在系统上安装了SDK。当我转到RGBFilters目录时,我发现它具有Makefile
,但是没有VC++或VisualStudio文件。我从Makefile
创建了一个新的VisualStudio2015项目,并经历了调试其构建的过程:
StdAfx.h
复制到所有子目录中;将(自动生成的)RGBFilters_h.h
复制到RGBFilters.h
并将其复制到所有子目录中,以解决编译器“未找到”错误#include <strsafe.h>
添加到StdAfx.h
,然后将其重新复制到子目录streams.h
必须添加到包含列表中(来自我系统上的C:\Program Files\Microsoft\SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses
)Strmbasd.lib
必须添加到库列表中(来自我系统上的C:\Program Files\Microsoft\SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\Debug
),并且必须使用与用于构建RGBFilters.dll
时相同的字符集进行构建,这需要重建该库以及winmm.lib
必须添加到库列表中(来自我系统上的C:\Program Files\Microsoft\SDKs\Windows\v7.1\Lib
)我终于建立了
RGBFilters.dll
,并尝试了regsvr32 RGBFilters.dll
-并获得了我以为我在this Microsoft post中找到了答案,但是我得到的是
Sat 04/22/2017 8:48:00.27 Microsoft Windows [Version 6.1.7601]
C:\...\RGBFilters\Debug > C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm RGBFilters.dll /tlb:RGBFilters.tlb
Microsoft .NET Framework Assembly Registration Utility version 4.6.1055.0
for Microsoft .NET Framework version 4.6.1055.0
Copyright (C) Microsoft Corporation. All rights reserved.
RegAsm : error RA0000 : Failed to load 'C:\Program Files (x86)\Microsoft\wServer 2003 R2 Platform SDK\Samples\Multimedia\DirectShow\Filters\RGBFilters\Debug\RGBFilters.dll' because it is not a valid .NET assembly
Sat 04/22/2017 8:56:02.02 Microsoft Windows [Version 6.1.7601]
C:\...\RGBFilters\Debug >
然后,按照this post中的建议,我尝试运行
depends.exe
,找不到类似于DLL导出列表的任何内容。我也试过Sat 04/22/2017 10:21:25.33 Microsoft Windows [Version 6.1.7601]
C:\...\RGBFilters\Debug > dumpbin /exports RGBFilters.dll
Microsoft (R) COFF/PE Dumper Version 14.00.24215.1
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file RGBFilters.dll
File Type: DLL
Summary
1000 .00cfg
7000 .data
1000 .gfids
2000 .idata
22000 .rdata
6000 .reloc
1000 .rsrc
59000 .text
Sat 04/22/2017 10:21:38.61 Microsoft Windows [Version 6.1.7601]
C:\...\RGBFilters\Debug >
如您所见,此DLL中没有没有导出的符号-这就是为什么所有内容都在其中阻塞的原因。我浏览了VisualStudio中的所有项目设置,没有看到任何不对劲,所以我不知所措地解释了这个完全虚假的DLL是如何构建的。
我强烈怀疑我是否错过了将
Makefile
转换为VS项目的关键步骤?编辑
有一个
RGBFilters.def
文件,它被列为VS项目中的源文件之一,并且包含;===========================================================================
; Copyright (c) 1992-2002 Microsoft Corporation. All Rights Reserved.
;===========================================================================
EXPORTS
DllMain PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
最佳答案
如Roman R所述,需要在项目属性的RGBFilters.def
页面上的Module Definition File
字段中引用Configuration Properties -> Linker -> Input
文件。
一旦对项目进行了更改并重新构建,regsvr32 RGBFilters.dll
就可以按预期工作。
关于c++ - 找不到RGBFilters入口点DllRegisterServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43560773/