다음을 통해 공유


미디어 형식 정보(DirectShow)

[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, 그리고 Media Foundation 오디오/비디오 캡처 에 의해 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngineAudio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 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 구조를 사용합니다. 비디오는 VIDEOINFOHEADERVIDEOINFOHEADER2포함하여 다양한 구조를 사용합니다. 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 . 이 Boolean 플래그가 TRUE이면, lSampleSize의 값이 유효하다는 의미입니다. 그렇지 않으면 lSampleSize 무시해야 합니다.
  • bTemporalCompression. 이 불리언 플래그가 FALSE이면 모든 프레임이 키 프레임임을 의미합니다.

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