다음을 통해 공유


비디오 캡처 형식을 설정하는 방법

비디오 캡처 디바이스는 여러 캡처 형식을 지원할 수 있습니다. 형식은 일반적으로 압축 형식, 색 공간(YUV 또는 RGB), 프레임 크기 또는 프레임 속도에 따라 다릅니다.

지원되는 형식 목록은 프레젠테이션 설명자에 포함되어 있습니다. 자세한 내용은 프레젠테이션 설명자를 참조하세요.

지원되는 형식을 열거하려면 다음을 수행합니다.

  1. 캡처 디바이스에 대한 미디어 원본을 만듭니다. 비디오 캡처 디바이스 열거를 참조하세요.
  2. 미디어 원본에서 IMFMediaSource::CreatePresentationDescriptor 를 호출하여 프레젠테이션 설명자를 가져옵니다.
  3. IMFPresentationDescriptor::GetStreamDescriptorByIndex를 호출하여 비디오 스트림에 대한 스트림 설명자를 가져옵니다.
  4. 스트림 설명자에서 IMFStreamDescriptor::GetMediaTypeHandler 를 호출합니다.
  5. IMFMediaTypeHandler::GetMediaTypeCount를 호출하여 지원되는 형식의 수를 가져옵니다.
  6. 루프에서 IMFMediaTypeHandler::GetMediaTypeByIndex 를 호출하여 각 형식을 가져옵니다. 형식은 미디어 형식으로 표시됩니다. 자세한 내용은 비디오 미디어 형식을 참조하세요.

다음 예제에서는 디바이스의 캡처 형식을 열거합니다.

HRESULT EnumerateCaptureFormats(IMFMediaSource *pSource)
{
    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(0, &fSelected, &pSD);
    if (FAILED(hr))
    {
        goto done;
    }

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

    DWORD cTypes = 0;
    hr = pHandler->GetMediaTypeCount(&cTypes);
    if (FAILED(hr))
    {
        goto done;
    }

    for (DWORD i = 0; i < cTypes; i++)
    {
        hr = pHandler->GetMediaTypeByIndex(i, &pType);
        if (FAILED(hr))
        {
            goto done;
        }

        LogMediaType(pType);
        OutputDebugString(L"\n");

        SafeRelease(&pType);
    }

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

LogMediaType 이 예제에 사용된 함수는 미디어 형식 디버깅 코드 항목에 나열되어 있습니다.

캡처 형식을 설정하려면 다음을 수행합니다.

  1. 이전 예제와 같이 IMFMediaTypeHandler 인터페이스에 대한 포인터를 가져옵니다.
  2. IMFMediaTypeHandler::GetMediaTypeByIndex를 호출하여 인덱스로 지정된 원하는 형식을 가져옵니다.
  3. IMFMediaTypeHandler::SetCurrentMediaType을 호출하여 형식을 설정합니다.

캡처 형식을 설정하지 않으면 디바이스에서 기본 형식을 사용합니다.

다음 예제에서는 캡처 형식을 설정합니다.

HRESULT SetDeviceFormat(IMFMediaSource *pSource, DWORD dwFormatIndex)
{
    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(0, &fSelected, &pSD);
    if (FAILED(hr))
    {
        goto done;
    }

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

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

    hr = pHandler->SetCurrentMediaType(pType);

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

형식이 반환되는 순서는 디바이스에 따라 다릅니다. 일반적으로 압축 유형 또는 색 공간에 따라 먼저 그룹화됩니다. 그런 다음, 가장 작은 프레임 크기에서 각 그룹 내에서 가장 큰 프레임 크기까지.

프레임 속도는 다른 형식 특성과 약간 다르게 처리됩니다. 자세한 내용은 비디오 캡처 프레임 속도를 설정하는 방법을 참조하세요.

참고

일부 디바이스에서 서식 목록에는 각 형식에 대한 중복 항목이 포함됩니다. 예를 들어 디바이스에서 15개의 고유 캡처 형식을 지원하는 경우 목록에는 30개의 항목이 포함됩니다. 각 쌍 내에서 미디어 유형 중 하나에는 특성이 FORMAT_VideoInfo MF_MT_AM_FORMAT_TYPE 있고 다른 하나는 MF_MT_AM_FORMAT_TYPEFORMAT_VideoInfo2 같게 됩니다. (이 두 값은 헤더 파일 uuids.h에 정의되어 있습니다.) 두 번째 형식은 추가 색 정보(확장 색 정보)를 포함하거나 인터레이스(MF_MT_INTERLACE_MODE)에 대해 다른 값을 표시할 수도 있습니다. 이러한 중복 형식은 이전 DirectShow 애플리케이션을 지원하기 위해 존재합니다. Media Foundation 애플리케이션에서는 중복 된 FORMAT_VideoInfo2 형식이 나열될 때마다 FORMAT_VideoInfo 형식을 무시해야 합니다.

 

비디오 캡처