Windows Media Foundation nagrywa dźwięk

Korzystam z api Windows Media Foundation, aby wyliczyć zarówno moje mikrofony, jak i dostępne kamery, które działają.

Oto mój kod wyliczeniowy:

class deviceInput {
public:
    deviceInput( REFGUID source );
    ~deviceInput();

    int listDevices(bool refresh = false);
    IMFActivate *getDevice(unsigned int deviceId);
    const WCHAR *getDeviceName(unsigned int deviceId);

private:
    void Clear();
    HRESULT EnumerateDevices();

    UINT32      m_count;
    IMFActivate **m_devices;
    REFGUID     m_source;
};

deviceInput::deviceInput( REFGUID source )
    : m_devices( NULL )
    , m_count( 0 )
    , m_source( source )
{   }

deviceInput::~deviceInput()
{
    Clear();
}

int deviceInput::listDevices(bool refresh)
{
    if ( refresh || !m_devices ) {
        if ( FAILED(this->EnumerateDevices()) ) return -1;
    }
    return m_count;
}

IMFActivate *deviceInput::getDevice(unsigned int deviceId)
{
    if ( deviceId >= m_count ) return NULL;

    IMFActivate *device = m_devices[deviceId];
    device->AddRef();

    return device;
}

const WCHAR *deviceInput::getDeviceName(unsigned int deviceId)
{
    if ( deviceId >= m_count ) return NULL;

    HRESULT hr = S_OK;
    WCHAR *devName = NULL;
    UINT32 length;

    hr = m_devices[deviceId]->GetAllocatedString( MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, &devName, &length );
    if ( FAILED(hr) ) return NULL;

    return devName;
}

void deviceInput::Clear()
{
    if ( m_devices ) {
        for (UINT32 i = 0; i < m_count; i++) SafeRelease( &m_devices[i] );
        CoTaskMemFree( m_devices );
    }
    m_devices = NULL;
    m_count = 0;
}

HRESULT deviceInput::EnumerateDevices()
{
    HRESULT hr = S_OK;
    IMFAttributes *pAttributes = NULL;

    Clear();

    hr = MFCreateAttributes(&pAttributes, 1);
    if ( SUCCEEDED(hr) ) hr = pAttributes->SetGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, m_source );
    if ( SUCCEEDED(hr) ) hr = MFEnumDeviceSources( pAttributes, &m_devices, &m_count );

    SafeRelease( &pAttributes );

    return hr;
}

Aby pobrać urządzenia do przechwytywania dźwięku lub kamery, określam teżMF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID lubMF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID i to nie działa bez problemu i mogę pobrać nazwy urządzeń, a także IMFActivate. Mam kod, aby nagrać kamerę internetową do wyjściowego pliku wideo, ale mam trudny czas, aby dowiedzieć się, jak nagrać dźwięk do pliku. Mam wrażenie, że muszę użyć IMFSinkWriter, ale nie mogę znaleźć żadnych przykładów, które używają przechwytywania audio IMFActivate i IMFSinkWriter.

Nie jestem zbytnio programistą Windows api, więc jestem pewien, że jest dość prosta odpowiedź, ale rzeczy COM są trochę przesadzone. Jeśli chodzi o format audio, nie obchodzi mnie to tak długo, jak długo trafia do pliku - może to być wav, wma lub cokolwiek innego. Mimo że nagrywam wideo, potrzebuję osobnych plików wideo i audio, więc nie mogę po prostu dowiedzieć się, jak dodać dźwięk do mojego kodowania wideo.

questionAnswers(2)

yourAnswerToTheQuestion