除了正在使用的所有样本外,有人知道IMemAllocator:GetBuffer(Directshow)挂起的原因吗?

我有一个DirectShow应用程序,它使用GMFBridge by Geraint Davies连接两个图形。 GMFBridge用于切换输入,但是在这种情况下我不进行切换。该应用程序捕获音频和视频,并且应该不间断地进行捕获。但是大约10个小时后,它停止了。我发现音频和视频都卡在了对IMemAllocator:GetBuffer的调用中:

/* _COM_SMARTPTR_TYPEDEF(IMemAllocator, IID_IMemAllocator); */
/* IMemAllocatorPtr m_pCopyAllocator; */

hr = m_pCopyAllocator->GetBuffer(&pOut, NULL, NULL, 0);

如果所有样本都在使用中,则此功能可以阻止,但我可以肯定的是并非如此。有两个线程调用此函数,一个用于视频,一个用于音频样本。音频线程首先阻塞,并且在GetBuffer返回了将近60个视频样本的缓冲区之后,视频线程也将阻塞。 (大约2秒后)

在将近8个小时后,两个线程都会继续运行一小段时间,首先是音频线程,然后在返回了45个音频样本缓冲区之后,视频线程也将解除阻塞。

因此,由于两个线程不会同时阻塞,因此在我看来,所有样本都在使用中没有问题。

stacktrace显示此时正在调用quartz.dll内部的函数。

更新

看来是由于PC上已经安装了解码器过滤器而导致内存泄漏。该图包括对mpeg的解码,例如,音频解码使用了Cyber​​link解码器。安装ffdshow后,改用ffdshow音频和视频解码器,问题似乎消失了。经验教训,并不自动依赖现有的过滤器。

最佳答案

不知道我可以从给出的信息中调试它。您可以创建一个日志文件吗(创建一个空文件c:\ gmfbridge.txt,运行直到挂起,然后压缩该文件并通过电子邮件发送)。另外,如果使用_NT_SYMBOL_PATH设置符号,则可以查看堆栈跟踪以查看各个线程在quartz.dll中的位置。

G

09-07 06:39