从研发初期开始,EasyCVR安防协议视频综合管理系统就被设计为一个“全能型”平台,支持各种私有协议接入,并且还提供了onvif探测功能。使用Onvif协议的优势在于,终端用户和集成商可以使用不同制造商的技术和解决方案。该协议的支持大大拓展了EasyCVR的适用范围,使其更具广泛性。
在局域网内使用EasyCVR时,可以利用Onvif探测的方式轻松发现可用的摄像头并直接获取流地址,操作简单便捷。然而,在某些特定场景中,可能会遇到无法成功探测或获取流地址的情况,但使用Onvif设备管理器却能够发现设备。
通过抓包调试定位问题,发现在GetStreamUrl中的参数与EasyCVR中的内容存在差异。在GetStreamUrl中,参数为Profile Token=Profile_1,并且成功获取到地址时传递此参数。而在EasyCVR中传输的参数为Profile Token=Profile_101,当返回101时表示获取地址失败,因此无法进行Onvif探测。
上图为onvif device manager的抓包结果。要解决此问题,我们只需在EasyCVR中将101字段改为1即可正常获取流地址。参考代码如下:
fmt.Println("call GetStreamUri")
m_media_url_req := media.GetStreamUri{
XMLName:"http://www.onvif.org/ver10/media/wsdl",
StreamSetup:onvif2.StreamSetup{
Stream: "RTP-Unicast",
Transport: onvif2.Transport{
Protocol: "RTSP",
Tunnel: nil,
},
},
ProfileToken: "Profile_1",
}
{
m_media_url_resp, err := dev.CallMethod(m_media_url_req)
if err == nil {
//fmt.Println("resp:", readResponse(m_media_url_resp))
bs, _ := ioutil.ReadAll(m_media_url_resp.Body)
log.Printf("output %+v %s", m_media_url_resp.StatusCode, bs)
//{
// var methodStruct interface{}
// methodStruct,e :=getMediaStructByName("GetProfiles")
// if e == nil{
// str := string(bs)
// resp, err := xmlAnalize(methodStruct, &str)
// if err != nil {
// return
// }
//
// log.Println(resp)
// }
//}
}
}
目前在TSINGSEE青犀视频开发的多个视频平台项目当中,EasyNVR和EasyCVR在支持RTSP协议的同时已经支持了Onvif探测,支持通过Onvif控制摄像头云台,该功能可以在测试中使用,欢迎大家测试。
标签:Profile,视频,url,media,resp,EasyCVR,Onvif From: https://blog.51cto.com/u_16247540/7411090