DirectShow DirectShow 의 사용법 DirectShow 의 기본 태스크 필터 그래프의 시크 위치의 설정과 취득   [목차열람] [주소복사] [슬롯비우기]
위치의 설정과 취득
 
Microsoft DirectX 9.0

위치의 설정과 취득

필터 그래프는, 현재 위치와 정지 위치의 2 개의 위치값을 보관 유지한다. 이러한 위치는 다음과 같이 정의된다.

이러한 값을 얻어오려면,IMediaSeeking::GetPositions 메서드를 호출한다. 반환값은 항상 원의 미디어 소스에 대한 상대값이다. 디폴트에서는, 값은기준 타임 단위이다. 경우에 따라서는, 시간 단위를 변경할 수 있다. 더 자세한 정보는, 「시크 커멘드의 타임 포맷」을 참조할것.

새로운 위치에 시크 하는지, 새로운 정지 위치를 설정하려면 , 다음 예가 나타내듯이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 base class 라이브러리를 사용하고 있는 경우, 정수 UNITS 는 같은 값을 갖는다.

rtNow 파라미터는 새로운 현재 위치를 지정한다. 2 번째의 파라미터는,rtNow 의 해석 방법을 정의하는 플래그이다. 이 예로, AM_SEEKING_AbsolutePositioning 플래그는,rtNow 가 소스의 절대 위치를 지정하는 것을 나타내고 있다. 따라서, 필터 그래프는 스트림의 선두로부터 2 초의 위치에 시크 한다. rtStop 파라미터는 종료 타임을 지정한다. 마지막 파라미터는,rtStop 도 절대 위치인 것을 지정한다.

전의 위치값으로부터의 상대 위치를 지정하려면 , AM_SEEKING_RelativePositioning 플래그를 사용한다. 위치값의 어느쪽이든 1 개을 변경하지 않는 채 남기려면 , AM_SEEKING_NoPositioning 플래그를 사용한다. 그 경우, 대응하는 시간 파라미터는 NULL 이라도 좋다. 다음의 예에서는, 정지 위치를 변경하지 않고 , 10 초처까지 시크 한다.

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

필터 그래프를 정지 하면, 비디오 렌더러는 시크 조작 후에 이미지를 갱신하지 않는다. 사용자에 있어서는, 시크가 발생하지 않았는지와 같이 보인다. 이미지를 갱신하려면 , 시크 조작 후에 그래프를 포즈 한다. 그래프를 포즈 하는 것으로, 비디오 렌더러에 새로운 비디오 프레임이 삽입된다. 그래프를 포즈 한 후, 정지하는 IMediaControl::StopWhenReady 메서드를 사용하면 좋다.

↑TOP