我正在使用gSOAP配置兼容ONVIF的相机。 目前,我通过这样做手动设置请求中的所有参数。这适用于 SetVideEncoderConfiguration
MediaBindingProxy mediaDevice (uri);
AUTHENTICATE (mediaDevice);
_trt__SetVideoEncoderConfiguration req;
_trt__SetVideoEncoderConfigurationResponse resp;
struct tt__VideoEncoderConfiguration encoderConfig;
struct tt__VideoResolution resolutionConfig;
encoderConfig.Name = strdup (name);
encoderConfig.UseCount = 1;
encoderConfig.Quality = 50;
if (strcmp (encoding, "H264") == 0)
encoderConfig.Encoding = tt__VideoEncoding__H264;
else if (strcmp (encoding, "JPEG") == 0)
encoderConfig.Encoding = tt__VideoEncoding__JPEG;
encoderConfig.token = strdup (profileToken);
encoderConfig.SessionTimeout = (LONG64)"PT0S";
resolutionConfig.Width=1280;
resolutionConfig.Height=720;
encoderConfig.Resolution = &resolutionConfig;
tt__VideoRateControl rateControl;
rateControl.FrameRateLimit = 15;
rateControl.EncodingInterval = 1;
rateControl.BitrateLimit = 4500;
encoderConfig.RateControl = &rateControl;
struct tt__H264Configuration h264;
h264.GovLength = 30;
h264.H264Profile = tt__H264Profile__Baseline;
encoderConfig.H264 = &h264;
struct tt__MulticastConfiguration multicast;
struct tt__IPAddress address;
address.IPv4Address = strdup ("0.0.0.0");
multicast.Address = &address;
encoderConfig.Multicast = &multicast;
req.Configuration = &encoderConfig;
req.ForcePersistence = true;
int ret = mediaDevice.SetVideoEncoderConfiguration (&req, resp);
qDebug () << "Set Encoder: " << ret;
有更简单的方法吗?可能是一些设置请求参数的函数调用?我用 GetMediaUri 找到的另一种方法是使用像
这样的东西soap_new_req__trt__GetStreamUri (mediaDevice.soap,soap_new_req_tt__StreamSetup (mediaDevice.soap, (enum tt__StreamType)0, soap_new_tt__Transport(mediaDevice.soap), 1, NULL), "profile1");
这是使用gSOAP的客户端代码的唯一两种方式吗?
-Mandar Joshi
答案 0 :(得分:3)
使用gSOAP在C ++中分配类型soap_new_T()
的数据有T
的四种变体:
T * soap_new_T(struct soap*)
返回默认的T
新实例
在由soap
上下文管理的堆上初始化和分配。T * soap_new_T(struct soap*, int n)
返回n
个新实例的数组
托管堆上的T
。数组中的实例默认初始化如上所述。T * soap_new_req_T(struct soap*, ...)
(仅限结构和类)返回a
在托管堆上分配的T
的新实例,并将所需的数据成员设置为其他参数...
中指定的值。T * soap_new_set_T(struct soap*, ...)
(仅限结构和类)返回a
托管堆上的T
的新实例,并将公共/可序列化数据成员设置为其他参数...
中指定的值。使用soap_strdup(struct soap*, const char*)
代替strdup
将字符串复制到托管堆上。
托管堆上的所有数据都使用soap_destroy(soap)
进行批量删除
soap_end(soap)
(按此顺序调用这些内容)必须在soap_done(soap)
或soap_free(soap)
之前调用。
要分配指向数据的指针,请使用模板:
template<class T>
T * soap_make(struct soap *soap, T val)
{
T *p = (T*)soap_malloc(soap, sizeof(T));
if (p)
*p = val;
return p;
}
template<class T>
T **soap_make_array(struct soap *soap, T* array, int n)
{
T **p = (T**)soap_malloc(soap, n * sizeof(T*));
for (int i = 0; i < n; ++i)
p[i] = &array[i];
return p;
}
然后使用soap_make<int>(soap, 123)
创建指向托管堆上的值123
的指针,并soap_make_array(soap, soap_new_CLASSNAME(soap, 100), 100)
创建指向100个CLASSNAME
实例的指针。
gSOAP工具还为您生成深层复制操作:CLASSNAME::soap_dup(struct soap*)
创建对象的深层副本,并将其分配给您作为参数提供的另一个soap
上下文。使用NULL
作为此参数来分配非托管深层副本(但这些副本不能有指针循环!)。然后删除包含CLASSNAME::soap_del()
的非托管副本,以便彻底删除所有成员,然后delete
对象本身。
有关详细信息,请参阅Memory management in C++。使用gSOAP 2.8.39及更高版本。