다음을 통해 공유


타임스탬프

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

타임스탬프는 스트림 시간으로 측정된 미디어 샘플의 시작 및 완료 시간을 정의합니다. 타임스탬프를 프레젠테이션 시간이라고도 합니다. 이 문서의 나머지 부분을 읽을 때 모든 형식이 동일한 방식으로 타임스탬프를 사용하는 것은 아니라는 점을 기억해야 합니다. 예를 들어 모든 MPEG 샘플에 타임스탬프를 적용하는 것은 아닙니다. MPEG 필터 그래프에서 타임스탬프는 디코더에서 출력될 때까지 각 프레임에 적용되지 않습니다.

렌더러 필터는 샘플을 받으면 타임스탬프를 기반으로 렌더링을 예약합니다. 샘플이 늦게 도착하거나 타임스탬프를 가지고 있지 않으면 필터는 샘플을 즉시 렌더링합니다. 그렇지 않으면 필터가 샘플을 렌더링하기 전에 샘플의 시작 시간까지 기다립니다. ( IReferenceClock::AdviseTime 메서드를 호출하여 시작 시간을 기다립니다.)

원본 필터 및 파서 필터는 처리하는 샘플에서 올바른 타임스탬프를 설정해야 합니다. 다음 지침을 사용합니다.

  • 파일 재생: 첫 번째 샘플은 시작 시간이 0인 타임스탬프를 지정합니다. 후속 타임스탬프는 샘플 길이 및 재생 속도에 따라 결정되며, 그 자체는 파일 형식에 따라 결정됩니다. 파일을 구문 분석하는 필터는 올바른 타임스탬프를 계산합니다(예: AVI 분할자).
  • 비디오 및 오디오 캡처: 모든 샘플은 캡처된 스트림 시간과 동일한 시작 시간으로 타임스탬프를 찍습니다. 다음과 같은 주의 사항이 있습니다.
    • 미리 보기 핀의 비디오 프레임(캡처 핀과 반대)은 타임스탬프를 지정하지 않습니다. 그래프 대기 시간으로 인해 캡처 시간으로 스탬프가 지정된 비디오 프레임은 항상 비디오 렌더러에 늦게 도착합니다. 이로 인해 렌더러가 품질 제어를 위해 프레임을 삭제할 수 있습니다. 품질 제어에 대한 자세한 내용은 품질 제어 관리를 참조하세요.
    • 오디오 캡처: 오디오 캡처 필터는 오디오 드라이버에서 사용하는 버퍼와는 별개인 자체 버퍼 집합을 사용합니다. 오디오 드라이버는 고정된 간격으로 캡처 필터의 버퍼를 채웁니다. 간격은 드라이버에 따라 달라지지만 일반적으로 10밀리초를 넘지 않습니다. 오디오 샘플의 타임스탬프는 드라이버가 오디오 캡처 필터의 버퍼를 채운 시간을 반영합니다. 특히 애플리케이션이 매우 작은 버퍼 크기를 사용하는 경우 이러한 시간은 약간 부정확할 수 있습니다. 그러나 미디어 시간은 버퍼의 오디오 샘플 수를 정확하게 반영합니다.
  • Mux 필터: 출력 형식에 따라 mux 필터가 타임스탬프를 생성해야 하거나 생성하지 않을 수 있습니다. 예를 들어 AVI 파일 형식은 타임스탬프를 사용하지 않고 고정 프레임 속도를 사용하므로 AVI Mux 필터는 샘플이 거의 적절한 시간에 도착한다고 가정합니다. 그러나 들어오는 타임스탬프는 한 프레임보다 큰 간격을 표시하는 경우 AVI Mux는 크기가 0인 인덱스 항목을 작성하여 삭제된 프레임을 나타냅니다. 파일 재생 시 이전에 설명한 대로 런타임에 새 타임스탬프를 생성합니다.

샘플에서 타임스탬프를 설정하려면 IMediaSample::SetTime 메서드를 호출합니다.

미디어 타임즈

필요에 따라 필터는 샘플의 미디어 시간을 지정할 수도 있습니다. 비디오 스트림에서 미디어 시간은 프레임 번호를 나타냅니다. 오디오 스트림에서 미디어 시간은 패킷의 샘플 번호를 나타냅니다. 예를 들어 각 패킷에 44.1kHz 오디오의 1초가 포함된 경우 첫 번째 패킷의 미디어 시작 시간은 0이고 미디어 중지 시간은 44100입니다. 검색 가능한 스트림에서 미디어 시간은 항상 스트림의 시작 시간을 기준으로 합니다. 예를 들어 15fps 비디오 스트림의 시작부터 2초까지 노력한다고 가정해 보겠습니다. 검색 후 첫 번째 미디어 샘플에는 타임스탬프는 0이지만 미디어 시간은 30입니다.

렌더러 및 mux 필터는 미디어 시간을 사용하여 간격을 확인하여 프레임 또는 샘플이 삭제되었는지 여부를 확인할 수 있습니다. 그러나 미디어 시간을 설정하기 위해 필터가 필요하지 않습니다. 샘플에서 미디어 시간을 설정하려면 IMediaSample::SetMediaTime 메서드를 호출합니다.

DirectShow의 시간 및 시계