
前面篇介绍onvif服务端的发现功能,继续在之前的代码基础上完成一个RTSP流的工作,也就是客户端通过ONVIF协议来预览设备端在这个之前必须确定几个简单的条件1 设备端能被发现2 设备端支持RTSP协议,并且能够通过VLC进行正常的预览通过onvif协议设备需要做的几个基本事情:1 __tds__GetCapabilities获取设备能力2 __trt__GetProfiles获取设备的配置信息3 获取前段设备的视频编码和视频源的一些基本需要的信息4 __trt__GetStreamUri后去设备的URi,通过RTSP获取视频流接口函数有了,实现的时候当然也需要注意匹配,需要把设备的一些主要信息对应匹配到Onvif协议中,下面一个函数一个函数的具体实现如下,在需要注意的地方我都加上了对应的注释,如果还有不清楚的地方可以留言,我会尽量尽我所知道的告诉大家1 __tds__GetCapabilities,此函数是获取设备端的能力的函数,在这里需要预览,所以基本的media和device的一些基本信息是需要填写的[cpp] view plaincopyCapabilities__Device_Choice:tds__GetCapabilitiesResponse->Capabilities->Device=(structtt__DeviceCapabilities*)soap_malloc(soap,sizeof(structtt__DeviceCapabilities));memset(tds__GetCapabilitiesResponse->Capabilities->Device,0,sizeof(structtt__DeviceCapabilities));tds__GetCapabilitiesResponse->Capabilities->Device->XAddr=(char*)soap_malloc(soap,sizeof(char)*MAX_64_LEN);memset(tds__GetCapabilitiesResponse->Capabilities->Device->XAddr,0,sizeof(char)*MAX_64_LEN);//填写设备的ip地址以及需要通过onvif协议通信的端口号sprintf(tds__GetCapabilitiesResponse->Capabilities->Device->XAddr,"%s/onvif/device_service","192.168.12.135:8899");//设备的一些基本能力值,是否支持那些功能,如果在开发的时候,如果前段设备支持这些功能的话,就可以直接填写true,否则填写falsetds__GetCapabilitiesResponse->Capabilities->Device->Network=(structtt__NetworkCapabilities*)soap_malloc(soap,sizeof(structtt__NetworkCapabilities));memset(tds__GetCapabilitiesResponse->Capabilities->Device->Network,0,sizeof(structtt__NetworkCapabilities));tds__GetCapabilitiesResponse->Capabilities->Device->Network->IPFilter=(enumxsd__boolean*)soap_malloc(soap,sizeof(enumxsd__boolean));*(tds__GetCapabilitiesResponse->Capabilities->Device->Network->IPFilter)=xsd__boolean__false_;//xsd__boolean__true_tds__GetCapabilitiesResponse->Capabilities->Device->Network->ZeroConfiguration=(enumxsd__boolean*)soap_malloc(soap,sizeof(enumxsd__boolean));*(tds__GetCapabilitiesResponse->Capabilities->Device->Network->ZeroConfiguration)=xsd__boolean__true_;//xsd__boolean__false_tds__GetCapabilitiesResponse->Capabilities->Device->Network->IPVersion6=(enumxsd__boolean*)soap_malloc(soap,sizeof(enumxsd__boolean));*(tds__GetCapabilitiesResponse->Capabilities->Device->Network->IPVersion6)=xsd__boolean__false_;//xsd__boolean__true_tds__GetCapabilitiesResponse->Capabilities->Device->Network->DynDNS=(enumxsd__boolean*)soap_malloc(soap,sizeof(enumxsd__boolean));*(tds__GetCapabilitiesResponse->Capabilities->Device->Network->DynDNS)=xsd__boolean__true_;//xsd__boolean__false_tds__GetCapabilitiesResponse->Capabilities->Device->System=(structtt__SystemCapabilities*)soap_malloc(soap,sizeof(structtt__SystemCapabilities));memset(tds__GetCapabilitiesResponse->Capabilities->Device->System,0,sizeof(structtt__SystemCapabilities));tds__GetCapabilitiesResponse->Capabilities->Device->System->DiscoveryResolve=xsd__boolean__true_;tds__GetCapabilitiesResponse->Capabilities->Device->System->DiscoveryBye=xsd__boolean__true_;tds__GetCapabilitiesResponse->Capabilities->Device->System->RemoteDiscovery=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->System->SystemBackup=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->System->SystemLogging=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->System->FirmwareUpgrade=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->System->__sizeSupportedVersions=1;tds__GetCapabilitiesResponse->Capabilities->Device->System->SupportedVersions=(structtt__OnvifVersion*)soap_malloc(soap,sizeof(structtt__OnvifVersion));tds__GetCapabilitiesResponse->Capabilities->Device->System->SupportedVersions->Major=2;tds__GetCapabilitiesResponse->Capabilities->Device->System->SupportedVersions->Minor=0;//设备IO的一些支持tds__GetCapabilitiesResponse->Capabilities->Device->IO=(structtt__IOCapabilities*)soap_malloc(soap,sizeof(structtt__IOCapabilities));memset(tds__GetCapabilitiesResponse->Capabilities->Device->IO,0,sizeof(structtt__IOCapabilities));tds__GetCapabilitiesResponse->Capabilities->Device->IO->InputConnectors=(int*)soap_malloc(soap,sizeof(int));*(tds__GetCapabilitiesResponse->Capabilities->Device->IO->InputConnectors)=1;tds__GetCapabilitiesResponse->Capabilities->Device->IO->RelayOutputs=(int*)soap_malloc(soap,sizeof(int));*(tds__GetCapabilitiesResponse->Capabilities->Device->IO->RelayOutputs)=1;tds__GetCapabilitiesResponse->Capabilities->Device->Security=(structtt__SecurityCapabilities*)soap_malloc(soap,sizeof(structtt__SecurityCapabilities));memset(tds__GetCapabilitiesResponse->Capabilities->Device->Security,0,sizeof(structtt__SecurityCapabilities));tds__GetCapabilitiesResponse->Capabilities->Device->Security->TLS1_x002e1=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->Security->TLS1_x002e2=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->Security->OnboardKeyGeneration=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->Security->AccessPolicyConfig=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->Security->X_x002e509Token=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->Security->SAMLToken=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->Security->KerberosToken=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Device->Security->RELToken=xsd__boolean__false_;Capabilities__Imaging_Choice://Imaging的一些基本信息,关于视频颜色,IRCut的一些基本信息tds__GetCapabilitiesResponse->Capabilities->Imaging=(structtt__ImagingCapabilities*)soap_malloc(soap,sizeof(structtt__ImagingCapabilities));memset(tds__GetCapabilitiesResponse->Capabilities->Imaging,0,sizeof(structtt__ImagingCapabilities));tds__GetCapabilitiesResponse->Capabilities->Imaging->XAddr=(char*)soap_malloc(soap,sizeof(char)*MAX_64_LEN);memset(tds__GetCapabilitiesResponse->Capabilities->Imaging->XAddr,'\0',sizeof(char)*MAX_64_LEN);sprintf(tds__GetCapabilitiesResponse->Capabilities->Imaging->XAddr,"%s/onvif/imaging_service","192.168.12.135:8899");Capabilities__Media__Choice:tds__GetCapabilitiesResponse->Capabilities->Media=(structtt__MediaCapabilities*)soap_malloc(soap,sizeof(structtt__MediaCapabilities));memset(tds__GetCapabilitiesResponse->Capabilities->Media,0,sizeof(structtt__MediaCapabilities));tds__GetCapabilitiesResponse->Capabilities->Media->XAddr=(char*)soap_malloc(soap,sizeof(char)*MAX_64_LEN);memset(tds__GetCapabilitiesResponse->Capabilities->Media->XAddr,0,sizeof(char)*MAX_64_LEN);sprintf(tds__GetCapabilitiesResponse->Capabilities->Media->XAddr,"%s/onvif/media_service","192.168.12.135:8899");tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities=(structtt__RealTimeStreamingCapabilities*)soap_malloc(soap,sizeof(structtt__RealTimeStreamingCapabilities));memset(tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities,0,sizeof(structtt__RealTimeStreamingCapabilities));tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTPMulticast=(enumxsd__boolean*)soap_malloc(soap,sizeof(int));*tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTPMulticast=xsd__boolean__false_;tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTP_USCORETCP=(enumxsd__boolean*)soap_malloc(soap,sizeof(int));*tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTP_USCORETCP=xsd__boolean__true_;tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTP_USCORERTSP_USCORETCP=(enumxsd__boolean*)soap_malloc(soap,sizeof(int));*tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTP_USCORERTSP_USCORETCP=xsd__boolean__true_;2 __tds__GetServices函数的一些基本信息的填写[cpp] view plaincopytds__GetServicesResponse->__sizeService=1;tds__GetServicesResponse->Service=(structtds__Service*)soap_malloc(soap,sizeof(structtds__Service));tds__GetServicesResponse->Service[0].Namespace=(char*)soap_malloc(soap,sizeof(char)*INFO_LENGTH);strcpy(tds__GetServicesResponse->Service[0].Namespace,"http://.onvif.org/ver10/events/wsdl");tds__GetServicesResponse->Service[0].XAddr=(char*)soap_malloc(soap,sizeof(char)*INFO_LENGTH);strcpy(tds__GetServicesResponse->Service[0].XAddr,"http://192.168.12.135/onvif/services");tds__GetServicesResponse->Service[0].Capabilities=NULL;tds__GetServicesResponse->Service[0].Version=(structtt__OnvifVersion*)soap_malloc(soap,sizeof(structtt__OnvifVersion));tds__GetServicesResponse->Service[0].Version->Major=0;tds__GetServicesResponse->Service[0].Version->Minor=3;tds__GetServicesResponse->Service[0].__size=0;tds__GetServicesResponse->Service[0].__any=NULL;tds__GetServicesResponse->Service[0].__anyAttribute=NULL;3 __trt__GetProfiles获取设备的配置信息[cpp] view plaincopy//VideoSourceConfigurationtrt__GetProfilesResponse->Profiles[i].Name=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetProfilesResponse->Profiles[i].Name,'\0',sizeof(char)*MAX_PROF_TOKEN);//profiles的名字,和token不同,实际请求的时候都是需要对应的token值来获取的strcpy(trt__GetProfilesResponse->Profiles[i].Name,"test_profile");trt__GetProfilesResponse->Profiles[i].token=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetProfilesResponse->Profiles[i].token,'\0',sizeof(char)*MAX_PROF_TOKEN);//此token也就是每次需要获取对应profiles的一些信息的时候,就需要在请求的时候填写此对应的token来,来进行验证判断strcpy(trt__GetProfilesResponse->Profiles[i].token,"test_token");trt__GetProfilesResponse->Profiles[i].fixed=(enumxsd__boolean*)soap_malloc(soap,sizeof(int));memset(trt__GetProfilesResponse->Profiles[i].fixed,0,sizeof(int));*(trt__GetProfilesResponse->Profiles[i].fixed)=(enumxsd__boolean)0;trt__GetProfilesResponse->Profiles[i].__anyAttribute=NULL;trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration=(structtt__VideoSourceConfiguration*)soap_malloc(soap,sizeof(structtt__VideoSourceConfiguration));memset(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration,0,sizeof(structtt__VideoSourceConfiguration));trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Name=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Name,'\0',sizeof(char)*MAX_PROF_TOKEN);//类似与上面,VideoSourceName,strcpy(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Name,"test_vsname");trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->token=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->token,'\0',sizeof(char)*MAX_PROF_TOKEN);//求不同码流的视频源信息需要此token值匹配strcpy(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->token,"test_vsoken");trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->SourceToken=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->SourceToken,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->SourceToken,"test_vstoken");trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->UseCount=1;trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds=(structtt__IntRectangle*)soap_malloc(soap,sizeof(structtt__IntRectangle));memset(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds,0,sizeof(structtt__IntRectangle));trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds->x=0;trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds->y=0;trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds->width=1280;trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds->height=720;//VideoEncoderConfigurationtrt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration=(structtt__VideoEncoderConfiguration*)soap_malloc(soap,sizeof(structtt__VideoEncoderConfiguration));memset(trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration,'\0',sizeof(structtt__VideoEncoderConfiguration));trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->Name=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->Name,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->Name,"test_vename");trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->token=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->token,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->token,"test_vstoken");trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->UseCount=1;//当然在实际开发的过程中最好把单个也实现了,也就是__trt__GetProfile函数接口,此接口是根据对应的请求的token来获取对应的信息的!4 视频源已经视频编码必须填充的一些基本需要填写的一些关键信息(1)__trt__GetVideoEncoderConfiguration函数接口一些主要信息[cpp] view plaincopy//请求的时候需要匹配的一些基本信息trt__GetVideoEncoderConfigurationResponse->Configuration->Name=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetVideoEncoderConfigurationResponse->Configuration->Name,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetVideoEncoderConfigurationResponse->Configuration->Name,"test_vsname");trt__GetVideoEncoderConfigurationResponse->Configuration->token=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetVideoEncoderConfigurationResponse->Configuration->token,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetVideoEncoderConfigurationResponse->Configuration->token,"test_vstoken");trt__GetVideoEncoderConfigurationResponse->Configuration->UseCount=1;trt__GetVideoEncoderConfigurationResponse->Configuration->Quality=100;//根据前端设备时间支持的编码格式选择对应的值,因为我测试的是设备只支持H264,所以选了2trt__GetVideoEncoderConfigurationResponse->Configuration->Encoding=(enumtt__VideoEncoding)2;//JPEG=0,MPEG=1,H264=2;trt__GetVideoEncoderConfigurationResponse->Configuration->Resolution=(structtt__VideoResolution*)soap_malloc(soap,sizeof(structtt__VideoResolution));memset(trt__GetVideoEncoderConfigurationResponse->Configuration->Resolution,0,sizeof(structtt__VideoResolution));//请求的视频的分辨率,对应前端设备填写对应的值,我这是1280*720trt__GetVideoEncoderConfigurationResponse->Configuration->Resolution->Width=1280;trt__GetVideoEncoderConfigurationResponse->Configuration->Resolution->Height=720;trt__GetVideoEncoderConfigurationResponse->Configuration->RateControl=(structtt__VideoRateControl*)soap_malloc(soap,sizeof(structtt__VideoRateControl));memset(trt__GetVideoEncoderConfigurationResponse->Configuration->RateControl,0,sizeof(structtt__VideoRateControl));//请求的对应的编码信息.各个意思参考上面说明trt__GetVideoEncoderConfigurationResponse->Configuration->RateControl->FrameRateLimit=30;trt__GetVideoEncoderConfigurationResponse->Configuration->RateControl->EncodingInterval=1;trt__GetVideoEncoderConfigurationResponse->Configuration->RateControl->BitrateLimit=2048;trt__GetVideoEncoderConfigurationResponse->Configuration->H264=(structtt__H264Configuration*)soap_malloc(soap,sizeof(structtt__H264Configuration));memset(trt__GetVideoEncoderConfigurationResponse->Configuration->H264,0,sizeof(structtt__H264Configuration));trt__GetVideoEncoderConfigurationResponse->Configuration->H264->GovLength=30;trt__GetVideoEncoderConfigurationResponse->Configuration->H264->H264Profile=(enumtt__H264Profile)3;(2)__trt__GetVideoEncoderConfigurations函数接口一些主要信息 [cpp] view plaincopytrt__GetVideoEncoderConfigurationsResponse->Configurations[0].Name=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Name,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Name,"test_vsname");trt__GetVideoEncoderConfigurationsResponse->Configurations[0].token=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].token,'\0',sizeof(char)*MAX_PROF_TOKEN);//请求的token值strcpy(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].token,"test_vstoken");trt__GetVideoEncoderConfigurationsResponse->Configurations[0].UseCount=1;trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Quality=100;trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Encoding=(enumtt__VideoEncoding)2;//JPEG=0,MPEG=1,H264=2;trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Resolution=(structtt__VideoResolution*)soap_malloc(soap,sizeof(structtt__VideoResolution));memset(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Resolution,0,sizeof(structtt__VideoResolution));//请求的视频的分辨率,对应前端设备填写对应的值,我这是1280*720trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Resolution->Width=1280;trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Resolution->Height=720;trt__GetVideoEncoderConfigurationsResponse->Configurations[0].RateControl=(structtt__VideoRateControl*)soap_malloc(soap,sizeof(structtt__VideoRateControl));memset(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].RateControl,0,sizeof(structtt__VideoRateControl));//请求的视频数据的一些编码信息trt__GetVideoEncoderConfigurationsResponse->Configurations[0].RateControl->FrameRateLimit=30;trt__GetVideoEncoderConfigurationsResponse->Configurations[0].RateControl->EncodingInterval=1;trt__GetVideoEncoderConfigurationsResponse->Configurations[0].RateControl->BitrateLimit=2048;trt__GetVideoEncoderConfigurationsResponse->Configurations[0].H264=(structtt__H264Configuration*)soap_malloc(soap,sizeof(structtt__H264Configuration));memset(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].H264,0,sizeof(structtt__H264Configuration));trt__GetVideoEncoderConfigurationsResponse->Configurations[0].H264->GovLength=30;trt__GetVideoEncoderConfigurationsResponse->Configurations[0].H264->H264Profile=(enumtt__H264Profile)3;(3)__trt__GetVideoSourceConfiguration需要填写的一些基本信息[cpp] view plaincopytrt__GetVideoSourceConfigurationResponse->Configuration->UseCount=1;trt__GetVideoSourceConfigurationResponse->Configuration->Name=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetVideoSourceConfigurationResponse->Configuration->Name,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetVideoSourceConfigurationResponse->Configuration->Name,"test_vsname");trt__GetVideoSourceConfigurationResponse->Configuration->token=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetVideoSourceConfigurationResponse->Configuration->token,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetVideoSourceConfigurationResponse->Configuration->token,"test_vstoken");trt__GetVideoSourceConfigurationResponse->Configuration->SourceToken=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetVideoSourceConfigurationResponse->Configuration->SourceToken,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetVideoSourceConfigurationResponse->Configuration->SourceToken,"test_vstoken");trt__GetVideoSourceConfigurationResponse->Configuration->Bounds=(structtt__IntRectangle*)soap_malloc(soap,sizeof(structtt__IntRectangle));memset(trt__GetVideoSourceConfigurationResponse->Configuration->Bounds,0,sizeof(structtt__IntRectangle));trt__GetVideoSourceConfigurationResponse->Configuration->Bounds->x=0;trt__GetVideoSourceConfigurationResponse->Configuration->Bounds->y=0;trt__GetVideoSourceConfigurationResponse->Configuration->Bounds->width=1280;trt__GetVideoSourceConfigurationResponse->Configuration->Bounds->height=720;(4)__trt__GetVideoSourceConfigurations需要填写的一些基本信息[cpp] view plaincopytrt__GetVideoSourceConfigurationsResponse->Configurations[0].UseCount=1;trt__GetVideoSourceConfigurationsResponse->Configurations[0].Name=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetVideoSourceConfigurationsResponse->Configurations[0].Name,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetVideoSourceConfigurationsResponse->Configurations[0].Name,"test_vsname");trt__GetVideoSourceConfigurationsResponse->Configurations[0].token=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetVideoSourceConfigurationsResponse->Configurations[0].token,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetVideoSourceConfigurationsResponse->Configurations[0].token,"test_vstoken");trt__GetVideoSourceConfigurationsResponse->Configurations[0].SourceToken=(char*)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);memset(trt__GetVideoSourceConfigurationsResponse->Configurations[0].SourceToken,'\0',sizeof(char)*MAX_PROF_TOKEN);strcpy(trt__GetVideoSourceConfigurationsResponse->Configurations[0].SourceToken,"test_vstoken");trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds=(structtt__IntRectangle*)soap_malloc(soap,sizeof(structtt__IntRectangle));memset(trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds,0,sizeof(structtt__IntRectangle));trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds->x=0;trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds->y=0;trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds->width=1280;trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds->height=720;这里里面本来都是一些个不相同的,通过对应不同的Token值来获取不同的视频源以及视频编码的一些信息的,因为这里我只是一个简单的测试,所以都是对单一的视频码流填写的相关信息,可能大家看到很多地方类似的,但是当不同的token值过来的时候,需要对应填写不同的相关信息的, 每次获取的时候都需要对应的判断token值是否正确,我这里都作了一些简化,在实际开发的时候都需要填充进去5 __trt__GetStreamUri后去设备的URi,通过RTSP获取视频流[cpp] view plaincopytrt__GetStreamUriResponse->MediaUri=(structtt__MediaUri*)soap_malloc(soap,sizeof(structtt__MediaUri));memset(trt__GetStreamUriResponse->MediaUri,0,sizeof(structtt__MediaUri));trt__GetStreamUriResponse->MediaUri->Uri=(char*)soap_malloc(soap,sizeof(char)*MAX_64_LEN);memset(trt__GetStreamUriResponse->MediaUri->Uri,'\0',sizeof(char)*MAX_64_LEN);//根据各个设备的rtsp协议的uri不同填写对应的值strncpy(trt__GetStreamUriResponse->MediaUri->Uri,"rtsp://192.168.12.135:554/livestream",MAX_64_LEN);trt__GetStreamUriResponse->MediaUri->InvalidAfterConnect=(enumxsd__boolean)0;trt__GetStreamUriResponse->MediaUri->InvalidAfterReboot=(enumxsd__boolean)0;//超时时间trt__GetStreamUriResponse->MediaUri->Timeout=200;设备端通过Onvif协议来实现RTSP预览的代码已经基本写完,现在可以看看效果,首先确定设备端能够通过vlc正确预览图像, 也就是说设备端需要支持RTSP协议,可能通过Live555来实现。rtsp和onvif协议哪个好

然后就可以通过onvif的工具 Onvif Deviece Manager 来查看效果了!先看看Live Video的效果z再看看Video Stream的效果图最后看看token的一些显示的基本信息里面因为是自己的一些token和name信息,所以我就打了码,这是都是可以根据自己的设备自己来定的,所以对对接视频没有响,只要在请求的时候对应自己的设备的能力值获取的时候对应起来就可以的!onvif设备端对接视频流也就完成!这个过程中还是有很多不不懂的地方,可能上面的开发过程很多不够完善的地方,如果有懂的更多这方面知识的开发者,希望能指出我的不足或者提出自己的观点,大家相互促进学习。rtsp和onvif协议哪个好
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-47682-1.html
六十多年前我们那么穷