ONVIF简介
- 0.为什么要搞ONVIF
- 1.什么是ONVIF
- 2. ONVIF的功能
- 3.ONVIF靠什么通信
- 3.1 WSDL
- 3.2 SOAP
- 3.4. 名词解释
- 3.5 SOAP协议位置
0.为什么要搞ONVIF
最近在做一个视频推流的项目,其中去要获取摄像头的视频流,开始什么也不懂,在网上查资料,原来是使用ffmpeg通过一个叫url的东东来拉去视频流,当时一脸懵逼,开始看ffmpeg教程,完全是靠雷神的博客入门,向雷神致敬。但是之后,项目为了做到通用,兼容不同厂家的摄像头,查了一下,各家的rtsp的url都不一样,这怎么搞,又一脸懵逼。查资料吧,找到原来摄像头界有个标准协议,叫ONVIF,刚搞明白ffmpeg,ONVIF又是什么鬼。头疼。继续学啊,都是被逼的。不扯废话了,开始正题
1.什么是ONVIF
2008年5月,由安讯士(AXIS)联合博世(BOSCH)及索尼(SONY)公司三方宣布携手共同成立一个国际开放型网络视频产品标准网络接口开发论坛,取名为ONVIF(Open Network Video Interface Forum)翻译过来就是:开放型网络视频接口论坛。ONVIF标准将为网络视频设备之间的信息交换定义通用协议,包括搜索设备,实时视频,等等等等,不多说了,说多了也是网上摘抄的
那么问题来了,ONVIF到底是什么,怎么工作的,原来ONVIF协议将终端设备(摄像头)提供Web Service服务,将每一个功能看做一个Web Service,比如,我要探测局域网中的网络摄像头,那么向摄像头提供相应的Web Service 的接口发送请求,我不是做网页的,刚开始这个概念没理解清楚,其实就是每个摄像头提供一个网址,比如淘宝网页,我们都知道,要想访问淘宝,就得在浏览器的地址栏输入淘宝的网址,https://www.taobao.com/
,获取到主页后,就可以为所欲为了(只要你有钱)。ONVIF也一样,首先获取摄像头的主地址比如(http://10.0.0.47/onvif/device_service),我的摄像头的IP为10.0.0.47,获得这个地址后,我们就可以向这个地址提供的接口来获取相应的功能,每个接口可以认为一个功能,也就是一个Web Service,
工作是这样子的
客户端(推流盒子)要知道终端设备(摄像头)的拉流地址,那么客户端就向终端设备提供的Web Service地址发送请求,然后终端设备给与回应,一问一答,就把事情做了,
一个流程如下图
好了,工作流程说过了,我看了好久才整明白,我就一个笨鸟。
2. ONVIF的功能
ONVIF是什么整明了,那就得知道他到底能干啥。按项目需求来说,推流盒子要支持不同厂家的摄像头,但是不同厂家的摄像头的拉流地址又不同,怎么办,我总不能在盒子的Web页面告诉盒子这个摄像头的厂家是哪个,然后程序了写死地址,这样太笨了,如果厂家的推流地址变了,那就羊驼了。所以ONVIF提供了一个标准的接口,来获取摄像头的推流地址,我不需要关心摄像头厂家和型号,这就很方便。这仅仅是我们项目上的一个小小需求。下图罗列了部分ONVIF提供的接口
接下来说说流程,我说说,你听听,后面的帖子会说到这是怎么回事
- 发现设备
- 获取能力
- 获取媒体信息
- 获取视频编码配置
- 设置视频编码配置(修改视频流设置信息,码流,分辨率,编码格式)
- 获取URI
- ONVIF完成
- 使用ffmpeg推拉流
- over
3.ONVIF靠什么通信
我们知道ONVIF只是个协议,那么他靠什么通信,Web service(也就是网页和服务器)是靠XML和HTTPS通信的,他们是基于SOAP和WSDL,如上图哪个流程图,客户(推流盒子)端根据WSDL描述文档,会生成一个SOAP请求消息,该消息被嵌入在要给HTTP POST请求中,发送到Web Service所在的Web服务器中(摄像头)。Web Services请求处理器解析收到的SOAP请求,调用相应的Web Service(获取URI功能),然后生成相应的SOAP应答。Web 服务器收到SOAP应答后,会通过HTTP应答的方式把信息送回到客户端(推流盒子)
乱起八糟的说了以通,倒是什么是WSDL,什么是SOAP,我也不知道,下面是网上说的
3.1 WSDL
WSDL是Web Service的描述语言(Web Service Description Language)的缩写,是一个来描述Web服务器和说明如何与Web 服务器通信的XML语言。为用户提供详细的接口说明书。
3.2 SOAP
SOAP是简单对象访问协议(Simple Object Access Protocol)的缩写。他是基于XML的一种协议。一条SOAP消息就是一个普通的XML文档,包含如下元素
- Envelope – 必须元素:可以把XML文档表示为一条SOAP消息
- Header – 可选元素:包含头部信息
- Body – 必须元素:包含所有的调用和响应信息
- Fault – 可选元素,提供有关在处理此消息时候所发生的错误消息
下面我们看一个SOAP消息
<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope" xmlns:tds="http://www.onvif.org/ver10/device/wsdl">
<Header>
<wsa:MessageID xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">uuid:8db8f280-2d52-4955-8c76-fd4a0f1d30ef</wsa:MessageID>
<wsa:To xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>
<wsa:Action xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action>
</Header>
<Body>
<Probe xmlns="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Types>tds:Device</Types>
<Scopes/>
</Probe>
</Body>
</Envelope>
现在估计看不懂,我也看不懂,慢慢就懂了,这是发现设备的时候,客户端发送的消息。
3.4. 名词解释
CMU(Center Manager Unit),即中心管理单位。
PU(Prefocus Unit),即监控前端单元,负责在CMU的控制下使用摄像机采集视频流、使用麦克风采集音频流、使用控制口采集报警信息、对摄像机云台镜头进行控制。
CMU+PU ——服务器(如:安防相机)
CU(Client Unit),监控系统的监控客户端单元,负责将PU采集到的视频流、
3.5 SOAP协议位置
如下图,我们看到起始SOAP就是基于TCP/UDP的