비디오 캡처 프레임 속도를 설정하는 방법

비디오 캡처 디바이스는 다양한 프레임 속도를 지원할 수 있습니다. 이 정보를 사용할 수 있는 경우 최소 및 최대 프레임 속도는 미디어 형식 특성으로 저장됩니다.

attribute 설명
MF_MT_FRAME_RATE_RANGE_MAX 최대 프레임 속도.
MF_MT_FRAME_RATE_RANGE_MIN 최소 프레임 속도.

 

범위는 캡처 형식에 따라 달라질 수 있습니다. 예를 들어 프레임 크기가 클수록 최대 프레임 속도가 감소할 수 있습니다.

프레임 속도를 설정하려면 다음을 수행합니다.

  1. 캡처 디바이스에 대한 미디어 원본을 만듭니다. 비디오 캡처 디바이스 열거를 참조하세요.
  2. 미디어 원본에서 IMFMediaSource::CreatePresentationDescriptor 를 호출하여 프레젠테이션 설명자를 가져옵니다.
  3. IMFPresentationDescriptor::GetStreamDescriptorByIndex를 호출하여 비디오 스트림에 대한 스트림 설명자를 가져옵니다.
  4. 스트림 설명자에서 IMFStreamDescriptor::GetMediaTypeHandler 를 호출합니다.
  5. 비디오 캡처 형식을 설정하는 방법에 설명된 대로 캡처 형식을 열거합니다.
  6. 목록에서 원하는 출력 형식을 선택합니다.
  7. 미디어 형식에서 MF_MT_FRAME_RATE_RANGE_MAXMF_MT_FRAME_RATE_RANGE_MIN 특성을 쿼리합니다. 이 값은 지원되는 프레임 속도의 범위를 제공합니다. 디바이스는 이 범위 내의 다른 프레임 속도를 지원할 수 있습니다.
  8. 미디어 형식에서 MF_MT_FRAME 특성을 설정하여 원하는 프레임 속도를 지정합니다.
  9. 수정된 미디어 형식으로 IMFMediaTypeHandler::SetCurrentMediaType 을 호출합니다.

다음 예제에서는 프레임 속도를 디바이스가 지원하는 최대 프레임 속도와 동일하게 설정합니다.

HRESULT SetMaxFrameRate(IMFMediaSource *pSource, DWORD dwTypeIndex)
{
    IMFPresentationDescriptor *pPD = NULL;
    IMFStreamDescriptor *pSD = NULL;
    IMFMediaTypeHandler *pHandler = NULL;
    IMFMediaType *pType = NULL;

    HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
    if (FAILED(hr))
    {
        goto done;
    }

    BOOL fSelected;
    hr = pPD->GetStreamDescriptorByIndex(dwTypeIndex, &fSelected, &pSD);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pSD->GetMediaTypeHandler(&pHandler);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pHandler->GetCurrentMediaType(&pType);
    if (FAILED(hr))
    {
        goto done;
    }

    // Get the maximum frame rate for the selected capture format.

    // Note: To get the minimum frame rate, use the 
    // MF_MT_FRAME_RATE_RANGE_MIN attribute instead.

    PROPVARIANT var;
    if (SUCCEEDED(pType->GetItem(MF_MT_FRAME_RATE_RANGE_MAX, &var)))
    {
        hr = pType->SetItem(MF_MT_FRAME_RATE, var);

        PropVariantClear(&var);

        if (FAILED(hr))
        {
            goto done;
        }

        hr = pHandler->SetCurrentMediaType(pType);
    }

done:
    SafeRelease(&pPD);
    SafeRelease(&pSD);
    SafeRelease(&pHandler);
    SafeRelease(&pType);
    return hr;
}

비디오 캡처