1

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 ステートメントはありませんでした。何も役に立ちません。

ここで何が原因であるかについて誰かが何か考えを持っているなら、私は知りたい.

ありがとう、ロバート

4

2 に答える 2

1

デッドロックはDirectShowの一般的な問題であり、それが起こっているように聞こえます。プロセスがフリーズした後、デバッガーをプロセスにアタッチできるとおっしゃいましたか?その時点で強制的に壊した場合、スレッドはどこにありますか?いずれかのスレッドがスタックにコードを持っている場合、それが実際にDirectShowコードの奥深くに詰まっている場合でも、何が起こっているのかについてのヒントを与えることができます。

デバッガーが実際に機能していない場合、次のフォールバックは、コードにログメッセージを追加して、フリーズの直前に何が発生するかを確認することです。

于 2010-04-17T06:35:25.807 に答える
0

いつものように、コンポーネントコードを分割することから始めることができます。

問題のあるコードに到達するまで、それらを1つずつ再度オンにします。

問題のある領域を切り分けてみてください。ユニットテストを試してください。

コードにメモリリークまたは副作用があり、アドレス指定が必要な可能性があります。

幸運を。

于 2010-04-03T08:05:50.747 に答える