Java onvif协议,Java onvif协议通用协议获取rtsp地址
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地址相关推荐
- Atitit onvif协议获取rtsp地址播放java语言 attilx总结
Atitit onvif协议获取rtsp地址播放java语言 attilx总结 1.1. 获取rtsp地址的算法与流程1 1.2. Onvif摄像头的发现,ws的发现机制,使用xcf类库1 2. 调用 ...
- ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
概要: 目前ONVIF协议家族设备已占据数字监控行业半壁江山以上,亲,作为开发者的你还在犹豫是否了解下吗?本文介绍了ONVIF客户端从设备搜索,鉴权,能力获取,媒体信息获取,URI地址获取的整套流 ...
- 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
转载地址:http://blog.csdn.net/gubenpeiyuan/article/details/25618177 概要: 目前ONVIF协议家族设备已占据数字监控行业 ...
- java class类型参数_java – 如何从通用类型参数获取`.class`属性?
this question的接受答案描述了如何在通用< T>中创建T的实例.类.这涉及传递类< T>参数传递给Generic构造函数,并从中调用newInstance方法. 通 ...
- onvif学习笔记10:获取RTSP流地址
有网友购买了我的ONVIF视频课程 (注:CSDN已经把课程下架了,说不符合要求),问了我几个问题,其中一个是实现ONVIF服务器的获取RTSP地址功能,本文整理出一个思路,愿帮到在学习ONVIF路上 ...
- JAVA程序 通过IP地址 获取MAC地址
转载自:https://blog.csdn.net/chwshuang/article/details/46958719 叙述 我们都知道通过在电脑上敲 cmd 后,输入ipconfig -all 来 ...
- ONVIF获取265的rtsp地址,ptz控制记录
1.获取url.ptz或imaging的一般流程 <1>.注意 GetCapabilities是向下兼容的接口只能获取到设备支持的最基本功能.GetServices接口能获取到设备支持 ...
- java 协议这个概念_java网络协议概念是什么?
网络协议 对于需要从事网络编程的程序员来说,网络协议是一个需要深刻理解的概念.那么什么是网络协议呢? 网络协议是指对于网络中传输的数据格式的规定.对于网络编程初学者来说,没有必要深入了解TCP/IP协 ...
- java dubbo协议_Dubbo同时支持多种协议(以dubbo和rest为例)
一. 背景知识 有时候微服务需要提供给多个消费者, 而不通过的消费者可能希望依据自身情况使用不同的协议. 另一方面, 有时候如果原本服务以 dubbo 协议提供服务, 但是为了调试或者监控方便, 我们 ...
- 以http协议实现onvif协议并完成对IPC摄像头的监控
文章目录 目录 文章目录 前言 1实现http连接 2 获取设备编码参数 3.设置摄像头相关参数 总结 前言 因为工作上的原因,需要接入IPC摄像头,实现监控功能,因而开始了对于IPC摄像头的学习之路 ...
最新文章
- Hyper-V 2016 系列教程12 Hyper-V 体系结构
- 最近python为什么这么火-现在为什么 Python 这么火?
- Zabbix 4.2 发布:支持Prometheus数据收集,可扩展性大大提升
- 安装最新版本的ReSharper导致原生全局搜索工具的消失问题
- 存储组件的实现思路分析及代码实现
- HDU1407 测试你是否和LTC水平一样高 暴力、二分、hash
- r语言x c(-1 -2),【软件】R语言入门之向量
- 360视频云Web前端HEVC播放器实践剖析
- C语言家谱管理程序,课内资源 - 基于C语言实现的家谱管理系统
- Phase retrieval交替投影
- python numpy数组画图_python – Numpy和Pyplot的条件绘图
- python image清除_60秒掌握Python内置模块Turtle的用法——绘制漫天雪花
- matlab s函数模板,MATLAB第5章S函数.ppt
- 几十个珍藏的网站,相信你会用到的
- 数据库系统工程师考点
- 6.郝斌C语言笔记——流程控制
- event mpm php,CentOS 7 安装 PHP-FPM 及使用 mod_mpm_event
- 2022茶艺师(初级)试题及在线模拟考试
- 腾云忆想技术干货|TSF微服务治理实战系列(一)——治理蓝图
- Java对象逃逸分析
热门文章
- linux进入pe系统,如何进入pe系统【解答办法】
- Neo4j AuraDB免费版——Data Importer
- UEditor编辑器保存数据到数据库
- 五笔字根表识别码图_王码86版五笔字根表口诀助记词(完整大图)
- PAT乙级1072(C++)——龙哥哥的刷题路
- 高等数学复盘 | 第七册上册第一章——第六章思维导图梳理(复习专用)
- c语言系统编程项目实训,《C语言程序设计》项目实训指导书.doc
- UKEY开发,vue+websocket实现用户登录UKEY认证
- ukey网络连接异常_Ukey的各种操作,你知道吗?
- 电气控制及可编程序控制器【1】