Delphi Pro 6 と DSPACK DirectShow ライブラリを使用して、Skype で使用する DirectShow プッシュ フィルタを作成しました。プレビュー モードで、Skype クライアントの [ビデオ設定] ウィンドウでビデオ入力デバイスをテストすると、フィルタは問題なく動作します。エラーなしで何分間も稼働させておくことができます。
ただし、10 ~ 24 秒後にビデオ通話を開始すると、ビデオ フィードがフリーズすることはありません。通話は問題なく継続し、通話時間カウンターは秒単位でカチッと音を立てますが、ビデオ フィードは機能せず、フリーズが発生したフレームに固執します (ただし、しばらくすると黒くなりますが、これは Skype がフィルターをあきらめたことを意味すると思います)。すべてのメソッド呼び出しに文字通り設定されたブレークポイントを使用して、デバッガーからプロセスにアタッチしようとしましたが、フリーズが発生すると、それらのどれもヒットしません。Skype に代わってフィルターに DirectShow FillBuffer() 呼び出しを行うスレッドが停止しているか、シャットダウンされているかのようです。
Skype 通話中に、Skype ビデオ通話の進行中に奇妙な int 1 および int 3 デバッガーのハード割り込み呼び出しが発生するため、デバッガーでフィルターを追跡できません。この動作は、標準の Web カメラ入力デバイスが選択されていて、DirectShow フィルターが ActiveX サーバーとして完全に登録されていない場合でも発生します。ビデオ入力プレビューモードでは発生しないため、「アンチデバッグ」コードである可能性があります。いずれにせよ、それが、呼び出された FillBuffer() がまだ呼び出されているかどうかを確認するために、事後にプロセスにアタッチする必要があり、代わりにそれが死んでいるように見えることを発見した理由です。
私のプレーンなバニラ USB Web カメラの DirectShow フィルターは、フリーズ動作を示さず、何分間も正常に動作することに注意してください。私のフィルターには、Skype が気に入らない部分があります。FillBuffer() 呼び出しで事実上何もせずに、さまざまな間隔の Sleep() ステートメントを試しましたが、Sleep ステートメントはありませんでした。何も役に立ちません。
ここで何が原因であるかについて誰かが何か考えを持っているなら、私は知りたい.
ありがとう、ロバート