Windows Media Foundation graba audio

Estoy usando la API de Windows Media Foundation para enumerar mis micrófonos y las cámaras disponibles, en las que ambos funcionan.

Aquí está mi código de enumeración:

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;
}

Para capturar dispositivos de captura de audio o cámara, especificoMF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID oMF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID y eso no funciona, y puedo capturar los nombres de los dispositivos, así como el IMFActivate. Tengo un código para grabar la cámara web en un archivo de video de salida, sin embargo, me resulta difícil descubrir cómo grabar el audio en un archivo. Tengo la impresión de que necesito usar un IMFSinkWriter, pero no puedo encontrar ningún ejemplo que use una captura de audio IMFActivate y IMFSinkWriter.

No soy un programador de Windows Api, así que estoy seguro de que hay una respuesta bastante sencilla, pero el contenido de COM está un poco por encima de mi cabeza. En cuanto al formato de audio, realmente no me importa, siempre y cuando se encuentre en un archivo, puede ser wav, wma, o lo que sea. Aunque estoy grabando un video, necesito que los archivos de audio y video estén separados, así que no puedo averiguar cómo agregar el audio a la codificación de mi video.

Respuestas a la pregunta(2)

Su respuesta a la pregunta