다음을 통해 공유


비디오 출력 형식 구성

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

참고

이 항목에 설명된 기능은 더 이상 사용되지 않습니다. 캡처 디바이스의 출력 형식을 구성하려면 애플리케이션이 pmt 매개 변수에서 IAMStreamConfig::GetFormat에서 반환한 AM_MEDIA_TYPE 구조를 사용해야 합니다.

 

캡처 디바이스는 다양한 출력 형식을 지원할 수 있습니다. 예를 들어 디바이스는 16비트 RGB, 32비트 RGB 및 YUYV를 지원할 수 있습니다. 이러한 각 형식 내에서 디바이스는 다양한 프레임 크기를 지원할 수 있습니다.

WDM 디바이스에서 IAMStreamConfig 인터페이스는 디바이스가 지원하는 형식을 보고하고 형식을 설정하는 데 사용됩니다. (레거시 VFW 디바이스의 경우 VFW 캡처 대화 상자 표시에 설명된 대로 비디오 형식 VFW 대화 상자를 사용합니다.) IAMStreamConfig 인터페이스는 캡처 필터의 캡처 핀, 미리 보기 핀 또는 둘 다에 노출됩니다. ICaptureGraphBuilder2::FindInterface 메서드를 사용하여 인터페이스 포인터를 가져옵니다.

IAMStreamConfig *pConfig = NULL;
hr = pBuild->FindInterface(
    &PIN_CATEGORY_PREVIEW, // Preview pin.
    0,    // Any media type.
    pCap, // Pointer to the capture filter.
    IID_IAMStreamConfig, (void**)&pConfig);

디바이스에는 지원하는 미디어 유형 목록이 있습니다. 각 미디어 유형에 대해 디바이스는 기능 집합도 제공합니다. 여기에는 해당 형식에 사용할 수 있는 프레임 크기 범위, 디바이스가 이미지를 확장 또는 축소할 수 있는 정도, 프레임 속도 범위가 포함됩니다.

미디어 형식의 수를 얻으려면 IAMStreamConfig::GetNumberOfCapabilities 메서드를 호출합니다. 메서드는 다음 두 값을 반환합니다.

  • 미디어 형식의 수입니다.
  • 기능 정보를 보유하는 구조체의 크기입니다.

IAMStreamConfig 인터페이스는 오디오 및 비디오 모두에 사용되며 다른 미디어 형식으로 확장될 수 있으므로 크기 값이 필요합니다. 비디오의 경우 기능은 VIDEO_STREAM_CONFIG_CAPS 구조를 사용하는 반면 오디오는 AUDIO_STREAM_CONFIG_CAPS 구조를 사용합니다.

미디어 형식을 열거하려면 0부터 시작하는 인덱 스를 사용하여 IAMStreamConfig::GetStreamCaps 메서드를 호출합니다. GetStreamCaps 메서드는 미디어 형식 및 해당 기능 구조를 반환합니다.

int iCount = 0, iSize = 0;
hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize);

// Check the size to make sure we pass in the correct structure.
if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS))
{
    // Use the video capabilities structure.

    for (int iFormat = 0; iFormat < iCount; iFormat++)
    {
        VIDEO_STREAM_CONFIG_CAPS scc;
        AM_MEDIA_TYPE *pmtConfig;
        hr = pConfig->GetStreamCaps(iFormat, &pmtConfig, (BYTE*)&scc);
        if (SUCCEEDED(hr))
        {
            /* Examine the format, and possibly use it. */

            // Delete the media type when you are done.
            DeleteMediaType(pmtConfig);
        }
}

GetStreamCaps 메서드에 구조체가 할당되는 방식을 확인합니다. 메서드는 미디어 형식 구조를 할당하는 반면 호출자는 기능 구조를 할당합니다. 기능 구조를 바이트 배열 포인터로 강제 변환합니다. 미디어 형식을 완료한 후 미디어 형식의 형식 블록과 함께 AM_MEDIA_TYPE 구조를 삭제합니다.

GetStreamCaps 메서드에서 반환된 형식을 사용하도록 디바이스를 구성할 수 있습니다. 미디어 형식으로 IAMStreamConfig::SetFormat 을 호출하기만 하면 됩니다.

hr = pConfig->SetFormat(pmtConfig);

핀이 연결되지 않은 경우 연결될 때 이 형식을 사용하려고 시도합니다. 핀이 이미 연결된 경우 새 형식을 사용하여 다시 연결하려고 시도합니다. 두 경우 모두 다운스트림 필터가 형식을 거부할 수 있습니다.

미디어 형식을 SetFormat 메서드에 전달하기 전에 수정할 수도 있습니다. 여기서 VIDEO_STREAM_CONFIG_CAPS 구조가 들어옵니다. 미디어 형식을 변경하는 모든 유효한 방법을 설명합니다. 이 정보를 사용하려면 해당 특정 미디어 유형의 세부 정보를 이해해야 합니다.

예를 들어 GetStreamCaps 가 프레임 크기가 320 x 240픽셀인 24비트 RGB 형식을 반환한다고 가정합니다. 미디어 형식의 주 형식, 하위 유형 및 형식 블록을 검사하여 이 정보를 가져올 수 있습니다.

if ((pmtConfig.majortype == MEDIATYPE_Video) &&
    (pmtConfig.subtype == MEDIASUBTYPE_RGB24) &&
    (pmtConfig.formattype == FORMAT_VideoInfo) &&
    (pmtConfig.cbFormat >= sizeof (VIDEOINFOHEADER)) &&
    (pmtConfig.pbFormat != NULL))
{
    VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)pmtConfig.pbFormat;
    // pVih contains the detailed format information.
    LONG lWidth = pVih->bmiHeader.biWidth;
    LONG lHeight = pVih->bmiHeader.biHeight;
}

VIDEO_STREAM_CONFIG_CAPS 구조체는 이 미디어 유형에 사용할 수 있는 최소 및 최대 너비와 높이를 제공합니다. 또한 너비 또는 높이를 조정할 수 있는 증분을 정의하는 "단계" 크기를 제공합니다. 예를 들어 디바이스는 다음을 반환할 수 있습니다.

  • MinOutputSize: 160 x 120
  • MaxOutputSize: 320 x 240
  • OutputGranularityX: 8픽셀(가로 단계 크기)
  • OutputGranularityY: 8픽셀(세로 단계 크기)

이러한 숫자를 감안할 때 너비를 범위의 모든 항목으로 설정할 수 있습니다 (160, 168, 176, ... 304, 312, 320) 및 범위 (120, 128, 136, ... 104, 112, 120). 다음 다이어그램에서는 이 프로세스를 보여 줍니다.

비디오 형식 크기

새 프레임 크기를 설정하려면 GetStreamCaps에서 반환된 AM_MEDIA_TYPE 구조를 직접 수정합니다.

pVih->bmiHeader.biWidth = 160;
pVih->bmiHeader.biHeight = 120;
pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader);

그런 다음 이전에 설명한 대로 미디어 형식을 SetFormat 메서드에 전달합니다.

VIDEO_STREAM_CONFIG_CAPSMinFrameIntervalMaxFrameInterval 멤버는 각 비디오 프레임의 최소 및 최대 길이이며 다음과 같이 프레임 속도로 변환할 수 있습니다.

frames per second = 10,000,000 / frame duration

특정 프레임 속도를 요청하려면 미디어 형식의 VIDEOINFOHEADER 또는 VIDEOINFOHEADER2 구조체에서 AvgTimePerFrame 값을 수정합니다. 디바이스는 최소값과 최댓값 사이의 가능한 모든 값을 지원하지 않을 수 있으므로 드라이버는 가능한 가장 가까운 값을 사용합니다. 드라이버가 실제로 사용한 값을 확인하려면 SetFormat을 호출한 후 IAMStreamConfig::GetFormat을 호출합니다.

일부 드라이버는 MaxFrameInterval 값에 대해 MAXLONGLONG(0x7FFFFFFFFFFFFFFF)을 보고할 수 있습니다. 이는 사실상 최대 기간이 없음을 의미합니다. 그러나 애플리케이션에서 최소 프레임 속도(예: 1fps)를 적용할 수 있습니다.

미디어 유형 정보

비디오 캡처 디바이스 구성