Sdílet prostřednictvím


Zachytávání zvuku nebo videa v Media Foundation

Microsoft Media Foundation podporuje záznam zvuku a videa. Zařízení pro záznam videa se podporují prostřednictvím ovladače třídy UVC a musí být kompatibilní s UVC 1.1. Zařízení pro zachytávání zvuku se podporují prostřednictvím rozhraní API zvukové relace systému Windows (WASAPI).

Záznamové zařízení je reprezentováno v Media Foundation objektem zdroje médií, který zveřejňuje MMFMediaSource rozhraní. Ve většině případů aplikace nebude toto rozhraní používat přímo, ale bude používat rozhraní API vyšší úrovně, jako je Čtečka zdrojového kódu k řízení zařízení pro zachytávání.

Vytvoření výčtu zachytávání zařízení

Pokud chcete vytvořit výčet zařízení pro zachytávání v systému, proveďte následující kroky:

  1. Voláním funkce MFCreateAttributes vytvořte úložiště atributů.

  2. Nastavte atribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE na jednu z následujících hodnot:

    Hodnota Popis
    MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID Vytvoření výčtu zařízení pro zachytávání zvuku
    MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID Zobrazení výčtu zařízení pro zachytávání videa

     

  3. Volání funkceMFEnumDeviceSources Tato funkce přidělí pole POINTERActivate ukazatele. Každý ukazatel představuje aktivační objekt pro jedno zařízení v systému.

  4. Volání metody MMFActivate::ActivateObject vytvořit instanci zdroje médií z jednoho z aktivačních objektů.

Následující příklad vytvoří zdroj médií pro první zařízení pro zachycení videa v seznamu výčtu:

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

    UINT32 count = 0;

    IMFAttributes *pConfig = NULL;
    IMFActivate **ppDevices = NULL;

    // Create an attribute store to hold the search criteria.
    HRESULT hr = MFCreateAttributes(&pConfig, 1);

    // Request video capture devices.
    if (SUCCEEDED(hr))
    {
        hr = pConfig->SetGUID(
            MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, 
            MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
            );
    }

    // Enumerate the devices,
    if (SUCCEEDED(hr))
    {
        hr = MFEnumDeviceSources(pConfig, &ppDevices, &count);
    }

    // Create a media source for the first device in the list.
    if (SUCCEEDED(hr))
    {
        if (count > 0)
        {
            hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(ppSource));
        }
        else
        {
            hr = MF_E_NOT_FOUND;
        }
    }

    for (DWORD i = 0; i < count; i++)
    {
        ppDevices[i]->Release();
    }
    CoTaskMemFree(ppDevices);
    return hr;
}

Aktivační objekty můžete dotazovat na různé atributy, včetně následujících:

Následující příklad přebírá pole MMFActivate ukazatele a vytiskne zobrazovaný název každého zařízení do okna ladění:

void DebugShowDeviceNames(IMFActivate **ppDevices, UINT count)
{
    for (DWORD i = 0; i < count; i++)
    {
        HRESULT hr = S_OK;
        WCHAR *szFriendlyName = NULL;
    
        // Try to get the display name.
        UINT32 cchName;
        hr = ppDevices[i]->GetAllocatedString(
            MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME,
            &szFriendlyName, &cchName);

        if (SUCCEEDED(hr))
        {
            OutputDebugString(szFriendlyName);
            OutputDebugString(L"\n");
        }
        CoTaskMemFree(szFriendlyName);
    }
}

Pokud už znáte symbolický odkaz pro videozařízení, existuje jiný způsob, jak vytvořit zdroj médií pro zařízení:

  1. Volání MFCreateAttributes vytvořit úložiště atributů.
  2. Nastavte atribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE na MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
  3. Nastavte atribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK na symbolický odkaz.
  4. Volání funkce MFCreateDeviceSource nebo MFCreateDeviceSourceActivate. První vrátí ukazatel MMFMediaSource. Druhá vrátí ukazatel MMFActivate ukazatel na aktivační objekt. Aktivační objekt můžete použít k vytvoření zdroje. (Aktivační objekt může být zařazován do jiného procesu, takže je užitečné, pokud chcete vytvořit zdroj v jiném procesu. Další informace najdete v tématu aktivační objekty.)

Následující příklad přebírá symbolický odkaz videozařízení a vytvoří zdroj médií.

HRESULT CreateVideoCaptureDevice(PCWSTR *pszSymbolicLink, IMFMediaSource **ppSource)
{
    *ppSource = NULL;
    
    IMFAttributes *pAttributes = NULL;
    IMFMediaSource *pSource = NULL;

    HRESULT hr = MFCreateAttributes(&pAttributes, 2);

    // Set the device type to video.
    if (SUCCEEDED(hr))
    {
        hr = pAttributes->SetGUID(
            MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
            MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
            );
    }


    // Set the symbolic link.
    if (SUCCEEDED(hr))
    {
        hr = pAttributes->SetString(
            MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK,
            (LPCWSTR)pszSymbolicLink
            );            
    }

    if (SUCCEEDED(hr))
    {
        hr = MFCreateDeviceSource(pAttributes, ppSource);
    }

    SafeRelease(&pAttributes);
    return hr;    
}

Existuje ekvivalentní způsob, jak vytvořit zvukové zařízení z ID zvukového koncového bodu:

  1. Volání MFCreateAttributes vytvořit úložiště atributů.
  2. Nastavte atribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE na MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID.
  3. Nastavte atribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ENDPOINT_ID na ID koncového bodu.
  4. Volání funkce MFCreateDeviceSource nebo MFCreateDeviceSourceActivate.

Následující příklad přebírá ID zvukového koncového bodu a vytvoří zdroj médií.

HRESULT CreateAudioCaptureDevice(PCWSTR *pszEndPointID, IMFMediaSource **ppSource)
{
    *ppSource = NULL;
    
    IMFAttributes *pAttributes = NULL;
    IMFMediaSource *pSource = NULL;

    HRESULT hr = MFCreateAttributes(&pAttributes, 2);

    // Set the device type to audio.
    if (SUCCEEDED(hr))
    {
        hr = pAttributes->SetGUID(
            MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
            MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID
            );
    }

    // Set the endpoint ID.
    if (SUCCEEDED(hr))
    {
        hr = pAttributes->SetString(
            MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ENDPOINT_ID,
            (LPCWSTR)pszEndPointID
            ); 
    }

    if (SUCCEEDED(hr))
    {
        hr = MFCreateDeviceSource(pAttributes, ppSource);
    }

    SafeRelease(&pAttributes);
    return hr;    
}

Použití zařízení pro zachytávání

Po vytvoření zdroje médií pro zachytávejte zařízení pomocí čtečky zdrojového kódu získat data ze zařízení. Čtečka zdrojového kódu poskytuje ukázky médií, které obsahují snímky zvukových dat nebo videa. Další krok závisí na vašem scénáři aplikace:

  • Náhled videa: K zobrazení videa použijte Microsoft Direct3D nebo Direct2D.
  • Zachycení souboru: Soubor zakódujte pomocí zapisovače jímky .
  • Náhled zvuku: Použijte WASAPI .

Pokud chcete zkombinovat zvukový záznam s videem, použijte agregovaný zdroj médií. Agregovaný zdroj médií obsahuje kolekci zdrojů médií a kombinuje všechny jejich streamy do jednoho objektu zdroje médií. Pokud chcete vytvořit instanci agregovaného zdroje médií, zavolejte funkci MFCreateAggregateSource.

Vypnutí zařízení pro zachytávání

Pokud už zařízení zachycení nepotřebujete, musíte zařízení vypnout voláním Vypnout na objektu MMFMediaSource objektu, který jste získali voláním MFCreateDeviceSource nebo MMFActivate::ActivateObject. Při volání Vypnutí může dojít k nevracení paměti, protože systém může uchovávat odkaz na MMFMediaSource prostředky, dokud nebude volána Vypnutí.

if (g_pSource)
{
    g_pSource->Shutdown();
    g_pSource->Release();
    g_pSource = NULL;
}

Pokud jste přidělil řetězec obsahující symbolický odkaz na zařízení pro zachycení, měli byste tento objekt uvolnit také.

    CoTaskMemFree(g_pwszSymbolicLink);
    g_pwszSymbolicLink = NULL;

    g_cchSymbolicLink = 0;

audio/video capture