标签:
我的个人博客( 肥龙的博客)发表了新文章了!http://www.comingcode.com/?p=446
公司系统开始将摄像头数据接入进来了,所以最近都在弄调用摄像头厂家sdk的东西,基本就看了三个厂家:大华、海康、科达,都是先从开发文档开始了解,然后开始写些简单的测试程序验证我们的需求。
既然有了比较,这里我肯定也要比较一下三个厂家的sdk使用易用性。就目前了解的程度来看,大华和海康的sdk基本都是一样的,听说这两个其实以前是同一个厂家,后来分出来变成两个的,所以sdk差不多也是可以想象的。而科达的sdk,就肯定是反面教材了。
首先,它的sdk居然是一个ocx,也就无法支持linux了,这就比另外两个厂家低了一半,然后还是要在窗口中添加控件出来才能正常调用接口,这个才是令人最抓狂的了,我如果想在后台服务器调用你的接口,难道还弄个窗口程序?不是吧。实在无法忍受!还有就是接口的使用很麻烦,同样一个登录功能,科达的接口还弄成了异步的,你要我的程序写成什么样才高兴呢,为什么不做成同步的呢,要异步的话我自己处理就行了。
目前还是先开始做海康的sdk调用,第一步主要实现登录设备,获取指定时间段的视频数据存放在后台的分布式存储系统。海康的sdk调用还算简单吧
void TestHC() { if(FALSE == NET_DVR_Init()) return; NET_DVR_SetConnectTime(2000, 1); NET_DVR_SetReconnect(10000, true); char tErrStr[256] = {0}; NET_DVR_DEVICEINFO_V30 m_deviceInfo; LONG tUserId = NET_DVR_Login_V30("192.168.21.32", 8000, "admin", "12345", &m_deviceInfo); LONG tError = NET_DVR_GetLastError(); if(tUserId == -1) { sprintf(tErrStr, "NET_DVR_Login_V30() failed, ErrorCode:%ld\n",tError); OutputDebugString(tErrStr); return; } NET_DVR_TIME tStart; tStart.dwYear = 2015; tStart.dwMonth = 5; tStart.dwDay = 25; tStart.dwHour = 10; tStart.dwMinute = 0; tStart.dwSecond = 0; NET_DVR_TIME tEnd; tEnd.dwYear = 2015; tEnd.dwMonth = 5; tEnd.dwDay = 25; tEnd.dwHour = 11; tEnd.dwMinute = 39; tEnd.dwSecond = 30; for(int i=0; i<1/*m_deviceInfo.byChanNum*/; i++) { //指定下载的文件 sprintf(tErrStr, "d:/media%d.mp4", GetTickCount()%10000); LONG tRet = NET_DVR_GetFileByTime(tUserId, m_deviceInfo.byStartChan+i, &tStart, &tEnd,tErrStr); tError = NET_DVR_GetLastError(); if(tRet == -1) { sprintf(tErrStr, "NET_DVR_GetFileByTime() failed, chanel=%d ErrorCode:%ld\n",m_deviceInfo.byStartChan+i, tError); OutputDebugString(tErrStr); continue; } //开启下载 bool flagPlay = NET_DVR_PlayBackControl_V40(tRet, NET_DVR_PLAYSTART ,0,NULL); tError = NET_DVR_GetLastError(); if(!flagPlay) { sprintf(tErrStr, "NET_DVR_PlayBackControl() failed ,ErrorCode: %lu\n",tError); OutputDebugString(tErrStr); continue; } //设置下载速度 int tSpeed = 10240; if(FALSE == NET_DVR_PlayBackControl_V40(tRet, NET_DVR_SETSPEED, &tSpeed, 4, NULL, NULL)) { sprintf(tErrStr, "NET_DVR_PlayBackControl_V40(NET_DVR_SETSPEED) failed ,ErrorCode: %lu\n",NET_DVR_GetLastError()); OutputDebugString(tErrStr); } //获取下载进度 int nPos = 0; for(nPos = 0; nPos<100&&nPos>=0; ) { Sleep(2000); //millisecond nPos = NET_DVR_GetDownloadPos(tRet); sprintf(tErrStr, "channel:%2ld, is downloading...%d %%\n", m_deviceInfo.byStartChan+i, nPos); //下载进度 OutputDebugString(tErrStr); } } //注销用户 NET_DVR_Logout(tUserId); //释放SDK资源 NET_DVR_Cleanup(); }
接口中调用下载文件的时候,最后一个参数直接就传了本地路径的全路径,这个地方说方便也可以,说不灵活也可以,就看个人看法了。但是海康接口可以自定义下载速度,这个还是觉得做得挺赞的,因为一开始的时候就没有想过它会提供这样的接口。
ps:最近在看《《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕)》这本书,很有感触,对多线程编程有了更深的理解,同时也感到自己的弱小,继续保持学习的态度,多读书多总结多练习吧。
标签:
原文地址:http://my.oschina.net/dragonblog/blog/421766