Aracılığıyla paylaş


Yakalama Cihazı Seçme

[Bu sayfayla ilişkilendirilmiş olan DirectShowözelliği, eski bir özelliktir.] Yerine MediaPlayer, IMFMediaEngineve Media Foundation 'de Ses/Video Yakalamaalmıştır. Bu özellikler Windows 10 ve Windows 11 için iyileştirilmiştir. Microsoft, mümkün olduğunda, yeni kodun MediaPlayer, IMFMediaEngine ve Media Foundation'daki Audio/Video Capture öğelerini DirectShowyerine kullanmasını kesinlikle önerir. Microsoft, mümkünse yeni API'leri kullanmak için eski API'leri kullanan mevcut kodun yeniden yazılmasını önerir.]

Bir ses veya video yakalama cihazı seçmek için, Sistem Cihazı Numaralandırıcısını Kullanmakonusunda açıklanan Sistem Cihazı Numaralandırıcısınıkullanın. Sistem Cihazı Numaralandırıcısı, cihaz kategorisine göre seçilen bir cihaz takma adlarının koleksiyonunu döndürür. moniker, başka bir nesne hakkında bilgi içeren bir COM nesnesidir. Moniker'lar, uygulamanın nesneyi oluşturmadan nesne hakkında bilgi almasını sağlar. Daha sonra uygulama, nesnesini oluşturmak için takma adını kullanabilir. Takma adlar hakkında daha fazla bilgi için IMonikerbelgelerine bakın.

Sistem Cihazı Numaralandırıcısı'nı kullanmak için aşağıdaki adımları gerçekleştirin.

  1. Sistem Cihazı Numaralandırıcısı'nın bir örneğini oluşturmak için CoCreateInstance çağırın.

  2. ICreateDevEnum::CreateClassEnumeratorçağırın ve cihaz kategorisini GUID olarak belirtin. Yakalama cihazları için aşağıdaki kategoriler geçerlidir.

    Kategori GUID'i Açıklama
    CLSID_AudioInputDeviceCategory Ses yakalama cihazları
    CLSID_VideoGirişAygıtıKategori Video yakalama cihazları

     

    Video kamera tümleşik bir mikrofona sahipse, her iki kategoride de görünür. Ancak kamera ve mikrofon, numaralandırma, cihaz oluşturma ve veri akışı amacıyla sistem tarafından ayrı cihazlar olarak değerlendirilir.

  3. CreateClassEnumerator yöntemi, IEnumMoniker arabirimine bir işaretçi döndürür. Ad adlarını numaralandırmak için IEnumMoniker::Nextçağrısı yapın.

Aşağıdaki kod, belirtilen cihaz kategorisi için bir numaralandırıcı oluşturur.

#include <windows.h>
#include <dshow.h>

#pragma comment(lib, "strmiids")

HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum)
{
    // Create the System Device Enumerator.
    ICreateDevEnum *pDevEnum;
    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,  
        CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));

    if (SUCCEEDED(hr))
    {
        // Create an enumerator for the category.
        hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0);
        if (hr == S_FALSE)
        {
            hr = VFW_E_NOT_FOUND;  // The category is empty. Treat as an error.
        }
        pDevEnum->Release();
    }
    return hr;
}

IEnumMoniker arabirimi, her biri bir cihaz adını temsil eden IMoniker arabirimlerinin listesini numaralandırır. Uygulama, takma addan özellikleri okuyabilir veya cihaz için bir DirectShow yakalama filtresi oluşturmak üzere takma adını kullanabilir. Moniker özellikleri VARIANT değerleri olarak döndürülür. Aşağıdaki özellikler cihaz takma adlar tarafından desteklenir.

Mülk Açıklama Varyant Türü
Kullanıcı Dostu İsim Cihazın adı. VT_BSTR
"Açıklama" Cihazın açıklaması. VT_BSTR
"DevicePath" Cihazı tanımlayan benzersiz bir dize. (Yalnızca video yakalama cihazları.) VT_BSTR
"WaveInID" Ses yakalama cihazının tanımlayıcısı. (Yalnızca ses yakalama cihazları.) VT_I4

 

"FriendlyName" ve "Description" özellikleri kullanıcı arabiriminde görüntülenmek için uygundur.

  • "FriendlyName" özelliği her cihaz için kullanılabilir. Cihaz için insan tarafından okunabilen bir ad içerir.
  • "Description" özelliği yalnızca DV ve D-VHS/MPEG video kamera cihazlarında kullanılabilir. Daha fazla bilgi için bkz. MSDV Sürücü ve MSTape Sürücü . Varsa, cihazın "FriendlyName" özelliğinden daha özel bir açıklamasını içerir. Genellikle satıcı adını içerir.
  • "DevicePath" özelliği insan tarafından okunabilen bir dize değildir, ancak sistemdeki her video yakalama cihazı için benzersiz olması garanti edilir. Aynı cihaz modelinin iki veya daha fazla örneğini ayırt etmek için bu özelliği kullanabilirsiniz.
  • "WaveInID" özelliği varsa, DirectShow yakalama filtresinin cihazla iletişim kurmak için dahili olarak Waveform Audio API'lerini kullandığı anlamına gelir. "WaveInID" özelliğinin değeri, waveInOpengibi waveIn* işlevleri tarafından kullanılan tanımlayıcıya karşılık gelir.

Addan özellikleri okumak için aşağıdaki adımları gerçekleştirin.

  1. IPropertyBag arabirimine bir işaretçi almak için IMoniker::BindToStorageçağırın.
  2. Özelliği okumak için IPropertyBag::Read çağırın.

Aşağıdaki kod örneğinde, cihaz ad adlarının listesini listeleme ve özellikleri alma adımları gösterilmektedir.

void DisplayDeviceInformation(IEnumMoniker *pEnum)
{
    IMoniker *pMoniker = NULL;

    while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
    {
        IPropertyBag *pPropBag;
        HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
        if (FAILED(hr))
        {
            pMoniker->Release();
            continue;  
        } 

        VARIANT var;
        VariantInit(&var);

        // Get description or friendly name.
        hr = pPropBag->Read(L"Description", &var, 0);
        if (FAILED(hr))
        {
            hr = pPropBag->Read(L"FriendlyName", &var, 0);
        }
        if (SUCCEEDED(hr))
        {
            printf("%S\n", var.bstrVal);
            VariantClear(&var); 
        }

        hr = pPropBag->Write(L"FriendlyName", &var);

        // WaveInID applies only to audio capture devices.
        hr = pPropBag->Read(L"WaveInID", &var, 0);
        if (SUCCEEDED(hr))
        {
            printf("WaveIn ID: %d\n", var.lVal);
            VariantClear(&var); 
        }

        hr = pPropBag->Read(L"DevicePath", &var, 0);
        if (SUCCEEDED(hr))
        {
            // The device path is not intended for display.
            printf("Device path: %S\n", var.bstrVal);
            VariantClear(&var); 
        }

        pPropBag->Release();
        pMoniker->Release();
    }
}

void main()
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if (SUCCEEDED(hr))
    {
        IEnumMoniker *pEnum;

        hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
        if (SUCCEEDED(hr))
        {
            DisplayDeviceInformation(pEnum);
            pEnum->Release();
        }
        hr = EnumerateDevices(CLSID_AudioInputDeviceCategory, &pEnum);
        if (SUCCEEDED(hr))
        {
            DisplayDeviceInformation(pEnum);
            pEnum->Release();
        }
        CoUninitialize();
    }
}

Cihaz için Bir DirectShow yakalama filtresi oluşturmak için IMoniker::BindToObject yöntemini çağırarak bir IBaseFilter işaretçisi alın. Ardından filtreyi filtre grafiğine eklemek için IFilterGraph::AddFilterçağırın:

IBaseFilter *pCap = NULL;
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
if (SUCCEEDED(hr))
{
    hr = m_pGraph->AddFilter(pCap, L"Capture Filter");
}

Ses Yakalama

Video Yakalama