我使用Windows Media基礎API來枚舉我的兩個麥克風和攝像頭可用,這兩者的工作。Windows媒體基金會錄製的音頻
這裏是我的枚舉代碼:
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
和工作沒有問題,我可以抓住設備的名稱,以及IMFActivate。我有代碼將網絡攝像機錄製到輸出視頻文件,但是,我很難搞清楚如何將音頻錄製到文件中。我的印象是我需要使用IMFSinkWriter,但我找不到使用音頻捕獲IMFActivate和IMFSinkWriter的任何示例。
我沒有太大的Windows API的程序員,所以我敢肯定有一個相當直截了當的答案,但COM的東西只是一個有點超過我的頭。至於音頻格式,我並不在乎,只要它進入一個文件 - 可以是wav,wma或其他。儘管我在錄製視頻,但我需要將視頻和音頻文件分開,所以我不能僅僅知道如何將音頻添加到我的視頻編碼中。
我一直在研究這個項目已經很長時間了,而且這個項目已經被另外一些人採納了,而這些人則朝不同的方向發展。無論如何,感謝您使用示例代碼的明確答案,非常感謝,也許別人會發現它非常有用:) – OzBarry