미디어 유형 정보(DirectShow)

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

DirectShow는 모듈식이므로 필터 그래프의 각 지점에서 데이터 형식을 설명하는 방법이 필요합니다. 예를 들어 AVI 재생을 고려합니다. 데이터는 RIFF 청크의 스트림으로 그래프를 입력합니다. 이들은 비디오 및 오디오 스트림으로 구문 분석됩니다. 비디오 스트림은 압축된 비디오 프레임으로 구성됩니다. 디코딩 후 비디오 스트림은 일련의 압축되지 않은 비트맵입니다. 오디오 스트림도 비슷한 과정을 거치게 됩니다.

미디어 형식: DirectShow가 형식을 나타내는 방법

미디어 유형은 디지털 미디어 형식을 설명하는 범용적이고 확장 가능한 방법입니다. 두 필터가 연결되면 미디어 유형에 동의합니다. 미디어 형식은 업스트림 필터가 다운스트림 필터에 제공할 데이터의 종류와 데이터의 실제 레이아웃을 식별합니다. 두 개의 필터가 미디어 형식에 동의할 수 없는 경우 연결되지 않습니다.

일부 애플리케이션의 경우 미디어 유형에 대해 걱정할 필요가 없습니다. 예를 들어 파일 재생에서 DirectShow는 모든 세부 정보를 처리합니다. 다른 종류의 애플리케이션은 미디어 형식으로 직접 작업해야 할 수 있습니다.

미디어 형식은 AM_MEDIA_TYPE 구조를 사용하여 정의됩니다. 이 구조체에는 다음 정보가 포함됩니다.

  • 주 형식: 주 형식은 데이터의 전체 범주를 정의하는 GUID입니다. 주요 유형으로는 비디오, 오디오, 분리된 바이트 스트림, MIDI 데이터 등이 있습니다.

  • 하위 형식: 하위 형식은 형식을 추가로 정의하는 또 다른 GUID입니다. 예를 들어 비디오 주 형식 내에는 RGB-24, RGB-32, UYVY 등에 대한 하위 형식이 있습니다. 오디오 내에는 PCM 오디오, MPEG-1 페이로드 등이 있습니다. 하위 형식은 주 형식보다 더 많은 정보를 제공하지만 형식에 대한 모든 정보를 정의하지는 않습니다. 예를 들어 비디오 하위 형식은 이미지 크기 또는 프레임 속도를 정의하지 않습니다. 이러한 형식은 아래에 설명된 형식 블록에 의해 정의됩니다.

  • 서식 블록: 형식 블록은 형식을 자세히 설명하는 데이터 블록입니다. 형식 블록은 AM_MEDIA_TYPE 구조와 별도로 할당됩니다. AM_MEDIA_TYPE 구조체의 pbFormat 멤버는 형식 블록을 가리킵니다.

    형식 블록의 레이아웃이 미디어 형식에 따라 변경되므로 pbFormat 멤버는 void* 로 입력됩니다. 예를 들어 PCM 오디오는 WAVEFORMATEX 구조를 사용합니다. 비디오는 VIDEOINFOHEADER 및 VIDEOINFOHEADER2를 비롯한 다양한 구조를 사용합니다. AM_MEDIA_TYPE 구조체의 formattype 멤버는 형식 블록에 포함된 구조를 지정하는 GUID입니다. 각 형식 구조에는 GUID가 할당됩니다. cbFormat 멤버는 형식 블록의 크기를 지정합니다. pbFormat 포인터를 역참조하기 전에 항상 이러한 값을 검사.

형식 블록이 채워지면 주 형식 및 하위 형식에 중복 정보가 포함됩니다. 그러나 주 형식 및 하위 형식은 전체 형식 블록 없이 서식을 식별하는 편리한 방법을 제공합니다. 예를 들어 이미지 크기 및 프레임 속도와 같이 VIDEOINFOHEADER 구조에 필요한 모든 정보를 알지 못하고 제네릭 24비트 RGB 형식(MEDIASUBTYPE_RGB24)을 지정할 수 있습니다.

예를 들어 필터는 다음 코드를 사용하여 미디어 형식을 검사 수 있습니다.

HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
    if (pmt == NULL) return E_POINTER;

    // Check the major type. We're looking for video.
    if (pmt->majortype != MEDIATYPE_Video)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the subtype. We're looking for 24-bit RGB.
    if (pmt->subtype != MEDIASUBTYPE_RGB24)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the format type and the size of the format block.
    if ((pmt->formattype == FORMAT_VideoInfo) &&
         (pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&
         (pmt->pbFormat != NULL))
    {
        // Now it's safe to coerce the format block pointer to the
        // correct structure, as defined by the formattype GUID.
        VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    
        // Examine pVIH (not shown). If it looks OK, return S_OK.
        return S_OK;
    }

    return VFW_E_INVALIDMEDIATYPE;
}

AM_MEDIA_TYPE 구조에는 일부 선택적 필드도 포함됩니다. 이러한 정보를 사용하여 추가 정보를 제공할 수 있지만 필터를 사용할 필요는 없습니다.

  • lSampleSize. 이 필드가 0이 아닌 경우 각 샘플의 크기를 정의합니다. 0이면 샘플 크기가 샘플에서 샘플로 변경 될 수 있음을 나타냅니다.
  • bFixedSizeSamples. 이 부울 플래그가 TRUE이면 lSampleSize 의 값이 유효합니다. 그렇지 않으면 lSampleSize를 무시해야 합니다.
  • bTemporalCompression. 이 부울 플래그가 FALSE이면 모든 프레임이 키 프레임임을 의미합니다.

필터 그래프 및 해당 구성 요소