다음을 통해 공유


그래프 클록 설정

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

필터 그래프를 작성할 때 필터 그래프 관리자는 그래프에 대한 참조 클록을 자동으로 선택합니다. 그래프의 모든 필터는 참조 클록에 동기화됩니다. 특히 렌더러 필터는 참조 클록을 사용하여 각 샘플의 프레젠테이션 시간을 결정합니다.

일반적으로 애플리케이션이 Filter Graph Manager의 참조 클록 선택을 재정의할 이유가 없습니다. 그러나 필터 그래프 관리자에서 IMediaFilter::SetSyncSource 메서드를 호출하여 이 작업을 수행할 수 있습니다. 이 메서드는 클록의 IReferenceClock 인터페이스에 대한 포인터를 사용합니다. 그래프가 중지되는 동안 메서드를 호출합니다.

필터가 클록을 제공하는 경우 필터에서 QueryInterface를 호출하여 IReferenceClock 포인터를 가져올 수 있습니다. 또는 외부 클록이 IReferenceClock을 구현하는 한 필터에서 제공하지 않는 외부 참조 클록을 구현할 수 있습니다. 다음 예제에서는 클록을 지정하는 방법을 보여줍니다.

IGraphBuilder *pGraph = 0;
IReferenceClock *pClock = 0;

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
    IID_IGraphBuilder, (void **)&pGraph);

// Build the graph.
pGraph->RenderFile(L"C:\\Example.avi", 0);

// Create your clock.
hr = CreateMyPrivateClock(&pClock);
if (SUCCEEDED(hr))
{
    // Set the graph clock.
    IMediaFilter *pMediaFilter = 0;
    pGraph->QueryInterface(IID_IMediaFilter, (void**)&pMediaFilter);
    pMediaFilter->SetSyncSource(pClock);
    pClock->Release();
    pMediaFilter->Release();
}

이 예제에서는 CreateMyPrivateClock이 클록을 만들고 IReferenceClock 포인터를 반환하는 애플리케이션 정의 함수라고 가정합니다.

값이 NULLSetSyncSource를 호출하여 클록 없이 실행되도록 필터 그래프를 설정할 수도 있습니다. 클록이 없으면 그래프가 가능한 한 빨리 실행됩니다. 클록이 없으므로 렌더러 필터는 샘플의 프레젠테이션 시간을 기다리지 않습니다. 대신 도착하자마자 각 샘플을 렌더링합니다. 실시간으로 미리 보는 대신 데이터를 신속하게 처리하려는 경우 그래프를 클록 없이 실행하도록 설정하는 것이 유용합니다.

기본 DirectShow 작업

CBaseReferenceClock 클래스

DirectShow의 시간 및 시계