从DirectShow comtype访问GetCurrentImage()时Python内存泄漏

时间:2013-04-24 14:17:33

标签: python memory-leaks directshow video-capture comtypes

我必须调试有内存泄漏的别人代码。它耗尽所有RAM然后最终崩溃(以4Mb / s的速率)。 我将其分离到一个电话,该电话抓取视频过滤器的屏幕截图并将其保存到名为 lbDib 的对象。但是之后Python不会释放它。我试过Del它,然后调用gc.collect()。我已将其分配为零或无等。但内存未被释放。

经过一些谷歌搜索,我遇到了这个:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd390556%28v=vs.85%29.aspx

哪个州:

  

VMR为映像分配内存并返回指向它的指针   在lpDib变量中。呼叫者必须通过呼叫释放内存   CoTaskMemFree。

当我研究内存管理时,我只是不断遇到python垃圾收集器是自切片馅饼以来最好的事情,如果你试图清理内存,那么你做错了。

这是创建无法释放的内存的行:

lpDib = vmr_windowless_control.GetCurrentImage()

vmr_windowless_control 来自:

vmr_windowless_control = vmr_config.QueryInterface(IVMRWindowlessControl)

vmr_config 来自:

vmr_config = self.filter.QueryInterface(IVMRFilterConfig)      
vmr_config.SetRenderingMode(Renderer.VMRMode[vmrmode]

IVMRFilterConfig 来自COMtype DirectShowLib导入:

try:
    from comtypes.gen.DirectShowLib import (ICreateDevEnum, IBaseFilter, IBindCtx,
                                            IMoniker, IFilterGraph,
                                            IVMRFilterConfig,
                                            IVMRWindowlessControl, IAMCrossbar,
                                            IAMTVTuner, IAMStreamConfig,
                                            IAMVideoProcAmp, IFilterMapper2)
except ImportError:
    GetModule("DirectShow.tlb") # Create gen.DirectShowLib if it doesn't exist
    from comtypes.gen.DirectShowLib import (ICreateDevEnum, IBaseFilter, IBindCtx,
                                            IMoniker, IFilterGraph,
                                            IVMRFilterConfig,
                                            IVMRWindowlessControl, IAMCrossbar,
                                            IAMTVTuner, IAMStreamConfig,
                                            IAMVideoProcAmp, IFilterMapper2)

不知道怎么攻击这个,大脑是炒的。提前感谢任何帮助或潜在客户。

1 个答案:

答案 0 :(得分:0)

只需添加以下内容:

from ctypes import windll
windll.ole32.CoTaskMemFree(lpDib)

谢谢你们