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