1

我使用 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() 调用中几乎没有做任何事情。没有什么帮助。

如果有人对这里的罪魁祸首有任何想法,我想知道。

谢谢,罗伯特

4

2 回答 2

1

死锁是 DirectShow 中的一个常见问题,听起来就是这样。您说您可以在进程冻结后将调试器附加到您的进程?如果你在那个时候强行破坏它,线程在哪里?如果任何线程的堆栈中有您的代码,那么即使它实际上深陷在 DirectShow 代码中,也可以提示您正在发生什么。

如果调试器真的不能正常工作,那么下一个后备方案是在你的代码中添加日志消息,看看在冻结之前发生了什么。

于 2010-04-17T06:35:25.807 回答
0

与往常一样,您可以从拆分组件代码开始。

将它们一一打开,直到您遇到有问题的代码。

尝试隔离您的问题区域。尝试单元测试。

您的代码中可能存在内存泄漏或副作用,需要解决。

祝你好运。

于 2010-04-03T08:05:50.747 回答