2017-09-26 29 views
1

私はDelphi XEとDSPack 2.3.3を使用しています。 私はWebcamキャプチャでデスクトップアプリケーションを維持しています。ユーザーは訪問者と文書の写真を撮ることができます。 すべて正常に動作しています。当社の最大の顧客の1人がCitrix 7.13に移行しており、ウェブカメラはフリーズしています。DSPack、Citrix、SetSyncSource()

CitrixとCitrixエンジニアは、アプリケーションがIMediaFilter :: SetSyncSourceメソッドを呼び出して、Webcamキャプチャに関するコードのフィルタグラフに明示的に「参照クロック」を設定するかどうかを知りたいと考えます。 私はいくつかのテストを行い、レンダリングが始まると実際にコールがあります。 DSpackソースのコメントによると

// now render streams 
    with CaptureGraph as IcaptureGraphBuilder2 do 
    begin 
    // set the output filename 
    SetOutputFileName(MEDIASUBTYPE_Avi, PWideChar(CapFile), multiplexer, Writer); 

    // Connect Video preview (VideoWindow) 
    if VideoSourceFilter.BaseFilter.DataLength > 0 then 
     RenderStream(@PIN_CATEGORY_PREVIEW, nil, VideoSourceFilter as IBaseFilter, 
     nil , VideoWindow as IBaseFilter); 

    // Connect Video capture streams 
    if VideoSourceFilter.FilterGraph <> nil then 
     RenderStream(@PIN_CATEGORY_CAPTURE, nil, VideoSourceFilter as IBaseFilter, 
     nil, multiplexer as IBaseFilter); 

    // Connect Audio capture streams 
    if AudioSourceFilter.FilterGraph <> nil then 
    begin 

     RenderStream(nil, nil, AudioSourceFilter as IBaseFilter, 
     nil, multiplexer as IBaseFilter); 
    end; 
    end; 
    CaptureGraph.Play; 

:あなたはDSPackデモ "VideoCap" を実行しているときに電話を見ることができます

{ The reference clock has changed. The filter graph manager sends this event 
    when its IMediaFilter.SetSyncSource method is called.} 
property OnGraphClockChanged: TNotifyEvent read FOnGraphClockChanged write FOnGraphClockChanged; 

、実際にOnGraphClockChanged CaptureGraph.Playが呼び出された後に解雇されます。

SetSyncSourceの呼び出しを避けることはできますか? これでこの問題が解決するかどうかは分かりますか?

TIA、 IMediaFilter::SetSyncSource上のMSDNのページを引用クレマン

+0

私はまだ問題を抱えています。私はビデオキャプチャを開始するための絶対最小構成要素を持つ小さなプロジェクトを構築しました。私が何をするにしても、SetSyncSourceが呼び出されます。例えば、正しいサイズのフォームとは対照的に、TPanelでビデオ表示を行うと、SetSyncSourceがトリガされる可能性があります。カメラをフルスクリーンで表示させるか、フローティングウィンドウで表示させ、それでもSetSyncSourceをトリガーします。私はSampleGrabberを削除して、引き続きトリガーします。いくつかのパラメータを「ネイル」しても、引き続きトリガします。 私はオーディオを必要としません。低解像度のビデオ。 –

答えて

0

グラフを実行すると、フィルターグラフマネージャーはグラフを通知するために、グラフ内のすべてのフィルタでこのメソッドを呼び出します基準クロック。このメソッドを使用して、IReferenceClockポインタを格納します。格納されているポインタの参照カウントをインクリメントします。フィルターがグラフから削除される前に、フィルターグラフマネージャーは値がNULLのSetSyncSourceを再度呼び出します。

これは、コードに関係なくSetSyncSource()が呼び出されることを意味します。使用しているフィルタが、それがSetSyncSource()メソッドと呼ばれるフィルタグラフのためにストールしている場合、これはフィルタの不具合のようです。

この場合、問題のキャプチャフィルタの周りにラッパーフィルタを作成し、SetSyncSource()を除くすべてのメソッド呼び出しを転送することが考えられます。しかし、おそらくこの問題には他の原因があります。

私は、リファレンスクロックをNULLに設定することで問題は解決されます。これを行うにはIMediaFilterインターフェイスをIFilterGraphから問い合わせてSetSyncSource(NULL)と呼ぶ必要があります。これにより、グラフのタイミング全体が無効になり、すべてのマルチメディアサンプルが生成されるのと同じ速度でレンダリングされます。ライブソースフィルタグラフ上

詳細は、このMSDNのページで見つけることができます - https://msdn.microsoft.com/en-us/library/windows/desktop/dd390645(v=vs.85).aspx

+0

それはそれです。 Antonさんに感謝します! –

関連する問題