Sto usando Windows Media Foundation API per enumerare sia i miei microfoni che le telecamere disponibili, che funzionano entrambe.Windows Media Foundation registrazione audio
Ecco il mio codice di enumerazione:
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;
}
Per afferrare dispositivi audio o catturare macchina fotografica, ho specificare MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID
o MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
e che funziona senza alcun problema, e posso afferrare i nomi dei dispositivi, così come l'IMFActivate. Ho il codice per registrare la webcam su un file video di output, tuttavia, mi sto divertendo a capire come registrare l'audio in un file. Ho l'impressione che ho bisogno di utilizzare un IMFSinkWriter, ma non riesco a trovare alcun esempio che utilizza un'acquisizione audio IMFActivate e IMFSinkWriter.
Non sono un programmatore di Windows Api, quindi sono sicuro che ci sia una risposta abbastanza semplice, ma la roba della COM è un po 'sopra la mia testa. Per quanto riguarda il formato audio, non mi interessa, a patto che entri in un file, possa essere wav, wma o altro. Anche se sto registrando video, ho bisogno di separare i file video e audio, quindi non riesco a capire come aggiungere l'audio alla mia codifica video.
È passato molto tempo da quando ho lavorato a quel progetto e da allora è stato preso in carico da altre persone che lo hanno preso in una direzione diversa. Indipendentemente da ciò, grazie per la risposta chiara con il codice di esempio, è molto apprezzato, e forse qualcun altro lo troverà molto utile :) – OzBarry