最近公司需要集成摄像头,采用Onvif协议,网上没找到可以直接运行的代码或者可运行的都需要大量积分,所以自己找资料参考实现,现将代码和集成方式分享出来。
若您非iOS平台,参考Onvif协议的C语言实现即可;iOS平台建议使用Onvif协议收发XML实现。
本文不会详细讲解Onvif协议,简单介绍代码的使用。如果工程对您有用,希望能点一个⭐,谢谢。
将以下文件拖入工程 (非iOS工程需要自己集成openssl)
(以下OC方法都是通过C语言实现,非iOS平台修改方法名,自己设置回调即可。)
+ (int)detectDeviceResult:(BYOnvifResultItem *)resultItem;
注意:以下操作都需要鉴权,而且每次调用onvif库函数,都需要鉴权一次。
传入上一步获取的设备地址 (海康的设备地址需要做分割) 通用设备可以获得:
- media地址
- ptz控制地址
+ (int)getCapabilityWithDeviceAddr:(NSString *)deviceXAddrStr
userName:(NSString *)userName
password:(NSString *)password
result:(BYOnvifResultItem *)resultItem;
传入上一步获取的media地址获取token
+ (NSString *)getProfilesWithAddr:(NSString *)capabilityXAddr
userName:(NSString *)userName
password:(NSString *)password
result:(BYOnvifResultItem *)resultItem;
传入media地址和上一步获取的token获得streamUrl,播放地址需要做用户名密码拼接,例如:
rtsp://192.168.0.100/onvif/stream_service
拼接成
rtsp://username:[email protected]/onvif/stream_service
(IJKPlayer默认不支持rtsp协议),需要修改编译选项
+ (int)getStreamUriWithAddr:(NSString *)mediaXAddrStr
profileToken:(NSString *)profileTokenStr
userName:(NSString *)userName
password:(NSString *)password
result:(BYOnvifResultItem *)resultItem;
传入获取设备能力获取到的ptz地址和获取token获得的token,下面ptz方法传入都需要传入这两个参数,停止ptz移动
+ (int)ptzStopMoveWithAddr:(NSString *)ptzAddrStr
profileToken:(NSString *)tokenStr
userName:(NSString *)userName
password:(NSString *)password;
控制ptz持续移动,speed,移动速度[0, 1)的一个区间,stopSecond,持续移动多久停止,单位秒。
+ (int)ptzContinuousMoveWithAddr:(NSString *)ptzAddrStr
profileToken:(NSString *)tokenStr
commond:(BYPTZCmdType)cmd
speed:(float)speed
userName:(NSString *)userName
password:(NSString *)password
stopSecond:(int)second;
ptz相对上一个位置移动一个步长,步长[0, 1)的一个区间
+ (int)ptzRelativeMoveWithAddr:(NSString *)ptzAddrStr
profileToken:(NSString *)tokenStr
commond:(BYPTZCmdType)commond
moveStep:(float)moveStep
userName:(NSString *)userName
password:(NSString *)password;
获取当前ptz的状态(设备当前所处的坐标)
+ (int)getPTZStatusWithAddr:(NSString *)ptzXAddrStr
profileToken:(NSString *)tokenStr
userName:(NSString *)userName
password:(NSString *)password;
探寻设备使用UDPSocket,往239.255.255.250:3702发送探寻信息,等待组播返回信息
NSData *data = [BYOnvifXMLTool dataFromXmlFile:@"probe"];
[self.scannerTools startWithSendUdpData:data];
将上一步探寻的设备地址和用户名密码传入
+ (BYOnvifXMLTool *)createToolsWithDeviceUrlStr:(NSString *)deviceUrlStr
userName:(NSString *)userName
password:(NSString *)password;
获取media地址,ptz地址,token信息,stream url
- (void)getOnvifInfoComplete:(BYOnvifResultBlock)complete;
所有信息保存在resultItem里。
@property (nonatomic, strong, readonly) BYOnvifResultItem *resultItem;
- (void)ptzControlWithType:(BYPTZCmdType)type
complete:(BYOnvifPTZResultBlock)complete;
-
iOS 14以上,获取局域网内设备信息需要申请权限,操作步骤参考iOS 14 UDP收不到广播处理;
-
IJKMediaFramework.framework因文件大小没有上传至git,可根据自己需要编译或网上寻找资源,编译时注意添加rtsp支持,找不到也可留言或者邮箱联系。
邮箱: [email protected]
相关账号: