다음을 통해 공유


라이브 소스

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

푸시 소스라고도 하는 라이브 소스는 실시간으로 데이터를 받습니다. 예를 들어 비디오 캡처 및 네트워크 브로드캐스트가 있습니다. 일반적으로 라이브 원본은 데이터가 도착하는 속도를 제어할 수 없습니다.

다음 중 하나가 true인 경우 필터는 라이브 원본으로 간주됩니다.

라이브 소스 필터가 클록을 제공하는 경우 필터 그래프 관리자는 그래프 참조 클록을 선택할 때 해당 클록을 선호합니다. 자세한 내용은 참조 클록을 참조하세요.

대기 시간

필터의 대기 시간은 필터가 샘플을 처리하는 데 걸리는 시간입니다. 라이브 원본의 경우 대기 시간은 샘플을 보관하는 데 사용되는 버퍼의 크기에 따라 결정됩니다. 예를 들어 필터 그래프에 대기 시간이 33밀리초(밀리초)인 비디오 원본과 대기 시간이 500ms인 오디오 원본이 있다고 가정합니다. 각 비디오 프레임은 일치하는 오디오 샘플이 오디오 렌더러에 도달하기 전에 약 470ms의 비디오 렌더러에 도착합니다. 그래프가 차이를 보정하지 않는 한 오디오와 비디오는 동기화되지 않습니다.

라이브 원본은 IAMPushSource 인터페이스를 통해 동기화할 수 있습니다. 애플리케이션이 IAMGraphStreams::SyncUsingStreamOffset 메서드를 호출하여 동기화를 사용하도록 설정하지 않는 한 Filter Graph Manager는 라이브 원본을 동기화하지 않습니다. 동기화를 사용하도록 설정하면 Filter Graph Manager가 IAMPushSource에 대한 각 원본 필터를 쿼리합니다. 필터가 IAMPushSource를 지원하는 경우 필터 그래프 관리자는 IAMLatency::GetLatency 를 호출하여 필터의 예상 대기 시간을 검색합니다. ( IAMPushSource 인터페이스는 IAMLatency를 상속합니다.) 결합된 대기 시간 값에서 Filter Graph Manager는 그래프에서 예상되는 최대 대기 시간을 결정합니다. 그런 다음 IAMPushSource::SetStreamOffset 을 호출하여 각 소스 필터에 스트림 오프셋을 부여합니다. 이 오프셋은 생성되는 타임스탬프에 추가됩니다.

이 메서드는 주로 라이브 미리 보기용입니다. 그러나 라이브 캡처 디바이스(예: 카메라)의 미리 보기 핀은 제공하는 샘플에 타임스탬프를 설정하지 않습니다. 따라서 라이브 캡처 디바이스에서 이 메서드를 사용하려면 캡처 핀에서 미리 보기해야 합니다. 자세한 내용은 DirectShow Video Capture Filters(DirectShow Video Capture Filters)를 참조하세요.

현재 IAMPushSource 인터페이스는 VFW 캡처 필터 및 오디오 캡처 필터에서 지원됩니다.

속도 일치

렌더러 필터가 하나의 참조 클록을 사용하여 샘플을 예약하지만 원본 필터가 다른 클록을 사용하여 샘플을 생성하는 경우 재생 시 결함이 발생할 수 있습니다. 렌더러가 원본보다 빠르게 실행되어 데이터의 간격이 발생할 수 있습니다. 또는 원본보다 느리게 실행되어 어느 시점에서 그래프가 샘플을 삭제할 때까지 샘플이 "다발"될 수 있습니다. 일반적으로 라이브 소스는 프로덕션 속도를 제어할 수 없으므로 렌더러는 원본과 속도를 일치시켜야 합니다.

현재 오디오 재생의 결함은 비디오의 결함보다 더 눈에 띄기 때문에 오디오 렌더러만 속도 일치를 수행합니다. 속도 일치를 수행하려면 오디오 렌더러가 속도와 일치하는 항목을 선택해야 합니다. 다음 알고리즘을 사용합니다.

  • 그래프가 참조 클록을 사용하지 않는 경우 오디오 렌더러는 속도와 일치하려고 하지 않습니다. (그래프에 참조 클록이 없을 때마다 샘플은 도착하는 즉시 항상 렌더링됩니다.)
  • 그렇지 않으면 그래프에 대한 참조 클록이 있는 경우 오디오 렌더러는 이전에 설명한 조건을 사용하여 라이브 소스 업스트림 있는지 확인합니다. 그렇지 않은 경우 오디오 렌더러는 속도와 일치하지 않습니다.
  • 라이브 소스 업스트림 있고 해당 원본이 출력 핀에 IAMPushSource 인터페이스를 노출하는 경우 오디오 렌더러는 IAMPushSource::GetPushSourceFlags를 호출합니다. 다음 플래그 중 하나를 찾습니다.
    • AM_PUSHSOURCECAPS_INTERNAL_RM. 이 플래그는 원본 필터에 고유한 속도 일치 메커니즘이 있으므로 오디오 렌더러가 속도와 일치하지 않음을 의미합니다.
    • AM_PUSHSOURCECAPS_NOT_LIVE. 이 플래그는 원본 필터가 IAMPushSource 인터페이스를 노출하더라도 실제로 라이브 원본이 아님을 의미합니다. 따라서 오디오 렌더러는 속도와 일치하지 않습니다.
    • AM_PUSHSOURCECAPS_PRIVATE_CLOCK. 이 플래그는 원본 필터가 프라이빗 클록을 사용하여 타임스탬프를 생성한다는 것을 의미합니다. 이 경우 오디오 렌더러는 타임스탬프를 대비한 속도와 일치합니다. 그러나 샘플에 타임스탬프를 갖지 않으면 렌더러는 이 플래그를 무시합니다.
  • GetPushSourceFlags가 플래그(0)를 반환하지 않으면 오디오 렌더러의 동작은 그래프 클록과 샘플에 타임스탬프가 있는지 여부에 따라 달라집니다.
    • 오디오 렌더러가 그래프 시계가 아니고 샘플에 타임스탬프가 있는 경우 오디오 렌더러는 타임스탬프에 대한 속도와 일치합니다.
    • 샘플에 타임스탬프를 포함하지 않는 경우 오디오 렌더러는 들어오는 오디오 데이터의 속도와 일치하려고 시도합니다.
    • 오디오 렌더러가 그래프 클록인 경우 들어오는 데이터 속도와 일치하려고 시도합니다.

마지막 사례의 이유는 다음과 같습니다. 오디오 렌더러가 참조 클록이고 소스 필터가 동일한 클록을 사용하여 타임스탬프를 생성하는 경우 오디오 렌더러는 타임스탬프를 기준으로 속도를 일치시킬 수 없습니다. 만약 그렇게 했다면, 사실상 그 자체로 속도를 일치시키려고 할 것이고, 이는 시계가 표류하게 할 수 있습니다. 따라서 이 경우 렌더러는 들어오는 오디오 데이터의 속도와 일치합니다.

DirectShow의 시간 및 시계