用Directshow SDK很容易實現該功能,但是開發者必須瞭解Directshow SDK的一些基礎知識,對於不瞭解Directshow的開發員就有點頭疼了。爲了更方便他們開發,我封裝了一個動態庫,可以枚舉系統的視音頻採集設備(僅支持Windows系統),動態庫使用非常簡單,因爲只有一個接口:
//枚舉指定類型的所有采集設備的名稱
ENUMDEVICE_API HRESULT EnumDevice(CAPTURE_DEVICE_TYPE type, char * deviceList[], int nListLen, int & iNumCapDevices);
其中,輸入參數type是一個枚舉類型,定義如下:
enum CAPTURE_DEVICE_TYPE
{
DSHOW_VIDEO_DEVICE = 0,
DSHOW_AUDIO_DEVICE,
};
如果要枚舉視頻採集設備,則傳入0;如果枚舉音頻設備,則傳入1。
使用有一個地方要注意:因爲DShow需要用到COM,所以調用該接口前外部需要調用COM庫的初始化函數:::CoInitialize(NULL);
調用的例子代碼:
::CoInitialize(NULL); //調用DirectShow SDK的API需要用到COM庫
int iVideoCapDevNum = 0;
int iAudioCapDevNum = 0;
char * DevicesArray[20];
for(int i=0; i<20; i++)
{
DevicesArray[i] = new char[256];
memset(DevicesArray[i], 0, 256);
}
HRESULT hr;
hr = EnumDevice(DSHOW_VIDEO_DEVICE, DevicesArray, sizeof(DevicesArray)/sizeof(DevicesArray[0]), iVideoCapDevNum);
if(hr == S_OK)
{
for(int i=0; i<iVideoCapDevNum; i++)
{
CString strDevName = DevicesArray[i];
}
}
hr = EnumDevice(DSHOW_AUDIO_DEVICE, DevicesArray, sizeof(DevicesArray)/sizeof(DevicesArray[0]), iAudioCapDevNum);
if(hr == S_OK)
{
for(int i=0; i<iAudioCapDevNum; i++)
{
CString strDevName = DevicesArray[i];
}
}
for(int i=0; i<20; i++)
{
delete DevicesArray[i];
DevicesArray[i] = NULL;
}
該動態庫的下載地址:https://download.csdn.net/download/zhoubotong2012/10907044