Video 我在Skype视频通话中编写的DirectShow筛选器在10-24秒后死亡

Video 我在Skype视频通话中编写的DirectShow筛选器在10-24秒后死亡,video,filter,directshow,skype,Video,Filter,Directshow,Skype,我已经使用Delphi Pro 6和DSPACK DirectShow库编写了一个DirectShow推送过滤器,用于Skype。在预览模式下,当您在Skype客户端视频设置窗口中测试视频输入设备时,“我的过滤器”工作正常。我可以让它运行几分钟而不出错 但是,当我在10到24秒后开始视频通话时,视频馈送会冻结,时间不会再长了。通话继续正常,通话持续时间计数器将持续几秒钟,但视频馈送已停止,停留在冻结发生的任何帧上(尽管很长一段时间后它变黑,我相信这意味着Skype已放弃使用过滤器)。我尝试从我的

我已经使用Delphi Pro 6和DSPACK DirectShow库编写了一个DirectShow推送过滤器,用于Skype。在预览模式下,当您在Skype客户端视频设置窗口中测试视频输入设备时,“我的过滤器”工作正常。我可以让它运行几分钟而不出错

但是,当我在10到24秒后开始视频通话时,视频馈送会冻结,时间不会再长了。通话继续正常,通话持续时间计数器将持续几秒钟,但视频馈送已停止,停留在冻结发生的任何帧上(尽管很长一段时间后它变黑,我相信这意味着Skype已放弃使用过滤器)。我尝试从我的调试器连接到进程,在每个方法调用上都设置了一个断点,一旦冻结发生,它们都不会被命中。这就好像代表Skype对我的筛选器进行DirectShow FillBuffer()调用的线程已死亡或已关闭

我无法在调试器中跟踪我的筛选器,因为在Skype呼叫期间,当Skype视频呼叫正在进行时,我会收到奇怪的int 1和int 3调试器硬中断呼叫。即使选择了我的标准web cam输入设备,并且我的DirectShow筛选器完全未注册为ActiveX服务器,也会发生这种行为。我怀疑这可能是一些“反调试”代码,因为它不会在视频输入预览模式下发生。无论哪种方式,这就是为什么我必须在事件发生后附加到进程,以查看调用的FillBuffer()是否仍在被调用,而不是被发现似乎已死亡

请注意,我的普通香草USB网络摄像头的DirectShow过滤器不会显示冻结行为,并且可以正常工作很多分钟。我的过滤器有些地方Skype不喜欢。我尝试过不同间隔的Sleep()语句,没有Sleep语句,在FillBuffer()调用中几乎什么也不做。没什么帮助

如果有人知道什么可能是罪魁祸首,我想知道

谢谢,
Robert

一如既往,您可以从拆分组件代码开始

一个接一个地重新打开它们,直到你碰到了有问题的代码

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

您的代码中可能存在内存泄漏或需要寻址的副作用


祝您好运。

一如既往,您可以从拆分组件代码开始

一个接一个地重新打开它们,直到你碰到了有问题的代码

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

您的代码中可能存在内存泄漏或需要寻址的副作用


祝你好运。

死锁是DirectShow中常见的问题,听起来就是这样。您说过可以在进程冻结后将调试器附加到进程?如果你在那一点强行打断它,线程在哪里?如果任何线程的堆栈上都有您的代码,那么这就可以为您提供一个正在发生的事情的提示,即使它实际上已经深入到DirectShow代码中


如果调试器真的不起作用,那么下一个退路是在代码中添加日志消息,以查看冻结前发生的情况。

死锁是DirectShow中的常见问题,听起来就是这样。您说过可以在进程冻结后将调试器附加到进程?如果你在那一点强行打断它,线程在哪里?如果任何线程的堆栈上都有您的代码,那么这就可以为您提供一个正在发生的事情的提示,即使它实际上已经深入到DirectShow代码中

如果调试器真的不起作用,那么下一个退路是在代码中添加日志消息,以查看冻结之前发生了什么