Używam api z programem Windows Media Foundation do wyliczania zarówno moich mikrofonów, jak i dostępnych kamer, które działają.Nagrywanie dźwięku z programu Windows Media Foundation
Oto mój kod wyliczenie:
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ądzeń audio lub przechwytywania kamery, określić zarówno MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID
lub MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
i że działa bez problemu, a ja mogę złapać nazwy urządzeń, a także IMFA zmodyfikuj. Mam kod do nagrywania kamery internetowej do wyjściowego pliku wideo, jednak mam trudny czas zastanawia się, jak nagrać audio do pliku. Mam wrażenie, że muszę użyć IMFSinkWriter, ale nie mogę znaleźć żadnych przykładów, które wykorzystują przechwytywanie dźwięku IMFActivate i IMFSinkWriter.
Nie jestem programistą Windows API, więc jestem pewien, że istnieje dość prosta odpowiedź, ale rzeczy COM są tylko trochę ponad moją głową. Jeśli chodzi o format audio, tak naprawdę nie obchodzi mnie, o ile dostanie się do pliku - może 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.
Minęło dużo czasu, odkąd pracowałem nad tym projektem, i został on przejęty przez inne osoby, które przyjęły go w innym kierunku. Niezależnie od tego, dzięki za jasną odpowiedź z przykładowym kodem, jest to bardzo doceniane i być może ktoś inny uzna to za bardzo przydatne :) – OzBarry