다음을 통해 공유


DirectShow에서 DMO 사용

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

DirectShow를 기반으로 하는 애플리케이션은 DMO 래퍼 필터를 통해 필터 그래프에서 DMO를 사용할 수 있습니다. 이 필터는 DMO를 집계하고 DMO 간 데이터 전달, IMediaBuffer 개체 할당 등과 같은 DMO 사용의 모든 세부 정보를 처리합니다.

DMO는 필터에 의해 집계되므로 애플리케이션은 DMO가 노출하는 COM 인터페이스에 대해 필터를 쿼리할 수 있습니다. 그러나 애플리케이션은 필터가 DMO의 모든 스트리밍 작업을 처리하도록 허용해야 합니다. 예를 들어 미디어 유형을 설정하거나, 버퍼를 처리하거나, DMO를 플러시하거나, DMO를 잠그거나, 품질 관리를 사용하거나 사용하지 않도록 설정하거나, 비디오 최적화를 설정하지 마세요.

사용하려는 특정 DMO의 CLSID(클래스 식별자)를 알고 있는 경우 다음과 같이 해당 DMO를 사용하여 DMO 래퍼 필터를 초기화할 수 있습니다.

  1. CoCreateInstance 호출하여 DMO 래퍼 필터를 만듭니다.
  2. IDMOWrapperFilter 인터페이스에 대한 DMO 래퍼 필터를 쿼리합니다.
  3. IDMOWrapperFilter::Init 메서드를 호출합니다. DMO의 CLSID와 DMO 범주의 GUID를 지정합니다. DMO 범주의 목록은 DMO GUID을 참조하세요.

다음 코드는 다음 단계를 보여줍니다.

// Create the DMO Wrapper filter.
IBaseFilter *pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, 
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, 
    reinterpret_cast<void**>(&pFilter));

if (SUCCEEDED(hr)) 
{
    // Query for IDMOWrapperFilter.
    IDMOWrapperFilter *pDmoWrapper;
    hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, 
        reinterpret_cast<void**>(&pDmoWrapper));

    if (SUCCEEDED(hr)) 
    {     
        // Initialize the filter.
        hr = pDmoWrapper->Init(CLSID_MyDMO, DMOCATEGORY_VIDEO_EFFECT); 
        pDmoWrapper->Release();

        if (SUCCEEDED(hr)) 
        {
            // Add the filter to the graph.
            hr = pGraph->AddFilter(pFilter, L"My DMO");
        }
    }
    pFilter->Release();
}

DMOEnum 함수는 레지스트리의 DMO를 열거합니다. 이 함수는 DirectShow 필터에 사용되는 것과 다른 범주 GUID 집합을 사용합니다.

DMO와 함께하는 시스템 디바이스 열거자 사용

DMO를 직접 만드는 대신 DMOEnum 메서드에서 지원하는 모든 DMO 범주를 열거할 수 있는 시스템 디바이스 열거자사용할 수 있습니다. 시스템 디바이스 열거자는 특정 DirectShow 필터 범주를 열거할 때 DDO도 포함합니다. 다음 표에서는 DMO 범주와 DirectShow 범주 간의 매핑을 보여 줍니다.

레이블
DMO 범주 DirectShow 동등물
DMOCATEGORY_오디오 인코더 CLSID_AudioCompressorCategory (오디오 압축기 범주 식별자)
DMOCATEGORY_AUDIO_DECODER CLSID_LegacyAmFilterCategory
DMOCATEGORY_VIDEO_ENCODER CLSID_VideoCompressorCategory
DMOCATEGORY_비디오_디코더 CLSID_LegacyAmFilterCategory

 

시스템 디바이스 열거자는 모니커 개체 목록을 반환합니다. 모니커가 DMO를 나타내는 경우 IMoniker::BindToObject 메서드는 자동으로 DMO 래퍼 필터를 만들고 해당 DMO로 초기화합니다. 따라서 DMO가 관련되어 있다는 사실은 애플리케이션에 투명합니다. 자세한 내용은 시스템 디바이스 열거자 사용을 참조하세요.

제한 사항

DirectShow에서 DDO를 사용하는 경우 몇 가지 제한 사항이 있습니다.

  • DMO 래퍼 필터는 입력이 0개, 여러 입력 또는 출력이 0인 DMO를 지원하지 않습니다.
  • DMO 래퍼 필터의 모든 핀 연결은 IMemInputPin 인터페이스를 사용합니다.
  • DirectShow Editing Services는 DMO 기반 효과 또는 전환을 지원하지 않습니다.

DMO 을(를) 사용하여