스크러빙을 수행하는 방법

스크러빙은 스크롤 막대와 같은 시간의 시각적 표현과 상호 작용하여 파일 내의 특정 지점을 즉시 검색하기 위해 수행됩니다. Media Foundation에서 스크러빙은 파일을 찾고 하나의 업데이트된 프레임을 가져오는 것을 의미합니다.

스크러빙에 대한 자세한 내용은 속도 제어 정보를 참조하세요.

스크러빙을 수행하려면

  1. MFGetService를 호출하여 미디어 세션에서IMFRateControl 인터페이스를 가져옵니다.

    참고

    미디어 원본에서 IMFRateControl 인터페이스를 가져올 수 없습니다. 항상 미디어 세션에서 인터페이스를 가져옵니다.

     

  2. IMFRateControl::SetRate를 호출하여 재생 속도를 0으로 설정합니다. 이 메서드를 호출하는 방법에 대한 자세한 내용은 미디어 세션에서 재생 속도를 설정하는 방법을 참조하세요.

  3. MFTIME 형식에서 검색할 프레젠테이션 시간을 지정하여 PROPVARIANT에서 검색 위치를 만듭니다.

  4. 재생을 시작하려면 검색 위치로 IMFMediaSession::Start 를 호출합니다.

  5. 스크럽 작업이 완료되면 미디어 세션에서 MESessionScrubSampleComplete 이벤트를 보냅니다. 다른 스크러빙 작업을 위해 시작을 다시 호출하기 전에 이 이벤트를 기다립니다.

예제

다음 코드 예제에서는 스크러빙을 수행하는 방법을 보여 줍니다.

HRESULT SkipToPosition (MFTIME SeekTime, IMFMediaSession *pMediaSession)
{
    PROPVARIANT var;
    PropVariantInit(&var);

    IMFRateControl *pRateControl = NULL;

    // Get the rate control service.
    HRESULT hr = MFGetService(pMediaSession, MF_RATE_CONTROL_SERVICE, IID_PPV_ARGS(&pRateControl));

    // Set the playback rate to zero without thinning.
    if(SUCCEEDED(hr))
    {
        hr = pRateControl ->SetRate( FALSE, 0.0F); 
    }

    // Create the Media Session start position.
    if( SeekTime == PRESENTATION_CURRENT_POSITION )
    {
        var.vt = VT_EMPTY;
    }
    else
    {
        var.vt = VT_I8;
        var.hVal.QuadPart = SeekTime;
    }

    // Start the Media Session.
    if(SUCCEEDED(hr))
    {
        hr = pMediaSession->Start( NULL, &var);
    }

// Clean up.
    SafeRelease(&pRateControl);
    PropVariantClear(&var)
    return hr;
}

모든 스트림 싱크가 새 프레임으로 업데이트되고 스크러빙 작업이 성공적으로 완료되면 스크러빙 작업이 성공하면 MESessionScrubSampleComplete 이벤트가 생성됩니다. 비디오 파일을 스크러빙하면 검색된 프레임이 표시되지만 오디오 출력은 생성되지 않습니다.

애플리케이션은 재생 속도를 0으로 설정한 다음 IMFMediaSession::Start 호출에서 VT_EMPTY 설정된 PROPVARIANT를 전달하여 프레임 스테핑을 수행할 수 있습니다.

미디어 세션

속도 제어