비디오 캡처 형식을 설정하는 방법
비디오 캡처 디바이스는 여러 캡처 형식을 지원할 수 있습니다. 형식은 일반적으로 압축 형식, 색 공간(YUV 또는 RGB), 프레임 크기 또는 프레임 속도에 따라 다릅니다.
지원되는 형식 목록은 프레젠테이션 설명자에 포함되어 있습니다. 자세한 내용은 프레젠테이션 설명자를 참조하세요.
지원되는 형식을 열거하려면 다음을 수행합니다.
- 캡처 디바이스에 대한 미디어 원본을 만듭니다. 비디오 캡처 디바이스 열거를 참조하세요.
- 미디어 원본에서 IMFMediaSource::CreatePresentationDescriptor 를 호출하여 프레젠테이션 설명자를 가져옵니다.
- IMFPresentationDescriptor::GetStreamDescriptorByIndex를 호출하여 비디오 스트림에 대한 스트림 설명자를 가져옵니다.
- 스트림 설명자에서 IMFStreamDescriptor::GetMediaTypeHandler 를 호출합니다.
- IMFMediaTypeHandler::GetMediaTypeCount를 호출하여 지원되는 형식의 수를 가져옵니다.
- 루프에서 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
이 예제에 사용된 함수는 미디어 형식 디버깅 코드 항목에 나열되어 있습니다.
캡처 형식을 설정하려면 다음을 수행합니다.
- 이전 예제와 같이 IMFMediaTypeHandler 인터페이스에 대한 포인터를 가져옵니다.
- IMFMediaTypeHandler::GetMediaTypeByIndex를 호출하여 인덱스로 지정된 원하는 형식을 가져옵니다.
- 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 형식을 무시해야 합니다.
관련 항목