#include "Inc/toolkit/LocalCamera.h" #include "Inc/toolkit/StringConvert.h" #include #include #pragma comment(lib,"strmiids.lib") CamObj::CamObj(): devID(-1), m_bRun(false) { m_event_exit = ::CreateEvent(NULL, FALSE, FALSE, NULL); } CamObj::~CamObj() { } int CamObj::Open(CamFrameCallBack fuc) { if (!m_camera.open(devID)) return 1; std::thread([this, &fuc]() { this->m_bRun = true; while (WaitForSingleObject(this->m_event_exit, 50) != WAIT_OBJECT_0) { cv::Mat img; this->m_camera >> img; fuc(devID, devName, img); } m_camera.release(); this->m_bRun = false; }).join(); return 0; } int CamObj::Close() { if (m_camera.isOpened()) { ::SetEvent(m_event_exit); } return 0; } LocalCamera::LocalCamera() { } LocalCamera::~LocalCamera() { } int LocalCamera::GetAllCam(std::vector& cameras) { cameras.clear(); if (FAILED(CoInitialize(NULL))) {//CoInitialize Failed ... return -1; } int id = 0; ICreateDevEnum *pCreateDevEnum; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum); if (hr != NOERROR) return -1; CComPtr pEm; hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0); if (hr != NOERROR) return -1; pEm->Reset(); ULONG cFetched; IMoniker *pM; while (hr = pEm->Next(1, &pM, &cFetched), hr == S_OK) { IPropertyBag *pBag; hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); if (SUCCEEDED(hr)) { CamObj TmpCam; TmpCam.devID = id; VARIANT var; var.vt = VT_BSTR; hr = pBag->Read(L"DevicePath", &var, NULL); if (hr == 0) { std::wstring str = L""; std::wstring strVid, strPid; int Count = 0; while (var.bstrVal[Count] != 0x00) { str += var.bstrVal[Count]; Count++; } strVid = str.substr(str.find(L"vid_") + 4, 4); strPid = str.substr(str.find(L"pid_") + 4, 4); TmpCam.devVID = dp::StringConvert::UnicodeToUTF8(strVid); TmpCam.devPID = dp::StringConvert::UnicodeToUTF8(strPid); } VARIANT var1; var1.vt = VT_BSTR; hr = pBag->Read(L"FriendlyName", &var1, NULL); if (hr == 0) { std::wstring str = L""; int Count = 0; while (var1.bstrVal[Count] != 0x00) { str += var1.bstrVal[Count]; Count++; } TmpCam.devName = dp::StringConvert::UnicodeToUTF8(str); } if (TmpCam.devName.find("screen-capture-recorder") == -1) { cameras.push_back(TmpCam); id++; } pBag->Release(); } pM->Release(); } return cameras.size(); }