Ich verwende die Windows Media Foundation API, um sowohl meine Mikrofone und verfügbaren Kameras aufzuzählen, die beide funktionieren.Windows Media Foundation Aufnahme Audio
Hier ist meine Aufzählung Code:
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;
}
Audio- oder Kamera-Capture-Geräte zu packen, ich entweder MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID
oder MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
angeben und das funktioniert kein Problem, und ich kann die Namen der Geräte, als auch greifen als das IMFActivate. Ich habe Code, um die Webcam zu einer Ausgangsvideodatei aufzuzeichnen, jedoch habe ich eine harte Zeit herauszufinden, wie man das Audio in eine Datei aufzeichnet. Ich habe den Eindruck, dass ich einen IMFSinkWriter verwenden muss, aber ich kann keine Beispiele finden, die ein Audio Capture IMFActivate und IMFSinkWriter verwenden.
Ich bin nicht viel von einem Windows-API-Programmierer, also bin ich mir sicher, es gibt eine ziemlich direkte Antwort, aber COM-Zeug ist nur ein bisschen über meinen Kopf. Was das Audioformat betrifft, ist mir das egal, solange es in eine Datei kommt - kann wav, wma oder was auch immer sein. Obwohl ich Videos aufnehme, brauche ich separate Video- und Audiodateien, damit ich nicht einfach herausfinden kann, wie ich das Audio in meine Videokodierung einfüge.
Es ist lange her, seit ich an diesem Projekt arbeite, und es wurde seitdem von einigen anderen Leuten übernommen, die es in eine andere Richtung nahmen. Nichtsdestotrotz, danke für die klare Antwort mit dem Beispielcode, es ist sehr geschätzt, und vielleicht jemand anderes wird es sehr nützlich finden :) – OzBarry