다음을 통해 공유


참조 클록

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

Filter Graph Manager의 한 가지 함수는 그래프의 모든 필터를 참조 클록이라고 하는 동일한 클록과 동기화하는 것입니다.

IReferenceClock 인터페이스를 노출하는 모든 개체는 참조 클록 역할을 할 수 있습니다. 참조 클록은 DirectShow 필터(일반적으로 하드웨어 타이머에 대한 액세스 권한이 있는 오디오 렌더러)에서 제공할 수 있습니다. 대체로 필터 그래프 관리자는 시스템 시간을 사용할 수 있습니다.

명목상 참조 클록은 100나노초 간격으로 시간을 측정하지만 클록의 실제 정확도는 더 적을 수 있습니다. 클록의 현재 시간을 검색하려면 IReferenceClock::GetTime 메서드를 호출합니다. 계산을 시작하는 시간인 클록의 기준은 구현에 따라 달라지므로 GetTime 에서 반환되는 값은 본질적으로 의미가 없습니다. 중요한 것은 그래프가 실행되기 시작한 시점의 델타입니다.

참조 클록의 정확도는 다를 수 있지만 GetTime 메서드에서 반환되는 시간은 단조로 증가합니다. 즉, 시계 시간은 결코 뒤로 이동하지 않습니다. 참조 클록이 하드웨어 원본에서 클록 시간을 생성하고 하드웨어 클록이 뒤로 이동하는 경우(예: 클록에 대한 조정이 있는 경우) GetTime 메서드는 하드웨어 시계가 따라잡을 때까지 마지막으로 보고된 시간을 계속 반환해야 합니다. 자세한 내용은 CBaseReferenceClock 클래스를 참조하세요.

기본 참조 클록

그래프가 실행되면 필터 그래프 관리자가 참조 클록을 자동으로 선택합니다. 다음 알고리즘을 사용하여 클록을 선택합니다.

  • 애플리케이션에서 클록을 선택한 경우(아래 참조) 해당 클록을 사용합니다.
  • 그래프에 IReferenceClock을 지원하는 라이브 원본 필터가 포함된 경우 해당 필터를 사용합니다. 라이브 원본의 정의는 라이브 원본을 참조하세요.
  • 그래프에 라이브 원본 필터가 없는 경우 렌더러에서 시작하여 작업 업스트림 IReferenceClock을 지원하는 그래프의 필터를 사용합니다. 연결되지 않은 필터보다 연결된 필터를 사용하는 것이 좋습니다. (그래프가 오디오 스트림을 렌더링하는 경우 알고리즘의 이 단계에서는 일반적으로 오디오 렌더러 필터를 선택합니다.)
  • 필터가 적절한 클록을 제공하지 않는 경우 시스템 시간을 기반으로 하는 시스템 참조 클록을 사용합니다.

참조 클록 설정

애플리케이션은 필터 그래프 관리자에서 IMediaFilter::SetSyncSource 메서드를 호출하여 클록을 선택할 수 있습니다. 다른 시계를 선호하는 특별한 이유가 있는 경우에만 이 작업을 수행해야 합니다.

SetSyncSourceNULL 값으로 호출하여 참조 클록을 사용하지 않도록 필터 그래프 관리자에 지시할 수 있습니다. 예를 들어 가능한 한 빨리 샘플을 처리하도록 이 작업을 수행할 수 있습니다. 기본 참조 클록을 복원하려면 필터 그래프 관리자에서 IFilterGraph::SetDefaultSyncSource 메서드를 호출합니다.

참조 클록이 변경되면 Filter Graph Manager는 IMediaFilter::SetSyncSource 메서드를 호출하여 각 필터에 알립니다. 애플리케이션은 필터에서 이 메서드를 호출해서는 안 됩니다.

그래프 클록 설정

DirectShow의 시간 및 시계