ONVIF 设备debug: 设置onvif视频流配置的办法
1. 最简单的配置 onvif 设备 子配置 分辨率:
参考链接1: linux设备上的Onvif 实现14: 修改子通道的配置数据
这个博客链接的示例代码基本正确.
主要使用到函数如下:
// 输入用户名和用户名密码,获取权限
soap_wsse_add_UsernameTokenDigest //两种服务media 和 media2 分别对应结构体 trt 和 tr2//media:http://www.onvif.org/ver10/media/wsdl
//所使用结构体:struct _trt__SetVideoEncoderConfiguration ;struct _trt__SetVideoEncoderConfigurationResponse ;struct _trt__GetVideoEncoderConfiguration ;struct _trt__GetVideoEncoderConfigurationResponse ;
//修改当前onvif设备使用的视频配置
soap_call___trt__SetVideoEncoderConfiguration//获取当前onvif设备使用的视频配置
soap_call___trt__SetVideoEncoderConfiguration//media2:http://www.onvif.org/ver20/media/wsdl
//所使用结构体:struct _tr2__SetVideoEncoderConfiguration ;struct tr2__SetConfigurationResponse ;struct tr2__GetConfiguration ;struct _tr2__GetVideoEncoderConfigurationsResponse ;//获取当前onvif设备使用的视频配置
soap_call___tr2__GetVideoEncoderConfigurations //获取当前onvif设备使用的视频配置
soap_call___tr2__SetVideoEncoderConfiguration
2. 修改更多 onvif设备 配置:
参考链接2: onvif 函数索引
参考链接3: mdiea媒体服务函数索引
P.S:建议索引方法:在参考连接2获取到 所要的函数名, 在链接3 网页内按 ctrl+f 直接搜索该函数并跳转. onvif设备的函数命名都比较朴实, 获取参数的函数都是 "Get" + "所要获取参数信息英文简写" , 设置参数则是 "Set" + "所要设置参数 信息引文简写".
3.容易碰到的报错及其解决办法:
主要会碰到报错error: 12, SOAP-ENV:Sender, the parameter value is illegal ,解决的最快方法是使用soap_print_fault函数打印出更多 错误原因. 其他错误也可以使用这个函数进行追踪.
重点在于要分辨清楚, 设备支持 配置的媒体服务是哪种,media还是media2, 如果两种都支持,那么 要确定onvif摄像头具体通过哪个 media服务可以修改配置.海康的摄像头一般同时支持media和media2,但是事实上配置视频输出参数的时候只支持通过media2进行配置.
http://www.onvif.org/ver10/media/wsdl
http://www.onvif.org/ver20/media/wsdl
//1.第一种报错:非法参数,报错如下:
error: 12, SOAP-ENV:Sender, the parameter value is illegal//解决办法:添加如下错误打印函数,在终端将会具体打印出更多的错误原因.
soap_print_fault(soap, stderr);//例如:使用soap_print_fault后的报错格式如下:
SOAP 1.2 fault SOAP-ENV:Sender ["http://www.onvif.org/ver10/error":InvalidArgVal]
"the parameter value is illegal"
Detail: <env:Text>Quality is error!</env:Text>//发现是因为图像质量参数非法,那么直接设置为0.0f即可.
Configuration->Quality = 0.0f;//2. 第二种报错:仍然是非法参数,报错如下:
SOAP 1.2 fault SOAP-ENV:Sender ["http://www.onvif.org/ver10/error":InvalidArgVal]
"the parameter value is illegal"
Detail: <env:Text>no ipaddr type</env:Text>//解决办法分析:这种报错有两种可能原因,一种是因为struct tt__MulticastConfiguration *Multicast的ip地址非法, 第二种是 所使用的设备支持的媒体配置要使用media2而不是media//第一种解决办法:将多播地址设置为NULL,或者添加一个ip地址(这个方法大概了无效)
Configuration->Multicast = NULL;//第二种解决办法:使用media2的函数,使用media2Xaddr
result = soap_call___tr2__GetVideoEncoderConfigurations(soap, media2XAddr, NULL,&getReq, &getRep);
result = soap_call___tr2__SetVideoEncoderConfiguration(soap, media2XAddr, NULL, &setReq, &setRep);//第三种报错:服务使用错误
SOAP 1.2 fault SOAP-ENV:Receiver ["http://www.onvif.org/ver10/error":ActionNotSupported]
"Optional Action Not Implemented"
Detail: [no detail]//解决办法: 对于media使用了 media2XAddr 地址,改正即可
result = soap_call___trt__GetVideoEncoderConfiguration(soap,mediaXAddr, NULL,&getReq, &getRep);