如何枚舉系統的視音頻採集設備

    用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章