我使用Delphi Pro 6和DSPACK DirectShow库编写了一个DirectShow推送过滤器,用于Skype。在预览模式下,当您在Skype客户端视频设置窗口中测试视频输入设备时,我的过滤器可以正常工作。我可以让它保持运行几分钟而不会出错。
但是,当我在10到24秒之后开始视频通话时,视频输入会冻结。呼叫持续时间计数器点击秒数,呼叫继续正常,但视频信号已经死了,卡在冻结发生的任何帧上(虽然很长一段时间它变黑了,我相信Skype已经放弃了过滤器)。我尝试从我的调试器附加到进程,并在每个方法调用上设置断点,并且一旦冻结发生,它们都不会被命中。就好像代表Skype对我的过滤器进行DirectShow FillBuffer()调用的线程已经死亡或已经关闭。
我无法在调试器中跟踪我的过滤器,因为在Skype调用期间,当Skype视频通话正在进行时,我会得到奇怪的int 1和int 3调试器硬中断调用。即使选择了我的标准Web摄像头输入设备并且我的DirectShow过滤器完全取消注册为ActiveX服务器,也会发生此行为。我怀疑它可能是一些“反调试”代码,因为它不会发生在视频输入预览模式中。无论哪种方式,这就是为什么我必须在事后附加到进程以查看我的FillBuffer()被调用是否仍被调用,而是发现它似乎已经死了。
请注意,我的普通香草USB网络摄像头的DirectShow过滤器不会出现冻结行为,并且可以在很长时间内正常工作。 Skype不喜欢我的过滤器。我已经尝试了不同间隔的Sleep()语句,没有Sleep语句,在FillBuffer()调用中几乎什么都不做。什么都没有帮助。
如果有人对这可能是罪魁祸首有任何想法,我想知道。
谢谢, 罗伯特
答案 0 :(得分:1)
死锁是DirectShow中的一个常见问题,听起来就像是发生了什么。你说你可以在冻结之后将调试器附加到你的进程中吗?如果你在那一点强制破坏它,线程在哪里?如果任何线程在堆栈中包含您的代码,那么即使它实际上深入到DirectShow代码中,也可以提示您发生了什么。
如果调试器真的没有用,那么下一个后备是用日志消息来查看代码,看看在冻结之前发生了什么。
答案 1 :(得分:0)
与往常一样,您可以先拆分组件代码。
逐一打开它们,直到您点击有问题的代码。
尝试隔离您的问题区域。 尝试单元测试。
您的代码中可能存在内存泄漏或副作用,需要解决。
祝你好运。