【问题标题】:How to free of memory directshow filters如何释放内存directshow过滤器
【发布时间】:2013-07-03 11:48:06
【问题描述】:

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

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

【问题讨论】:

    标签: c++ winapi com directshow


    【解决方案1】:

    标准 COM 规则适用:

    • 你不再需要接口指针了——你需要IUnkonwn::Release
    • 一旦您想明确停止过滤器图形活动 - 您可以通过 IGraphBuilder::Stop 停止过滤器
    • 一旦您释放所有指向图形和过滤器及其接口的接口指针,所有底层资源都会自动释放

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

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

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

    【讨论】:

    • 非常感谢您的回答,这真是太棒了,正是我所需要的!我知道我可以发布整个旧图并构建一个新图,但我无法处理我不知道这是最好的还是唯一的方法。您的回答说明了一切,再次感谢!
    猜你喜欢
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多