Bagikan melalui


Menghitung Perangkat Pengambilan Video

Topik ini menjelaskan cara menghitung perangkat pengambilan video pada sistem pengguna, dan cara membuat instans perangkat.

Untuk menghitung perangkat pengambilan video pada sistem, lakukan hal berikut:

  1. Panggil MFCreateAttributes untuk membuat penyimpanan atribut. Fungsi ini menerima penunjuk IMFAttributes .
  2. Panggil IMFAttributes::SetGUID untuk mengatur atribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE . Atur nilai atribut ke MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
  3. Hubungi MFEnumDeviceSources. Fungsi ini menerima array penunjuk IMFActivate dan ukuran array. Setiap pointer mewakili perangkat pengambilan video yang berbeda.

Untuk membuat instans perangkat pengambilan:

Kode berikut menunjukkan langkah-langkah ini:

HRESULT CreateVideoDeviceSource(IMFMediaSource **ppSource)
{
    *ppSource = NULL;

    IMFMediaSource *pSource = NULL;
    IMFAttributes *pAttributes = NULL;
    IMFActivate **ppDevices = NULL;

    // Create an attribute store to specify the enumeration parameters.
    HRESULT hr = MFCreateAttributes(&pAttributes, 1);
    if (FAILED(hr))
    {
        goto done;
    }

    // Source type: video capture devices
    hr = pAttributes->SetGUID(
        MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, 
        MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
        );
    if (FAILED(hr))
    {
        goto done;
    }

    // Enumerate devices.
    UINT32 count;
    hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count);
    if (FAILED(hr))
    {
        goto done;
    }

    if (count == 0)
    {
        hr = E_FAIL;
        goto done;
    }

    // Create the media source object.
    hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(&pSource));
    if (FAILED(hr))
    {
        goto done;
    }

    *ppSource = pSource;
    (*ppSource)->AddRef();

done:
    SafeRelease(&pAttributes);

    for (DWORD i = 0; i < count; i++)
    {
        SafeRelease(&ppDevices[i]);
    }
    CoTaskMemFree(ppDevices);
    SafeRelease(&pSource);
    return hr;
}

Setelah Anda membuat sumber media, lepaskan pointer antarmuka dan bebaskan memori untuk array:

    SafeRelease(&pAttributes);

    for (DWORD i = 0; i < count; i++)
    {
        SafeRelease(&ppDevices[i]);
    }
    CoTaskMemFree(ppDevices);

Pengambilan Video