그래프 클록 설정
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media 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 포인터를 반환하는 애플리케이션 정의 함수라고 가정합니다.
값이 NULL인 SetSyncSource를 호출하여 클록 없이 실행되도록 필터 그래프를 설정할 수도 있습니다. 클록이 없으면 그래프가 가능한 한 빨리 실행됩니다. 클록이 없으므로 렌더러 필터는 샘플의 프레젠테이션 시간을 기다리지 않습니다. 대신 도착하자마자 각 샘플을 렌더링합니다. 실시간으로 미리 보는 대신 데이터를 신속하게 처리하려는 경우 그래프를 클록 없이 실행하도록 설정하는 것이 유용합니다.
관련 항목