2017-09-26 49 views
1

我使用Delphi XE和DSPack 2.3.3。 我正在維護一個帶攝像頭捕獲的桌面應用程序。用戶能夠捕捉訪客和文件的圖片。 一切工作正常。我們最大的客戶之一是轉向Citrix 7.13,網絡攝像機處於凍結狀態。DSPack,Citrix和SetSyncSource()

他們的支持聯繫思傑和Citrix工程想知道如果應用程序調用IMediaFilter :: SetSyncSource方法明確設置「參考時鐘」來過濾圖中他們對攝像頭捕獲的代碼。 我做了一些測試,實際上在渲染開始時有一個調用。運行DSPACK演示 「VideoCap」 時,您可以看到呼叫:

// 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源代碼註釋:

{ 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, 克萊門特

+0

我仍然有問題。我建立了一個絕對最小組件的小項目來開始視頻捕捉。無論我做什麼,都會調用SetSyncSource。例如,我認爲在TPanel中製作視頻顯示(而不是正確的大小形式)可能會觸發SetSyncSource。我讓相機全屏顯示,或者在浮動窗口中,它仍然會觸發SetSyncSource。我刪除了SampleGrabber,仍然觸發。 「Niled」一些參數,仍然觸發。 我不需要音頻。只有低分辨率的視頻。 –

回答

0

引述MSDN頁面上IMediaFilter::SetSyncSource

當圖形運行時,過濾器圖表管理器調用上圖中每個過濾器這種方法,通知他們該圖的參考時鐘。使用此方法來存儲IReferenceClock指針。增加存儲的指針的引用計數。在從圖表中刪除過濾器之前,Filter Graph Manager再次使用NULL值調用SetSyncSource。

這意味着無論您的代碼如何,都會調用SetSyncSource()。如果您使用的過濾器由於過濾器圖形稱爲SetSyncSource()方法而失速,那麼這看起來像是過濾器中的缺陷。

在這種情況下,潛在的解決方法是圍繞相關捕獲過濾器創建包裝過濾器,並轉發除SetSyncSource()之外的所有方法調用。但很可能這個問題有其他原因。

我敢打賭,將參考時鐘設置爲NULL將解決問題。爲此,您必須從IFilterGraph查詢IMediaFilter接口並致電SetSyncSource(NULL)。這將禁用圖形的整個時間,並以與生成時相同的速度渲染每個多媒體樣本。活源過濾圖

更多細節可以在這個MSDN頁面找到 - https://msdn.microsoft.com/en-us/library/windows/desktop/dd390645(v=vs.85).aspx

+0

就是這樣。感謝您幫助安東! –