c++ - 如何释放内存 directshow 过滤器

标签 c++ winapi com directshow

我目前正在开发一个使用 directshow 库的小程序。除其他外,该程序应该能够选择连接到计算机的任何摄像机并记录流。 我的问题是我不确定如何释放内存 dshow 过滤器。 让我们举个例子:

例如,当我想设置输出文件名时,我必须像这样创建一个 AVI Mux 过滤器:

IBaseFilter * aviMux;
bGraph->SetOutputFileName(
    &MEDIASUBTYPE_Avi,   
    L"example.avi",  
    &aviMux,       
    NULL);  

现在我想更改文件名并再次使用 SetOutputFileName() 函数,但是如何释放内存 AVI Mux(顺便说一句,显然该函数也创建了一个 FileWriter 过滤器,我想将其释放为出色地)?我唯一能做的就是:

aviMux->Release();
fGraph->RemoveFilter(aviMux);

但是现在程序结束前内存会被释放吗?我想做这样的事情:

delete aviMux;

但这显然是一个错误。 感谢您提供任何答案和帮助的建议..

最佳答案

适用标准 COM 规则:

  • 您不再需要接口(interface)指针 - 您可以使用 IUnkonwn::Release
  • 一旦您想明确停止过滤器图形事件 - 您可以执行 IGraphBuilder::Stop 来停止过滤器
  • 一旦您释放所有指向图形和过滤器及其接口(interface)的接口(interface)指针,所有底层资源都会自动释放

为了使其更可靠,您还可以考虑明确地从停止的图形中删除所有过滤器(这会在内部强制断开引脚连接)。

特别是捕获过滤器图,更改文件名几乎与从头开始构建新图的复杂性相同。所以这是有意义的事情:停止,完全清理,新图表,开始新捕获到新文件。重用过滤器是可能的(在已经添加到停止的过滤器图中的过滤器编写器上使用 IFileSinkFilter::SetFileName),但是它不太可能明显地加速文件切换 - 无论如何都会涉及一定的延迟。

要实现无缝文件切换,您需要两个图 - 一个捕获图和一个写入图。以及两者之间的通信,如bridging .

关于c++ - 如何释放内存 directshow 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17487780/

相关文章:

dll - RegAsm -/codebase 选项何时适用?

c++ - 如何在 C 代码上从终端运行 Google 测试?

c++ - 如何删除结构的动态数组(C++)?

windows - 我可以在 Windows 中创建仅存在于内存中的文件吗?如果可以,如何创建?

c++ - 从 RichEdit 复制编号列表?

c++ - 覆盖 "Run as Administrator"的 COM shell 扩展在开始菜单搜索中失败

c++ - 多线程基准测试问题

C++ 全局变量声明

file - 如何在写入数百个多兆字节文件时避免文件碎片?

python - 将 IDM(Internet 下载管理器)API 与 python 一起使用