2017-09-26 15 views
1

저는 Delphi XE 및 DSPack 2.3.3을 사용합니다. 웹캠 캡처로 데스크톱 응용 프로그램을 유지 관리하고 있습니다. 사용자는 방문자 및 문서의 사진을 캡처 할 수 있습니다. 모든 것이 잘 작동합니다. 가장 큰 고객 중 하나가 Citrix 7.13으로 이동하고 웹캠이 멈 추었습니다.DSPack, Citrix 및 SetSyncSource()

지원 담당자가 Citrix 및 Citrix Engineering에 문의하여 응용 프로그램이 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 소스 의견에 따르면 CaptureGraph.Play가 호출 된 후

{ 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 해고됩니다.

SetSyncSource를 호출하지 않도록 할 수 있습니까? 이것이이 문제를 해결할 수 있는지 알고 계십니까?

TIA, 클레망

+0

난 아직도 데 문제가 있습니다. 비디오 캡처를 시작하려면 절대 최소 구성 요소가있는 작은 프로젝트를 만들었습니다. 내가 무엇을해도 SetSyncSource가 호출됩니다. 예를 들어, 올바른 크기의 폼 대신 TPanel에서 비디오 디스플레이를 만들면 SetSyncSource가 트리거 될 수 있다고 생각했습니다. 카메라를 전체 화면 또는 부동 창에 표시하고 SetSyncSource를 계속 트리거합니다. SampleGrabber를 제거하고 여전히 트리거합니다. "Niled"일부 매개 변수가 여전히 트리거됩니다. 오디오가 필요하지 않습니다. 저해상도 비디오. –

답변

0

IMediaFilter::SetSyncSource에 MSDN 페이지를 인용 :

그래프의 실행은, 필터 그래프 매니저가 그래프의 모든 필터에이 메소드를 호출

는, 그래프 그들에게 통지 기준 클럭. 이 메서드를 사용하여 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

그게 전부입니다. 안톤을 도와 줘서 고마워! –