#include "HcRecord.h" #include #include #include #include #include #include #include #include int HcRecord::init(const char *ip, unsigned short port, const char *usrname, const char *passwd) { NET_DVR_Init(); //设置连接时间与重连时间 NET_DVR_SetConnectTime(2000, 1); NET_DVR_SetReconnect(10000, true); NET_DVR_USER_LOGIN_INFO struLoginInfo = {0}; struLoginInfo.bUseAsynLogin = 0; //同步登录方式 strcpy(struLoginInfo.sDeviceAddress, ip); //设备IP地址 struLoginInfo.wPort = port; //设备服务端口 strcpy(struLoginInfo.sUserName, usrname); //设备登录用户名 strcpy(struLoginInfo.sPassword, passwd); //设备登录密码 //设备信息, 输出参数 NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0}; m_lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40); if (m_lUserID < 0) { // printf("Login failed, error code: %d\n", NET_DVR_GetLastError()); NET_DVR_Cleanup(); return -1; } devSerialNumber = (char *) struDeviceInfoV40.struDeviceV30.sSerialNumber; UsefulChans(); return 0; } int HcRecord::unInit() { //注销用户 NET_DVR_Logout(m_lUserID); //释放SDK资源 NET_DVR_Cleanup(); return 0; } int HcRecord::saveRecordFile(int userId, char *srcfile, char *destfile) { int bRes = 1; int hPlayback = 0; if ((hPlayback = NET_DVR_GetFileByName(userId, srcfile, destfile)) < 0) { printf("GetFileByName failed. error[%d]\n", NET_DVR_GetLastError()); bRes = -1; return bRes; } if (!NET_DVR_PlayBackControl_V40(hPlayback, NET_DVR_PLAYSTART, NULL, 0, NULL, NULL)) { printf("play back control failed [%d]\n", NET_DVR_GetLastError()); bRes = -1; return bRes; } int nPos = 0; for (nPos = 0; nPos < 100 && nPos >= 0; nPos = NET_DVR_GetDownloadPos(hPlayback)) { //printf("Be downloading...%d %%\n", nPos); usleep(5000); //millisecond } printf("have got %d\n", nPos); if (!NET_DVR_StopGetFile(hPlayback)) { printf("failed to stop get file [%d]\n", NET_DVR_GetLastError()); bRes = -1; return bRes; } printf("%s\n", srcfile); if (nPos < 0 || nPos > 100) { printf("download err [%d]\n", NET_DVR_GetLastError()); bRes = -1; return bRes; } else { return 0; } } std::vector HcRecord::getUsefulChans() const { return m_vecUsefulChans; } std::string HcRecord::getSerialNumber() const { return devSerialNumber; } void HcRecord::UsefulChans() { m_vecUsefulChans.clear(); NET_DVR_IPPARACFG_V40 ipOut; long len; BOOL bret = NET_DVR_GetDVRConfig(m_lUserID, NET_DVR_GET_IPPARACFG_V40, 33, &ipOut, sizeof(NET_DVR_IPPARACFG_V40), (LPDWORD) &len); NET_DVR_PICCFG_V40 picOut; bret = NET_DVR_GetDVRConfig(m_lUserID, NET_DVR_GET_PICCFG_V40, 33, &picOut, sizeof(NET_DVR_PICCFG_V40), (LPDWORD) &len); DWORD dErr = NET_DVR_GetLastError(); BYTE byIPID, byIPIDHigh; int iDevInfoIndex, iGroupNO; for (int i = 0; i < ipOut.dwDChanNum; i++) { switch (ipOut.struStreamMode[i].byGetStreamType) { case 0: //直接从设备取流 if (ipOut.struStreamMode[i].uGetStream.struChanInfo.byEnable) { byIPID = ipOut.struStreamMode[i].uGetStream.struChanInfo.byIPID; byIPIDHigh = ipOut.struStreamMode[i].uGetStream.struChanInfo.byIPIDHigh; iDevInfoIndex = byIPIDHigh * 256 + byIPID - 1 - iGroupNO * 64; printf("IP channel no.%d is online, IP: %s\n", i + 1, ipOut.struIPDevInfo[iDevInfoIndex].struIP.sIpV4); m_vecUsefulChans.push_back(i + 33); } break; case 1: //从流媒体取流 if (ipOut.struStreamMode[i].uGetStream.struPUStream.struStreamMediaSvrCfg.byValid) { printf("IP channel %d connected with the IP device by stream server.\n", i + 1); printf("IP of stream server: %s, IP of IP device: %s\n", ipOut.struStreamMode[i].uGetStream.\ struPUStream.struStreamMediaSvrCfg.struDevIP.sIpV4, ipOut.struStreamMode[i].uGetStream.\ struPUStream.struDevChanInfo.struIP.sIpV4); } break; default: break; } } } std::string HcRecord::makeDirs(const std::string &strDevID, const int nChannel, const LPNET_DVR_TIME pStartTime, const LPNET_DVR_TIME pEndTime) { auto cutpath = appConfig.getStringProperty("cutPath"); if (cutpath.back() != '/') { cutpath.append("/"); } auto loadPath = appConfig.getStringProperty("loadPath"); if (loadPath.back() != '/') { loadPath.append("/"); } makeDir(cutpath, strDevID, nChannel, pStartTime, pEndTime); return makeDir(loadPath, strDevID, nChannel, pStartTime, pEndTime); } std::string HcRecord::makeDir(const std::string &strType, const std::string &strDevID, const int nChannel, const LPNET_DVR_TIME pStartTime, const LPNET_DVR_TIME pEndTime) { // char szPath[MAX_PATH] = {0}; // getcwd(szPath, MAX_PATH); // std::string strFinalPath(szPath); std::string strFinalPath = strType; if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str()); strFinalPath = strFinalPath + "/" + strDevID; if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str()); strFinalPath = strFinalPath + "/" + toString(nChannel); if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str()); strFinalPath = strFinalPath + "/" + std::to_string(pStartTime->dwYear) + toString(pStartTime->dwMonth); if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str()); strFinalPath = strFinalPath + "/" + toString(pStartTime->dwDay); if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str()); strFinalPath = strFinalPath + "/" + strDevID + "-" + toString(nChannel) + "-" + std::to_string(pStartTime->dwYear) + toString(pStartTime->dwMonth) + toString(pStartTime->dwDay) + toString(pStartTime->dwHour) + toString(pStartTime->dwMinute) + toString(pStartTime->dwSecond); if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str()); //2018-08-08 14:00:00.mp4 std::string filepath = strFinalPath + "/" + std::to_string(pStartTime->dwYear) + "-" + toString(pStartTime->dwMonth) + "-" + toString(pStartTime->dwDay) + " " + toString(pStartTime->dwHour) + ":" + toString(pStartTime->dwMinute) + ":" + toString(pStartTime->dwSecond) + ".mp4"; return filepath; } std::string HcRecord::toString(const int src) { std::stringstream ss; ss << std::setw(2) << std::setfill('0') << src; return ss.str(); } int HcRecord::downloadfiles(const std::string &strDevID, const int nChannel, const LPNET_DVR_TIME pStartTime, const LPNET_DVR_TIME pEndTime, std::string &filePath) { //获取路径 filePath = makeDirs(strDevID, nChannel, pStartTime, pEndTime); //将时间转化为QDateTime类型,便于时间比较 //#todo待优化 // string str_StringStartTime( // to_string(pStartTime->dwYear) + "-" + to_string(pStartTime->dwMonth) + "-" + to_string(pStartTime->dwDay) + " " // + to_string(pStartTime->dwHour) + ":" + to_string(pStartTime->dwMinute) + ":" + // to_string(pStartTime->dwSecond)); char ch_StringStartTime[128]; sprintf(ch_StringStartTime, "%04d-%02d-%02d %02d:%02d:%02d", pStartTime->dwYear, pStartTime->dwMonth, pStartTime->dwDay, pStartTime->dwHour, pStartTime->dwMinute, pStartTime->dwSecond); string str_StringStartTime(ch_StringStartTime); QDateTime taskStartTime = QDateTime::fromString(QString::fromStdString(str_StringStartTime), "yyyy-MM-dd hh:mm:ss"); // string str_StringEndTime( // to_string(pEndTime->dwYear) + "-" + to_string(pEndTime->dwMonth) + "-" + to_string(pEndTime->dwDay) + " " // + to_string(pEndTime->dwHour) + ":" + to_string(pEndTime->dwMinute) + ":" + to_string(pEndTime->dwSecond)); char ch_StringEndTime[128]; sprintf(ch_StringEndTime, "%04d-%02d-%02d %02d:%02d:%02d", pEndTime->dwYear, pEndTime->dwMonth, pEndTime->dwDay, pEndTime->dwHour, pEndTime->dwMinute, pEndTime->dwSecond); string str_StringEndTime(ch_StringEndTime); QDateTime taskEndTime = QDateTime::fromString(QString::fromStdString(str_StringEndTime), "yyyy-MM-dd hh:mm:ss"); //时间转化-------------end---------------------- //递归,将时间按照15min分割,若最后小于15min,则按剩余时间录制并结束递归 RecursiveByTimeDownloadfiles(strDevID, nChannel, taskStartTime, taskEndTime, filePath); return 0; } int HcRecord::RecursiveByTimeDownloadfiles(const std::string &strDevID, const int nChannel, QDateTime pStartTime, QDateTime pEndTime, std::string &filePath) { NET_DVR_TIME startTime; startTime.dwYear = pStartTime.date().year(); startTime.dwMonth = pStartTime.date().month(); startTime.dwDay = pStartTime.date().day(); startTime.dwHour = pStartTime.time().hour(); startTime.dwMinute = pStartTime.time().minute(); startTime.dwSecond = pStartTime.time().second(); std::string tmp_filepath = std::to_string(startTime.dwYear) + "-" + toString(startTime.dwMonth) + "-" + toString(startTime.dwDay) + " " + toString(startTime.dwHour) + ":" + toString(startTime.dwMinute) + ":" + toString(startTime.dwSecond) + ".mp4"; auto pos = filePath.rfind("/"); // cout << filePath << endl; filePath.replace(pos+1, filePath.size() - pos, tmp_filepath); // cout << filePath << endl; QDateTime tmp_EndTime = pStartTime.addSecs(1 * 60 * 15); if (tmp_EndTime < pEndTime) { NET_DVR_TIME endTime; endTime.dwYear = tmp_EndTime.date().year(); endTime.dwMonth = tmp_EndTime.date().month(); endTime.dwDay = tmp_EndTime.date().day(); endTime.dwHour = tmp_EndTime.time().hour(); endTime.dwMinute = tmp_EndTime.time().minute(); endTime.dwSecond = tmp_EndTime.time().second(); Downloadfile(strDevID, nChannel, &startTime, &endTime, filePath); RecursiveByTimeDownloadfiles(strDevID, nChannel, tmp_EndTime, pEndTime, filePath); } else { NET_DVR_TIME endTime; endTime.dwYear = pEndTime.date().year(); endTime.dwMonth = pEndTime.date().month(); endTime.dwDay = pEndTime.date().day(); endTime.dwHour = pEndTime.time().hour(); endTime.dwMinute = pEndTime.time().minute(); endTime.dwSecond = pEndTime.time().second(); Downloadfile(strDevID, nChannel, &startTime, &endTime, filePath); return 0; } } int HcRecord::Downloadfile(const std::string &strDevID, const int nChannel, const LPNET_DVR_TIME pStartTime, const LPNET_DVR_TIME pEndTime, std::string &filePath) { // NET_DVR_TIME startTime; // startTime.dwYear = pStartTime.date().year(); // startTime.dwMonth = pStartTime.date().month(); // startTime.dwDay = pStartTime.date().day(); // startTime.dwHour = pStartTime.time().hour(); // startTime.dwMinute = pStartTime.time().minute(); // startTime.dwSecond = pStartTime.time().second(); // // NET_DVR_TIME endTime; // endTime.dwYear = pEndTime.date().year(); // endTime.dwMonth = pEndTime.date().month(); // endTime.dwDay = pEndTime.date().day(); // endTime.dwHour = pEndTime.time().hour(); // endTime.dwMinute = pEndTime.time().minute(); // endTime.dwSecond = pEndTime.time().second(); NET_DVR_PLAYCOND struDownloadCond = {0}; struDownloadCond.dwChannel = nChannel; struDownloadCond.struStartTime.dwYear = pStartTime->dwYear; struDownloadCond.struStartTime.dwMonth = pStartTime->dwMonth; struDownloadCond.struStartTime.dwDay = pStartTime->dwDay; struDownloadCond.struStartTime.dwHour = pStartTime->dwHour; struDownloadCond.struStartTime.dwMinute = pStartTime->dwMinute; struDownloadCond.struStartTime.dwSecond = pStartTime->dwSecond; struDownloadCond.struStopTime.dwYear = pEndTime->dwYear; struDownloadCond.struStopTime.dwMonth = pEndTime->dwMonth; struDownloadCond.struStopTime.dwDay = pEndTime->dwDay; struDownloadCond.struStopTime.dwHour = pEndTime->dwHour; struDownloadCond.struStopTime.dwMinute = pEndTime->dwMinute; struDownloadCond.struStopTime.dwSecond = pEndTime->dwSecond; // filePath = makeDirs(strDevID, nChannel, pStartTime, pEndTime); //std::cout << filePath << std::endl; //--------------------------------------- //按时间下载 int hPlayback; hPlayback = NET_DVR_GetFileByTime_V40(m_lUserID, (char *) filePath.c_str(), &struDownloadCond); if (hPlayback < 0) { printf("NET_DVR_GetFileByTime_V40 fail,last error %d\n", NET_DVR_GetLastError()); NET_DVR_Logout(m_lUserID); NET_DVR_Cleanup(); return -1; } //--------------------------------------- //开始下载 if (!NET_DVR_PlayBackControl_V40(hPlayback, NET_DVR_PLAYSTART, NULL, 0, NULL, NULL)) { printf("Play back control failed [%d]\n", NET_DVR_GetLastError()); NET_DVR_Logout(m_lUserID); NET_DVR_Cleanup(); return -1; } int nPos = 0; for (nPos = 0; nPos < 100 && nPos >= 0; nPos = NET_DVR_GetDownloadPos(hPlayback)) { //printf("Be downloading... %d %%\n",nPos); usleep(5000); //millisecond } if (!NET_DVR_StopGetFile(hPlayback)) { printf("failed to stop get file [%d]\n", NET_DVR_GetLastError()); NET_DVR_Logout(m_lUserID); NET_DVR_Cleanup(); return -1; } if (nPos < 0 || nPos > 100) { printf("download err [%d]\n", NET_DVR_GetLastError()); NET_DVR_Logout(m_lUserID); NET_DVR_Cleanup(); return -1; } //printf("Be downloading... %d %%\n",nPos); return 0; }