我使用 Delphi Pro 6 和 DSPACK DirectShow 库编写了一个 DirectShow 推送过滤器,用于与 Skype 一起使用。在预览模式下,当您在 Skype 客户端视频设置窗口中测试视频输入设备时,我的过滤器可以完美运行。我可以让它运行几分钟而不会出错。
但是,当我在 10 到 24 秒后开始视频通话时,视频源会冻结。通话继续正常,通话时长计数器点击几秒钟,但视频源已死,卡在发生冻结的任何帧上(尽管过了很长时间它变黑,我相信这意味着 Skype 已经放弃了过滤器)。我尝试从调试器附加到进程,并在每个方法调用上逐字设置断点,一旦发生冻结,它们都不会被命中。就好像代表 Skype 对我的过滤器进行 DirectShow FillBuffer() 调用的线程已死或已关闭。
我无法在调试器中跟踪我的过滤器,因为在 Skype 通话期间,当 Skype 视频通话正在进行时,我会收到奇怪的 int 1 和 int 3 调试器硬中断调用。即使选择了我的标准网络摄像头输入设备并且我的 DirectShow 过滤器完全取消注册为 ActiveX 服务器,这种行为也会发生。我怀疑它可能是一些“反调试”代码,因为它不会在视频输入预览模式下发生。无论哪种方式,这就是为什么我必须在事后附加到该进程以查看我的 FillBuffer() 调用是否仍在被调用,而是发现它似乎已经死了。
请注意,我的普通 USB 网络摄像头的 DirectShow 过滤器不会出现冻结行为,并且可以正常工作几分钟。Skype 不喜欢我的过滤器。我尝试了不同间隔的 Sleep() 语句,没有 Sleep 语句,在 FillBuffer() 调用中几乎没有做任何事情。没有什么帮助。
如果有人对这里的罪魁祸首有任何想法,我想知道。
谢谢,罗伯特