我目前正在开发一个使用 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/