Share via


효과 및 전환 열거

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

[이 API는 지원되지 않으며 나중에 변경되거나 사용할 수 없습니다.]

DirectShow는 디바이스를 열거하기 위한 시스템 디바이스 열거자 개체를 제공합니다. 이 모니커를 사용하여 사용자 시스템에 설치된 효과 또는 전환에 대한 모니커를 검색할 수 있습니다.

시스템 디바이스 열거자는 ICreateDevEnum 인터페이스를 노출합니다. 지정된 디바이스 범주에 대한 범주 열거자를 반환합니다. 범주 열거자는 IEnumMoniker 인터페이스를 노출하고 범주의 각 디바이스에 대한 모니커를 반환합니다. ICreateDevEnum 사용에 대한 자세한 내용은 디바이스 및 필터 열거를 참조하세요. 다음은 DirectShow Editing Services와 관련된 간략한 요약입니다.

효과 또는 전환을 열거하려면 다음 단계를 수행합니다.

  1. 시스템 디바이스 열거자의 instance 만듭니다.
  2. ICreateDevEnum::CreateClassEnumerator 메서드를 호출하여 범주 열거자를 검색합니다. 범주는 CLSID(클래스 식별자)로 정의됩니다. 효과에 CLSID_VideoEffects1Category 사용하거나 전환에 CLSID_VideoEffects2Category 사용합니다.
  3. IEnumMoniker::Next를 호출하여 열거형의 각 모니커를 검색합니다.
  4. 각 모니커에 대해 IMoniker::BindToStorage 를 호출하여 연결된 속성 모음을 검색합니다.

속성 모음에는 효과 또는 전환에 대한 식별자 이름 및 GUID(Globally Unique Identifier)가 포함됩니다. 애플리케이션은 친숙한 이름 목록을 표시한 다음 해당 GUID를 가져올 수 있습니다.

다음 코드 예제에서는 이러한 단계를 보여 줍니다.

ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMoniker = NULL;

// Create the System Device Enumerator.
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, 
    CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if (FAILED(hr))
{
    // Error handling omitted for clarity.
}

// Create an enumerator for the video effects category.
hr = pCreateDevEnum->CreateClassEnumerator(
    CLSID_VideoEffects1Category,  // Video effects category. 
    &pEnumMoniker, 0);               

// Note: Use CLSID_VideoEffects2Category for video transitions.

if (hr == S_OK)  // S_FALSE means the category is empty.
{
    // Enumerate each video effect.
    IMoniker *pMoniker;
    while (S_OK == pEnumMoniker->Next(1, &pMoniker, NULL))
    {
        IPropertyBag *pBag;
        hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
            (void **)&pBag);
        if(FAILED(hr))
        {
            pMoniker->Release();
            continue; // Maybe the next one will work.
        }
        VARIANT var;
        VariantInit(&var);
        hr = pBag->Read(OLESTR("FriendlyName"), &var, NULL);
        if (SUCCEEDED(hr))
        {
            if ( ... )  // Check if var.bstrVal is the name you want.
            {
                VARIANT var2;
                GUID guid;
                var2.vt = VT_BSTR;
                pBag->Read(OLESTR("guid"), &var2, NULL);
                CLSIDFromString(var2.bstrVal, &guid);
                VariantClear(&var2);
                // GUID is now the CLSID for the effect.
            }
        }
        VariantClear(&var);
        pBag->Release();
        pMoniker->Release();
    }
    pEnumMoniker->Release();
}
pCreateDevEnum->Release();

효과 및 전환 작업