天天看点

通过onvif抓取海康摄像头图片,以及解决海康摄像头抓取图片需要验证问题,实现摄像头一段时间换一个地方的同时抓取一张图片。

1.实现海康摄像头的图片的抓取。

思路:1.首先获取图片的url,2通过java实现图片的下载

1.使用onvif获取图片的url

//首先获取OnvifDevice的对象
				OnvifDevice od = new OnvifDevice("IP","摄像头用户名","密码","Token");
				
				//通过OnvifDevice获取Media的对象
				Media media = od.getMedia();
				
				//获取设备中的Profile集合
				List<Profile> listProfiles = media.getProfiles();
					
				//通过media中的getSnapshotUri(Token).getUri()获取图片url
				//获得图片的URL
				String url1 = media.getSnapshotUri(listProfiles.get(0).getToken() /* 此处不同的Token对应着通道*/ ).getUri();
			
           

2.使用java实现海康摄像头图片的下载

public static void downLoad(String urls) {
		try {
				//构造URL
				URL url = new URL(urls);
				//打开连接
				URLConnection con = url.openConnection();
				
				String username = "用户名";
				String password ="密码";
				String userPassword = username+":"+password;
				
				String encoding = Base64.encodeBase64String(userPassword.getBytes());
				con.setRequestProperty("Authorization", "Basic "+encoding);
				
				//获取输入流
				InputStream is = con.getInputStream();
				
				//格式化时间
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
				String format = simpleDateFormat.format(new Date());
				
				
				//1k的缓冲数据
				byte [] bs = new byte[1024];
				
				//阅读到的数据长度
				int len;
				
				//输出的文件流
				String filename = "D:\\a/"+format+".jpg";
				File file = new File(filename);
				FileOutputStream os = new FileOutputStream(file,true);
				
				//开始读取
				while((len = is.read(bs)) != -1) {
					os.write(bs,0,len);
				}
				//完毕,关闭连接
				os.close();
				is.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	}
           

3.用代码实现根据预置点使摄像头在一段时间后移动并取照、

//根据OnvifDevice 获取PTZ的实例
				   PTZ ptz = od.getPtz();
				   //获取所有预置点的实例
				   List<PTZPreset> listPtzPreset =	ptz.getPresets(listProfiles.get(0).getToken());
				   //可以通过摄像头的后台管理设置预置点,如果设置完后,可以获取预置点的x,y,如果没有设置,则获取的x为-1.0。y为-1.0。
				   if(listPtzPreset.get(0).getPTZPosition().getPanTilt().getX() == -1.0 && listPtzPreset.get(0).getPTZPosition().getPanTilt().getY() ==-1.0) return ;
					if(listPtzPreset.get(1).getPTZPosition().getPanTilt().getX() == -1.0 && listPtzPreset.get(1).getPTZPosition().getPanTilt().getY() ==-1.0) return ;
					
					//AbsoluteMove:移动摇摄,倾斜和变焦到一个绝对的目标
					//listProfiles.get(0).getToken() :Token验证
					//位置:可以通过获取的预置点获得对应的位置 :listPtzPreset.get(0).getPTZPosition()
					//速度:new PTZSpeed()
					ptz.absoluteMove(listProfiles.get(0).getToken(), listPtzPreset.get(0).getPTZPosition(), new PTZSpeed());
					downLoadPhoto.downLoad(url1);	//将抓取图片封装成一个静态方法,在downLoadPhoto类中
					Thread.sleep(15000); //睡15秒
					ptz.absoluteMove(listProfiles.get(0).getToken(), listPtzPreset.get(0).getPTZPosition(), new PTZSpeed());
					downLoadPhoto.downLoad(url1);
					Thread.sleep(15000); //睡15秒
           

以上就能实现摄像头15秒换一个地方的同时抓取一张图片。