Windows Media Foundation API를 사용하여 내 마이크와 사용 가능한 카메라를 모두 열거합니다. 둘 다 작동합니다. 오디오 나 카메라 캡처 장치를 잡아Windows Media Foundation 녹음 오디오
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;
}
이, 나도 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID
또는 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
을 지정하고 그 문제를 작동하지 않습니다, 나는 장치의 이름을 잡아뿐만 아니라 수 있습니다 여기에
나는 윈도우 API 프로그래머가 아니기 때문에 꽤 솔직한 대답이 될 것이라고 확신한다. 그러나 COM 물건은 내 머리 위로 조금있다. 오디오 형식까지는 파일에 들어가는 한 신경 쓰지 않아도됩니다. wav, wma 등이 될 수 있습니다. 비디오를 레코딩하고 있지만 비디오와 오디오 파일이 분리되어 있어야하므로 비디오 인코딩에 오디오를 추가하는 방법을 알 수 없습니다.
저는 그 프로젝트를 작업 한 이후로 오랜 시간이 걸렸습니다. 그리고 그 프로젝트는 다른 방향으로 가져간 다른 사람들에 의해 인계되었습니다. 그럼에도 불구하고 예제 코드를 사용하여 명확한 답변을 주셔서 감사합니다. 많은 도움이됩니다. 다른 누군가가 매우 유용 할 것입니다. :) – OzBarry