源码详情:
ONVIF介绍:
ONVIF致力于通过全球性的开放接口标准来推进网络视频在安防市场的应用,这一接口标准将确保不同
厂商生产的网络视频产品具有互通性。2008年11月,论坛正式发布了ONVIF第一版规范——ONVIF核心规
范1.0。随着视频监控的网络化应用,产业链的分工将越来越细。有些厂商专门做摄像头,有些厂商专
门做DVS,有些厂商则可能专门做平台等,然后通过集成商进行集成,提供给最终客户。这种产业合作
模式,已经迫切的需要行业提供越来越标准化的接口平台。
ONVIF规范描述了网络视频的模型、接口、数据类型以及数据交互的模式。并复用了一些现有的标准,如WS系列标准等。
ONVIF规范的目标是实现一个网络视频框架协议,使不同厂商所生产的网络视频产品(包括摄录前端、录像设备等)完全互通。
ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。ONVIF规范涵盖了完全的XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。
ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行 。
获取摄像头的流媒体地址完整流程:
1、Probe: 发现网络摄像头,获取webserver地址(单播或组播均可以)
2、GetCapabilities:获取设备能力文件,从中识别出媒体信息地址URI
3、GetProfiles: 获取媒体信息文件,识别主通道、子通道的视频编码分辨率
4、GetStreamUri:获取指定通道的流媒体地址
主要编译脚本(带openssl):
CFLAGS += -Wall -g -O0 -DWITH_OPENSSL -I. -I./thirdparty/output/include -fdata-sections -ffunction-sections LDFLAGS = -L. -L./thirdparty/output/lib -lonvif -lgsoap -lssl -lcrypto -lm clean: rm -rf *.o rm -rf wsdiscovery all: $(CC) $(CFLAGS) -c soapC.c -o soapC.o $(CC) $(CFLAGS) -c soapClient.c -o soapClient.o $(CC) $(CFLAGS) -c duration.c -o duration.o $(CC) $(CFLAGS) -c wsseapi.c -o wsseapi.o $(CC) $(CFLAGS) -c wsaapi.c -o wsaapi.o $(CC) $(CFLAGS) -c smdevp.c -o smdevp.o $(CC) $(CFLAGS) -c mecevp.c -o mecevp.o $(AR) ruv libonvif.a soapC.o soapClient.o duration.o wsseapi.o smdevp.o mecevp.o wsaapi.o $(RANLIB) libonvif.a $(CC) $(CFLAGS) onvif_client.c $(LDFLAGS) -o wsdiscovery
使用及相关注意事项:
1、本程序在ubuntu下使用gcc编译(嵌入式中也可,直接修改相关的编译脚本或make中的编译链)
2、编译之前,先cd到thirdparty中执行build脚本
3、第三方依赖库编译好后,在程序根目录下执行make all即可
4、程序中onvif_client.c中的相关宏定义需要修改成自己的设备用户名和密码
#define ONVIF_USER "admin" #define ONVIF_PASSWORD "passwd" #define DEVICE_IP "xx.xx.xx.xx"
5、代码中probe方法指定向某一个特定地址访问(DEVICE_IP指定),只需将
if ((soap_send___wsdd__Probe(soap, addr, NULL, &getProbeRequest)) != SOAP_OK) 替换为: if ((soap_send___wsdd__Probe(soap, "soap.udp://239.255.255.250:3702", NULL, &getProbeRequest)) != SOAP_OK)即可发送组播报进行探测