2010-04-03 75 views
1

我已經使用Delphi Pro 6和DSPACK DirectShow庫編寫了Skype使用的DirectShow推送過濾器。在預覽模式下,當您在Skype客戶端視頻設置窗口中測試視頻輸入設備時,我的過濾器完美無缺地工作。我可以保持它運行許多分鐘而不會出錯。DirectShow過濾器我在Skype視頻通話中寫了10-24秒後死亡

但是,當我在10到24秒後開始視頻通話時,視頻輸入會凍結。通話持續時間計數器點擊秒數後,通話仍然正常,但視頻輸入已死,停留在發生凍結的任何幀(雖然過了很長一段時間,它變成黑色,我相信Skype意味着放棄了過濾器)。我嘗試從我的調試器中附加一個斷點,在每次方法調用時都設置一個斷點,並且一旦發生凍結,它們都不會被命中。就好像讓DirectShow FillBuffer()調用我的過濾器代表Skype的線程已經死機或者已經關閉了一樣。

我無法在調試器中跟蹤我的過濾器,因爲在Skype調用期間,當Skype視頻通話正在進行時,我得到了奇怪的int 1和int 3調試器硬中斷呼叫。即使選擇了我的標準網絡攝像頭輸入設備,並且我的DirectShow過濾器作爲ActiveX服務器完全取消註冊,也會發生此行爲。我懷疑它可能是一些「反調試」代碼,因爲它不會在視頻輸入預覽模式下發生。無論哪種方式,這就是爲什麼我必須在事實之後重視流程,以查看我調用的FillBuffer()是否仍然被調用,而發現它看起來已經死亡。

請注意,我的普通香草USB網絡攝像頭的DirectShow濾鏡不會顯示凍結行爲,並且可以在很多分鐘內正常工作。 Skype不喜歡我的過濾器。我已經嘗試了Sleep()語句的變化間隔,沒有Sleep語句,在FillBuffer()調用中幾乎沒有做任何事情。沒什麼幫助。

如果任何人有任何想法可能是這裏的罪魁禍首,我想知道。

感謝, 羅伯特

回答

0

與往常一樣,您可以通過拆分組件代碼中開始。

再一次打開它們,直到你碰到有問題的代碼。

嘗試隔離您的問題區域。 嘗試單元測試。

您的代碼中可能存在內存泄漏或副作用,需要尋址。

祝你好運。

1

死鎖是DirectShow中的一個常見問題,聽起來就像是發生了什麼事情。你說你可以在程序凍結後附加一個調試器到你的程序中去?如果你在這個時候強行打破它,線程在哪裏?如果任何線程在堆棧中都有你的代碼,那麼它可以給你提示發生了什麼,即使它實際上深陷在DirectShow代碼中。

如果調試器確實沒有正常工作,那麼下一個回退是使用日誌消息來處理代碼,以查看凍結之前會發生什麼。