- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我编写了一个小型变换过滤器(派生自 TransInPlaceFilter 基类),并设法使其在 Directshow 图中正常工作,完全用 C++ 编码。我基本上遵循了 MSDN 中描述的前 5 个步骤,以及第 6 步的最后一部分(以便直接在应用程序中使用过滤器)。
出于很多原因(包括能够在 GraphEdit 中使用过滤器),我需要将该过滤器导出到 DLL 中并进行注册。
我一直在努力关注these steps :设置“CreateInstance”方法、CFactoryTemplate 类、过滤器/引脚描述(AMOVIESETUP_FILTER、AMOVIESETUP_PIN、AMOVIESETUP_MEDIA)、注册/注销函数,最后是 DLLmain/入口点。
代码成功编译并提供了一个 DLL,使用 Regsvr32 似乎可以毫无问题地注册。
但是我无法使用过滤器:
pCustomFilter.CoCreateInstance(CLSID_Custom)
,在定义正确的 GUID 之后),我收到错误 0x80040154 (REGDB_E_CLASSNOTREG)我在这里很困惑。我是否遗漏了 DLL/注册代码中的某些内容?如果有任何用处,我将发布我正在使用的大部分代码。
如有任何帮助,我们将不胜感激。
static const WCHAR g_wszName[] = L"Custom Filter";
AMOVIESETUP_MEDIATYPE sudMediaTypes[] = {
{ &MEDIATYPE_Video, &MEDIASUBTYPE_NULL },
{ &MEDIATYPE_Audio, &MEDIASUBTYPE_NULL },
};
AMOVIESETUP_PIN sudPins[2] = {
{
L"Input", // Name
FALSE, // Is this pin rendered?
FALSE, // Is it an output pin?
FALSE, // Can the filter create zero instances?
FALSE, // Does the filter create multiple instances?
&GUID_NULL, // Obsolete.
NULL, // Obsolete.
2, // Number of media types.
sudMediaTypes // Pointer to media types.
},
{
L"Output", // Name
FALSE, // Is this pin rendered?
TRUE, // Is it an output pin?
FALSE, // Can the filter create zero instances?
FALSE, // Does the filter create multiple instances?
&GUID_NULL, // Obsolete.
NULL, // Obsolete.
2, // Number of media types.
sudMediaTypes // Pointer to media types.
}
};
AMOVIESETUP_FILTER sudFilterReg = {
&CLSID_Custom, // Filter CLSID.
g_wszName, // Filter name.
MERIT_DO_NOT_USE, // Merit.
2, // Number of pin types.
sudPins // Pointer to pin information.
};
CFactoryTemplate g_Templates[] =
{
{
g_wszName,
&CLSID_Custom,
CCustomFilter::CreateInstance,
NULL,
&sudFilterReg
}
};
int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
STDAPI DllRegisterServer()
{
return AMovieDllRegisterServer2( TRUE );
}
STDAPI DllUnregisterServer()
{
return AMovieDllRegisterServer2( FALSE );
}
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpReserved)
{
return DllEntryPoint(reinterpret_cast<HINSTANCE>(hDllHandle), dwReason, lpReserved);
}
// ---
// Meanwhile, in my filter class...
// ---
CUnknown * WINAPI CCustomFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr)
{
CCustomFilter *pFilter = new CCustomFilter();
if (pFilter== NULL)
{
*pHr = E_OUTOFMEMORY;
}
return pFilter;
}
最佳答案
问题解决了。这实际上是两件事:
<醇>直接调试 DLL(我没想到的东西...),更具体地说是 CoCreateInstance 函数,帮助我注意到字符串宏的问题。调用 TransInPlaceFilter 的构造函数时使用了错误的参数,这导致了崩溃。
有人让我注意到我没有导出所有必需的函数(如 MSDN 上的 here 所述)。我的 .def 文件缺少 DllMain、DllGetClassObject 和 DllCanUnloadNow。最后两个函数只需要出现在 def 中,因为它们已经在基类库中定义。
LIBRARY "custom_filter"
EXPORTS
DllMain PRIVATE /* missing */
DllGetClassObject PRIVATE /* missing */
DllCanUnloadNow PRIVATE /* missing */
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
非常感谢您的帮助!
关于c++ - 使用自定义 DirectShow 过滤器(DLL,已注册),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4969916/
我目前正在处理 Windows Media Foundation。但是,由于 Microsoft H.264 解码器的一些问题和一些缺少自定义格式的解码器,我想知道是否可以直接使用 CLSID 实例化
IMediaEvent 和 IMediaEventEx 没有说明图中哪个过滤器发送了检索到的 DirectShow 事件。有什么办法可以找到这些信息。特别是对于图中的过滤器之一发送 EC_ERRORA
我已经阅读了 DirectShow 上的 MSDN 文档,但它仍然令人困惑。我觉得我需要更多关于对象的上下文:图形、图钉、过滤器...等。谷歌搜索并没有给我太多的工作。我需要什么才能理解 Direct
正如我刚刚发现的那样,友好的名称不能保证是唯一的。如果我可以从该标识符实例化过滤器而无需枚举它们,则可加分。 最佳答案 可以通过 WaveOutId 识别包装 WaveOut 设备的渲染器过滤器。那些
我想捕获当前帧及其前一帧以进行分析并生成一个新帧来显示。是说我必须写一个变换DirectShow过滤器吗?但我是 DirectShow 的新手。我被MSDN的大量文档弄糊涂了。所以我想知道是否有任何简
enter code here我必须动态停止和启动 Video Renderer Filter。在不创建新图表的情况下,使用“普通”直接展示架构是不可能的。但是使用 GMFBridge 似乎是可能的。
在网上搜索了几个小时后,我非常想找到解决方案。我已经在 DirectShow 中启动并运行 OGG Theora 解码器,它输出 YV12 和 YUY2 颜色模型。 现在,我想为这个输出制作一个 RG
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
长篇故事: 有一个 H264/MPEG-4 源 我可以用 RTSP 协议(protocol)连接这个源。 我可以使用 RTP 协议(protocol)获取原始 UDP 数据包。 然后将这些原始 UDP
这可能是一个愚蠢的问题,但我很难概念化我需要在这里做什么......过去我使用 DirectShow 连接到相机并使用源过滤器捕获 AVI,AVI多路复用器、压缩过滤器、运行图表等……小菜一碟。在这种
我有一些自定义 DirectShow 过滤器(用于编码/解码/多路复用/多路分离)。 我想在 Media Foundation 上将它们用作 MFT。 我听过一些人说: “微软声称所有 DirectS
我做了一个简单的图表来编写 MKV 文件。但我不想使用文件编写器。我想使用 SampleGabber 并使用简单的程序获取流。问题是我从 Matroska muxer 以外的任何地方获取数据!(我该怎
我正在使用使用 DirectShow 库的 WPF 应用程序,它可以很好地抓取图像或记录实时提要,但我希望最终用户不应该看到任何网络摄像头正在拍照,即我想要用户不应看到正在呈现来自网络摄像头的提要的图
我应该写一个直接显示过滤器 从实时源获取输入(视频、音频)。 它应该将数据(视频,音频:已编码)提供给解码器过滤器 MyCustomDirectShowSourceFilter ---> Decode
我在从 DirectShow 筛选器图表编辑器连接到远程图表时遇到问题。当我运行创建直接显示图形的应用程序时,在我的 Windows XP 计算机上,图形显示在远程图形列表中,但在 Windows 7
什么是微软的 DirectShow ,以及它与以下内容有何关系: 编解码器? 容器? 编解码器和容器之间的确切区别是什么? 最佳答案 用简单的英语: 编解码器是一种算法和/或代码,可将音频或视频从 R
我开发了一个使用 DirectShow 从外部设备捕获视频的 Windows 应用程序。图像分辨率为 640x480,未经压缩保存的视频尺寸非常大(大约每秒 27MB)。 我的目标是尽可能地减小这个大
我正在尝试用 C# 制作一个允许用户录制视频的网络摄像头应用程序。我一直在使用 DirectShow.Net 来预览网络摄像头并拍摄快照。但需要能够在预览网络摄像头的同时捕捉视频和音频。我尝试过的一件
我已经找了很长时间,但是找不到解决方案。 如何从USB(符合Directshow规范)输入设备捕获音频并直接传递到PC扬声器(“音频渲染器”)? 我相信这不是一项艰巨的任务,但是我确实在网络上找不到任
我正在从我的应用程序执行 VLC 以从 DirectShow 音频捕获设备捕获和编码。 VLC 通过 STDOUT 将编码数据发送到我的应用程序。我需要一种枚举 DirectShow 音频捕获设备的方
我是一名优秀的程序员,十分优秀!