Java onvif协议通用协议获取rtsp地址

Java onvif协议通用协议获取rtsp地址

吐槽下可搜索的资源真的是少,好多都是4 5年前的资料

onvif通用协议就不说了,大多摄像头都可用,利用onvif获取实时流和历史流转换成h264编码推送到前端,用h5新标签直接播放

onvif协议大部分是c或者android 资料 java的比较少 感谢大佬留下的宝贵资源:

1. https://github.com/RootSoft/ONVIF-Java   (功能不够完善,没有使用例子)

2. https://github.com/fpompermaier/onvif   (这个是基于上面的项目封装,有简单的例子,这里使用的这个)

实际使用:

前言:因为例子有限,没有历史流rtsp地址的使用,在参考例子和源码下,走了很多坑

后续更新利用javacv 使用rtsp地址拉取流推送出去。

上代码:

将第二个项目拉下来打包到本地仓库 下面的

pom 中的onvif-ws-client就是打包到本地仓库的

项目地址:https://github.com/xsjzf/onvif_java

核心的地方是:

这里说明下例子中只有实时流rtsp地址的方法获取

在onvif-ws-client的源码中有很多功能例子中只有media 也就是实时流的

要使用历史流则需要自行添加 就是replay和recording 其他功能详见onvif的官网文档

Capabilities capabilities = this.device.getCapabilities(Arrays.asList(CapabilityCategory.ALL));

@javax.xml.bind.annotation.XmlElement(name = "Analytics")

protected org.onvif.ver10.schema.AnalyticsCapabilities analytics;

@javax.xml.bind.annotation.XmlElement(name = "Device")

protected org.onvif.ver10.schema.DeviceCapabilities device;

@javax.xml.bind.annotation.XmlElement(name = "Events")

protected org.onvif.ver10.schema.EventCapabilities events;

@javax.xml.bind.annotation.XmlElement(name = "Imaging")

protected org.onvif.ver10.schema.ImagingCapabilities imaging;

@javax.xml.bind.annotation.XmlElement(name = "Media")

protected org.onvif.ver10.schema.MediaCapabilities media;

@javax.xml.bind.annotation.XmlElement(name = "PTZ")

protected org.onvif.ver10.schema.PTZCapabilities ptz;

@javax.xml.bind.annotation.XmlElement(name = "Extension")

protected org.onvif.ver10.schema.CapabilitiesExtension extension;

OnvifDevice 的init方法中

Capabilities对象里面除了基本的功能大多在Extension里面

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "CapabilitiesExtension", propOrder = {

"any",

"deviceIO",

"display",

"recording",

"search",

"replay",

"receiver",

"analyticsDevice",

"extensions"

})

public class CapabilitiesExtension {

@XmlAnyElement(lax = true)

protected List any;

@XmlElement(name = "DeviceIO")

protected DeviceIOCapabilities deviceIO;

@XmlElement(name = "Display")

protected DisplayCapabilities display;

@XmlElement(name = "Recording")

protected RecordingCapabilities recording;

@XmlElement(name = "Search")

protected SearchCapabilities search;

@XmlElement(name = "Replay")

protected ReplayCapabilities replay;

@XmlElement(name = "Receiver")

protected ReceiverCapabilities receiver;

@XmlElement(name = "AnalyticsDevice")

protected AnalyticsDeviceCapabilities analyticsDevice;

@XmlElement(name = "Extensions")

protected CapabilitiesExtension2 extensions;

例如我这里需要历史流的功能那么我在init方法中初始化添加上

if (capabilities.getExtension().getReplay() != null && capabilities.getExtension().getReplay().getXAddr() != null) {

this.replayPort = new ReplayService().getReplayPort();

this.replayPort =

getServiceProxy((BindingProvider) replayPort, capabilities.getExtension().getReplay().getXAddr())

.create(ReplayPort.class);

}

if (capabilities.getExtension().getRecording() != null && capabilities.getExtension().getRecording().getXAddr() != null) {

this.recordingPort = new RecordingService().getRecordingPort();

this.recordingPort =

getServiceProxy((BindingProvider) recordingPort, capabilities.getExtension().getRecording().getXAddr())

.create(RecordingPort.class);

}

if (capabilities.getExtension().getSearch() != null && capabilities.getExtension().getSearch().getXAddr() != null) {

this.searchPort = new SearchService().getSearchPort();

this.searchPort =

getServiceProxy((BindingProvider) searchPort, capabilities.getExtension().getSearch().getXAddr())

.create(SearchPort.class);

}

具体使用:

/**

* 获取到OnvifDevice对象

* @param host 摄像头地址 92.168.xx.yy, or http://host[:port]

* @param username 用户名

* @param password 密码

* @param profileToken "MediaProfile000" If empty, will use first profile.

* @return

*/

public static OnvifDevice getOnvifCredentials(String host, String username, String password, String profileToken){

try {

OnvifCredentials credentials = new OnvifCredentials(host, username, password, profileToken);

//补全host

URL u = credentials.getHost().startsWith("http")

? new URL(credentials.getHost())

: new URL("http://" + credentials.getHost());

return new OnvifDevice(u, credentials.getUser(), credentials.getPassword());

} catch (MalformedURLException | ConnectException | SOAPException e) {

e.printStackTrace();

throw new RrException(e.getMessage());

}

}

/**

* 获取实时rtsp地址

* @param onvifDevice 设备

* @return

* @throws Exception

*/

public static String getRtspUrl(OnvifDevice onvifDevice) throws Exception {

List profiles = onvifDevice.getMedia().getProfiles();

for (Profile profile : profiles) {

String profileToken = profile.getToken();

String rtsp = onvifDevice.getStreamUri(profileToken, TransportProtocol.RTSP);

String uri = "rtsp://" + onvifDevice.getUser() + ":" + onvifDevice.getPassword() + "@" + rtsp.replace("rtsp://", "");

}

return "";

}

/**

* 获取历史rtsp地址

* @param onvifDevice 设备

* @return

*/

public static String getReplayUrl(OnvifDevice onvifDevice){

List recordings = onvifDevice.getRecordingPort().getRecordings();

for (GetRecordingsResponseItem recording : recordings) {

String recordingToken = recording.getRecordingToken();

String rtsp = onvifDevice.getReplayUri(onvifDevice, recordingToken, TransportProtocol.RTSP);

String uri = "rtsp://" + onvifDevice.getUser() + ":" + onvifDevice.getPassword() + "@" + rtsp.replace("rtsp://", "");

}

return "";

}

/**

* 转换 时间段为rtsp时间格式

* @param start 开始

* @param end 结束

* @return ?starttime=20200908t093812z&endtime=20200908t104816z

*/

public static String getRtspTimeSpace(LocalDateTime start, LocalDateTime end){

Long st = start.toInstant(ZoneOffset.of("+8")).toEpochMilli();

Long ed = end.toInstant(ZoneOffset.of("+8")).toEpochMilli();

String ios8601St = getDate(st);

String ios8601Ed = getDate(st);

return "?starttime=" + ios8601St + "&endtime=" + ios8601Ed;

}

/**

* 时间戳转换成IOS8601格式

* @param beginTime

* @return

*/

public static String getDate(Long beginTime) {

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String bt = format.format(beginTime);

Date date = null;

try {

date = format.parse(bt);

} catch (Exception e) {

e.printStackTrace();

}

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'T'HHmmss'z'");

return sdf.format(date);

}

这里就会获取到实时流和历史流的rtsp地址 后续文章会使用这个地址实现视频推流

****持续更新****

Java onvif协议通用协议获取rtsp地址相关教程

Java onvif协议,Java onvif协议通用协议获取rtsp地址相关推荐

  1. Atitit onvif协议获取rtsp地址播放java语言 attilx总结

    Atitit onvif协议获取rtsp地址播放java语言 attilx总结 1.1. 获取rtsp地址的算法与流程1 1.2. Onvif摄像头的发现,ws的发现机制,使用xcf类库1 2. 调用 ...

  2. ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)

    概要:   目前ONVIF协议家族设备已占据数字监控行业半壁江山以上,亲,作为开发者的你还在犹豫是否了解下吗?本文介绍了ONVIF客户端从设备搜索,鉴权,能力获取,媒体信息获取,URI地址获取的整套流 ...

  3. 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)

    转载地址:http://blog.csdn.net/gubenpeiyuan/article/details/25618177 概要:           目前ONVIF协议家族设备已占据数字监控行业 ...

  4. java class类型参数_java – 如何从通用类型参数获取`.class`属性?

    this question的接受答案描述了如何在通用< T>中创建T的实例.类.这涉及传递类< T>参数传递给Generic构造函数,并从中调用newInstance方法. 通 ...

  5. onvif学习笔记10:获取RTSP流地址

    有网友购买了我的ONVIF视频课程 (注:CSDN已经把课程下架了,说不符合要求),问了我几个问题,其中一个是实现ONVIF服务器的获取RTSP地址功能,本文整理出一个思路,愿帮到在学习ONVIF路上 ...

  6. JAVA程序 通过IP地址 获取MAC地址

    转载自:https://blog.csdn.net/chwshuang/article/details/46958719 叙述 我们都知道通过在电脑上敲 cmd 后,输入ipconfig -all 来 ...

  7. ONVIF获取265的rtsp地址,ptz控制记录

    1.获取url.ptz或imaging的一般流程 <1>.注意   GetCapabilities是向下兼容的接口只能获取到设备支持的最基本功能.GetServices接口能获取到设备支持 ...

  8. java 协议这个概念_java网络协议概念是什么?

    网络协议 对于需要从事网络编程的程序员来说,网络协议是一个需要深刻理解的概念.那么什么是网络协议呢? 网络协议是指对于网络中传输的数据格式的规定.对于网络编程初学者来说,没有必要深入了解TCP/IP协 ...

  9. java dubbo协议_Dubbo同时支持多种协议(以dubbo和rest为例)

    一. 背景知识 有时候微服务需要提供给多个消费者, 而不通过的消费者可能希望依据自身情况使用不同的协议. 另一方面, 有时候如果原本服务以 dubbo 协议提供服务, 但是为了调试或者监控方便, 我们 ...

  10. 以http协议实现onvif协议并完成对IPC摄像头的监控

    文章目录 目录 文章目录 前言 1实现http连接 2 获取设备编码参数 3.设置摄像头相关参数 总结 前言 因为工作上的原因,需要接入IPC摄像头,实现监控功能,因而开始了对于IPC摄像头的学习之路 ...

最新文章

  1. Hyper-V 2016 系列教程12 Hyper-V 体系结构
  2. 最近python为什么这么火-现在为什么 Python 这么火?
  3. Zabbix 4.2 发布:支持Prometheus数据收集,可扩展性大大提升
  4. 安装最新版本的ReSharper导致原生全局搜索工具的消失问题
  5. 存储组件的实现思路分析及代码实现
  6. HDU1407 测试你是否和LTC水平一样高 暴力、二分、hash
  7. r语言x c(-1 -2),【软件】R语言入门之向量
  8. 360视频云Web前端HEVC播放器实践剖析
  9. C语言家谱管理程序,课内资源 - 基于C语言实现的家谱管理系统
  10. Phase retrieval交替投影
  11. python numpy数组画图_python – Numpy和Pyplot的条件绘图
  12. python image清除_60秒掌握Python内置模块Turtle的用法——绘制漫天雪花
  13. matlab s函数模板,MATLAB第5章S函数.ppt
  14. 几十个珍藏的网站,相信你会用到的
  15. 数据库系统工程师考点
  16. 6.郝斌C语言笔记——流程控制
  17. event mpm php,CentOS 7 安装 PHP-FPM 及使用 mod_mpm_event
  18. 2022茶艺师(初级)试题及在线模拟考试
  19. 腾云忆想技术干货|TSF微服务治理实战系列(一)——治理蓝图
  20. Java对象逃逸分析

热门文章

  1. linux进入pe系统,如何进入pe系统【解答办法】
  2. Neo4j AuraDB免费版——Data Importer
  3. UEditor编辑器保存数据到数据库
  4. 五笔字根表识别码图_王码86版五笔字根表口诀助记词(完整大图)
  5. PAT乙级1072(C++)——龙哥哥的刷题路
  6. 高等数学复盘 | 第七册上册第一章——第六章思维导图梳理(复习专用)
  7. c语言系统编程项目实训,《C语言程序设计》项目实训指导书.doc
  8. UKEY开发,vue+websocket实现用户登录UKEY认证
  9. ukey网络连接异常_Ukey的各种操作,你知道吗?
  10. 电气控制及可编程序控制器【1】