天天看點

通過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秒換一個地方的同時抓取一張圖檔。