Windows&Linux获取摄像头名称和默认麦克风设备名称

1、Windows下根据摄像头VID&PID获取设备名称与获取默认麦克风设备名称

在这里插入图片描述
注意 ;windows版本使用了video_capture.dll、和audio_sdk.dll两个库进行获取的。

获取摄像头名称

vector<VideoCapInfo> 	vecVideoCapInfo;
	int32_t					nHandle = -1;
	if (nHandle == -1)
		nHandle = CreateVideoCaptureHandle(NULL, NULL);
	vecVideoCapInfo.clear();

	//遍历获取当前电脑连接的摄像头设备
	int nNum = GetNumOfDevices(nHandle);
	if (nNum > 0)
	{
		for (int nIndex = 0; nIndex < nNum; nIndex++)
		{
			VideoCapInfo videoCapInfo;
			CaptureCapability maxCap;

			videoCapInfo.nIndex = nIndex;

			if (GetDeviceName(nHandle, nIndex, videoCapInfo.szDeviceName, 1024, videoCapInfo.szDeviceUniqueName, 1024) == 0)
			{
				/*if (bPrint)
				dzlog_info("%s(%d) \n	Camera-%d \n	cameraName: %s \n	cameraPid: %s ", __FUNCTION__, __LINE__, nIndex, videoCapInfo.szDeviceName, videoCapInfo.szDeviceUniqueName);*/

				bool bFind = false;
				int nNumCap = GetNumOfCapabilities(nHandle, videoCapInfo.szDeviceUniqueName);
				for (int i = 0; i < nNumCap; i++)
				{
					CaptureCapability cap;
					if (GetCapability(nHandle, videoCapInfo.szDeviceUniqueName, i, cap) == 0)
					{
						if (i == 0)
						{
							maxCap.width = cap.width;
							maxCap.height = cap.height;
							maxCap.frameRate = cap.frameRate;
						}
						else
						{
							if (cap.width >= maxCap.width &&
								cap.height >= maxCap.height &&
								cap.frameRate >= maxCap.frameRate)
							{
								maxCap.width = cap.width;
								maxCap.height = cap.height;
								maxCap.frameRate = cap.frameRate;
							}
						}

						/*if (bPrint)
						dzlog_info("%s(%d) width:%d height:%d frameRate:%d", __FUNCTION__, __LINE__, cap.width, cap.height, cap.frameRate);*/

						videoCapInfo.vecCapability.push_back(cap);
					}
				}

				if (videoCapInfo.vecCapability.size() > 0)
				{
					videoCapInfo.vecCapability.push_back(maxCap);
				}

				vecVideoCapInfo.push_back(videoCapInfo);
			}
		}
	}

获取麦克风名称

//获取默认的音频麦克风设备名称
static string GetAudioName()
{
	string strAudioName = "";
	int32_t audioRecNum = 0;
	int32_t	nHandleAudioEx = -1;
	if (nHandleAudioEx == -1)
		nHandleAudioEx = CreateAudioHandle(NULL, NULL);
	vector<AudioCapInfo> 	vecAudioCapInfo;
	GetNumOfRecordingDevices(nHandleAudioEx, audioRecNum);

	if (audioRecNum > 0)
	{
		for (int i = 0; i < audioRecNum; i++)
		{
			char name[1024] = { 0 };
			char guid[1024] = { 0 };

			if (GetRecordingDeviceName(nHandleAudioEx, i, name, guid) == 0)
			{
				AudioCapInfo audioCapInfo = { 0 };

				strcpy(audioCapInfo.szDeviceName, name);
				strcpy(audioCapInfo.szDeviceUniqueName, guid);
				audioCapInfo.nIndex = i;

				vecAudioCapInfo.push_back(audioCapInfo);
			}
		}
	}
	if (vecAudioCapInfo.size() > 0)
	{
		strAudioName = vecAudioCapInfo[0].szDeviceName;
	}
	if (nHandleAudioEx != -1)
	{
		DeleteAudioHandle(nHandleAudioEx);
		nHandleAudioEx = -1;
	}
	return strAudioName;
}

2、Linux下检测当前VID&PID摄像头设备是否存在

主要是查看/sys/class/video4linux/video%d/device/modalias这个文件

int isVaildCamera(int id, std::string stridvid)
{
    //char *pidVid = "v046Dp0843";
    //char *pidVid = "v1BCFp2281";
    //char *pidVid = "v046Dp0825";
    const char *pidVid = stridvid.c_str();

    char szDeviceName[256] = {0};
    int nCameaId = id;
    sprintf(szDeviceName, "/dev/video%d", nCameaId);
    struct stat st;

    //qDebug() << "isVaildCamera" << pidVid;

    if (-1 != stat(szDeviceName, &st))
    {
        sprintf(szDeviceName, "/sys/class/video4linux/video%d/device/modalias", nCameaId);

        if (-1 != stat(szDeviceName, &st))
        {
            int fd_t = open(szDeviceName, O_RDONLY, 0);
            if (fd_t >= 0)
            {
                char szReadBuf[1024] = {0};
                read(fd_t, szReadBuf, 1024);
                close(fd_t);

                char szPID[16] = {0};
                strncpy(szPID, szReadBuf + 4, 10);
                if (strncasecmp(pidVid, szPID, 10) == 0)
                {
                    return 0;
                }
            }
        }
    }
    zlog_debug(m_zc ,"CMBCamera::isVaildCamera() Fail!");
    return -1;
}

工程地址:之后上传

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值