1

我编写了一个自定义渲染器过滤器来将视频帧推送到系统内存,然后再推送到 OpenGL。它不在 DLL 中,我没有注册它,而是像本页第一段中描述的那样使用它。这在 Debug 模式下工作正常,但在 Release 中它开始崩溃。我正在执行以下操作来初始化图形:

HRESULT hr;

CoInitialize(0);
CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&graph);

graph->QueryInterface(IID_IMediaControl, (void**)&mediaControl);
graph->QueryInterface(IID_IMediaSeeking, (void**)&mediaSeeking);

grabber = new textureGrabber(0, &hr);
grabber->AddRef(); // crash here
grabber->setTexture(&texture);
grabber->QueryInterface(IID_IBaseFilter, (void**)&base);

graph->AddFilter(base, L"OpenGL texture video filter");
graph->RenderFile(path.c_str(), 0);

由于访问冲突,这在 AddRef() 上崩溃。我已经尝试过自己实现类的 IUnknown,我得到的最好的结果是 AddFilter 崩溃,因为 IBaseFilter 似乎无效。在那之后,我甚至发现了一个微软发布的例子,它以简单的方式做到了这一点,而且似乎对他们有用。我很好奇可能出了什么问题,因为我正在做同样的事情——甚至尝试过智能指针。

编辑:问题出在 CBaseFilter DECLARE_IUNKNOWN 宏中,GetOwner()->AddRef 失败。GetOwner 本身似乎有效。

4

2 回答 2

0

GetOwner 将您作为第二个参数传递给 CBaseFilter 构造函数的任何内容返回。通常为 NULL,除非您出于某种原因聚合对象(如果是,则可能不需要)。

于 2013-06-07T11:16:49.103 回答
0

如果您的发布版本链接到 DirectShow 基类库Strmbasd.lib调试版本,那么此时可能会发生崩溃。

将项目的发布配置改为链接Strmbase.lib,这是库的发布版本。

于 2015-10-05T16:28:15.160 回答