天天看點

JAVA實作onvif的ptz控制_使用Onvif協定進行裝置PTZ雲台控制

接上一篇

使用Onvif協定最重要的應用就是對裝置進行PTZ雲台控制,PTZ控制包含轉動、變焦等,這裡我們主要讨論常用的轉動和變焦(也就是放大縮小)

流程

要進行裝置PTZ控制,我們首先需要擷取到裝置的Device Service Address和此裝置的使用者名密碼

前兩個流程和擷取流位址一樣

擷取裝置能力Capabilities

擷取裝置的能力,并且可以擷取到Media和PTZ的URI,使用這兩個URL可以進行流和PTZ操作,這裡如果PTZ URI擷取不到意味着這個裝置無法支援PTZ控制

_tds__GetCapabilities* capabilities = soap_new__tds__GetCapabilities(proxyDevice, -1);

tt__CapabilityCategory* category = new tt__CapabilityCategory;

capabilities->Category = category;

*(capabilities->Category) = tt__CapabilityCategory__All;

_tds__GetCapabilitiesResponse* response = soap_new__tds__GetCapabilitiesResponse(proxyDevice, -1);

if (SOAP_OK == proxyDevice->GetCapabilities(capabilities, response))

{

if (response->Capabilities)

{

//Media URI: response->Capabilities->Media->XAddr;

//PTZ URI: response->Capabilities->PTZ->XAddr;

}

}

擷取Media Profile

使用上一步擷取到的Media URI擷取裝置的Media Profile

_trt__GetProfiles* getProfiles = soap_new__trt__GetProfiles(proxyMedia, -1);

_trt__GetProfilesResponse* response = soap_new__trt__GetProfilesResponse(proxyMedia, -1);

if (SOAP_OK == proxyMedia->GetProfiles(getProfiles, response))

{

int size = response->__sizeProfiles;

for (int i = 0; i < size; ++i)

{

if (response->Profiles[i])

{

//Media Profile Token: response->Profiles[i]->token;

//一般裝置包含多個Profile Token,包含主碼流、子碼流、第三碼流

}

}

}

PTZ控制

使用擷取的Media URI和Media Profile Token進行PTZ控制

PTZ控制,這裡隻考慮ContinuousMove,需要在停止的時候發送停止指令

_tptz__ContinuousMove* continuousMove = soap_new__tptz__ContinuousMove(ptzProxy, -1);

_tptz__ContinuousMoveResponse* response = soap_new__tptz__ContinuousMoveResponse(ptzProxy, -1);

continuousMove->ProfileToken = const_cast(profile.c_str());

tt__PTZSpeed* velocity = soap_new_tt__PTZSpeed(ptzProxy, -1);

continuousMove->Velocity = velocity;

tt__Vector2D* panTilt = soap_new_tt__Vector2D(ptzProxy, -1);

continuousMove->Velocity->PanTilt = panTilt;

continuousMove->Velocity->PanTilt->space = "http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace";

tt__Vector1D* zoom = soap_new_tt__Vector1D(ptzProxy, -1);

continuousMove->Velocity->Zoom = zoom;

switch (command)

{

case LEFT:

continuousMove->Velocity->PanTilt->x = -((float)speed / 10);

continuousMove->Velocity->PanTilt->y = 0;

break;

case RIGHT:

continuousMove->Velocity->PanTilt->x = ((float)speed / 10);

continuousMove->Velocity->PanTilt->y = 0;

break;

case UP:

continuousMove->Velocity->PanTilt->x = 0;

continuousMove->Velocity->PanTilt->y = ((float)speed / 10);

break;

case DOWN:

continuousMove->Velocity->PanTilt->x = 0;

continuousMove->Velocity->PanTilt->y = -((float)speed / 10);

break;

case ZOOMIN:

continuousMove->Velocity->Zoom->x = ((float)speed / 10);

break;

case ZOOMOUT:

continuousMove->Velocity->Zoom->x = -((float)speed / 10);

break;

default:

break;

}

if (ptzProxy->ContinuousMove(continuousMove, response) == SOAP_OK)

//轉動成功

停止PTZ控制

_tptz__Stop* stop = soap_new__tptz__Stop(ptzProxy, -1);

_tptz__StopResponse* response = soap_new__tptz__StopResponse(ptzProxy, -1);

stop->ProfileToken = const_cast(profile.c_str());

bool* pantilt = new bool;

stop->PanTilt = pantilt;

*(stop->PanTilt) = true;

bool* zoom = new bool;

stop->Zoom = zoom;

*(stop->Zoom) = true;

if (SOAP_OK == ptzProxy->Stop(stop, response))

//停止成功

擷取更多資訊

Copyright © EasyDarwin.org 2012-2017

JAVA實作onvif的ptz控制_使用Onvif協定進行裝置PTZ雲台控制