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;
}
工程地址:之后上传