码迷,mamicode.com
首页 > 其他好文 > 详细

摄像头数据的接入

时间:2015-05-29 00:59:26      阅读:977      评论:0      收藏:0      [点我收藏+]

标签:

我的个人博客( 肥龙的博客)发表了新文章了!
欢迎大家过来阅读,以下是文章的连接地址

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!