위치 설정 및 검색

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

필터 그래프는 현재 위치와 중지 위치의 두 위치 값을 유지합니다. 다음과 같이 정의됩니다.

  • 그래프가 실행 중일 때 현재 위치는 원본의 시작 부분을 기준으로 현재 재생 위치입니다. 그래프가 중지되거나 일시 중지되면 현재 위치는 다음 실행 명령에서 스트리밍이 시작되는 지점입니다.
  • 중지 위치는 스트림이 종료되는 지점입니다. 그래프가 중지 위치에 도달하면 더 이상 데이터가 스트리밍되지 않으며 필터 그래프 관리자가 EC_COMPLETE 이벤트를 게시합니다. 그러나 그래프는 자동으로 중지된 상태로 전환되지 않습니다. 자세한 내용은 이벤트에 응답을 참조하세요.)

이러한 값을 검색하려면 IMediaSeeking::GetPositions 메서드를 호출합니다 . 반환된 값은 항상 원본 미디어 원본을 기준으로 합니다. 기본적으로 값은 참조 시간 단위에 있습니다. 경우에 따라 시간 단위를 변경할 수 있습니다. 자세한 내용은 Seek 명령의 시간 형식을 참조하세요.

새 위치를 찾거나 새 중지 위치를 설정하려면 다음 예제와 같이 IMediaSeeking::SetPositions 메서드를 호출합니다.

#define ONE_SECOND 10000000
REFERENCE_TIME rtNow  = 2 * ONE_SECOND, 
               rtStop = 5 * ONE_SECOND;

hr = pSeek->SetPositions(
    &rtNow,  AM_SEEKING_AbsolutePositioning, 
    &rtStop, AM_SEEKING_AbsolutePositioning
    );

참고

1초는 참조 시간 10,000,000단위입니다. 편의를 위해 이 값은 ONE_SECOND 정의합니다. DirectShow 기본 클래스 라이브러리를 사용하는 경우 상수 UNITS의 값은 동일합니다.

 

rtNow 매개 변수는 새 현재 위치를 지정합니다. 두 번째 매개 변수는 rtNow를 해석하는 방법을 정의하는 플래그입니다. 이 예제에서 AM_SEEKING_AbsolutePositioning 플래그는 rtNow 가 원본에서 절대 위치를 지정한다는 것을 나타냅니다. 따라서 필터 그래프는 스트림 시작 2초 후의 위치를 찾습니다. rtStop 매개 변수는 중지 시간을 제공합니다. 마지막 매개 변수는 rtStop 도 절대 위치임을 지정합니다.

이전 위치 값을 기준으로 위치를 지정하려면 AM_SEEKING_RelativePositioning 플래그를 사용합니다. 위치 값 중 하나를 변경하지 않은 상태로 두려면 AM_SEEKING_NoPositioning 플래그를 사용합니다. 이 경우 해당 시간 매개 변수는 NULL 일 수 있습니다. 다음 예제에서는 10초 앞으로 이동하지만 중지 위치는 변경되지 않습니다.

REFERENCE_TIME rtNow = 10 * ONE_SECOND;
hr = pSeek->SetPositions(
    &rtNow, AM_SEEKING_RelativePositioning, 
    NULL, AM_SEEKING_NoPositioning
    );

필터 그래프가 중지된 경우 비디오 렌더러는 검색 작업 후에 이미지를 업데이트하지 않습니다. 사용자에게는 검색이 수행되지 않은 것처럼 표시됩니다. 이미지를 업데이트하려면 검색 작업 후 그래프를 일시 중지합니다. 그래프를 일시 중지하면 비디오 렌더러에 대한 새 비디오 프레임이 표시됩니다. 그래프를 일시 중지한 다음 중지하는 IMediaControl::StopWhenReady 메서드를 사용할 수 있습니다.