面篇介绍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的一些基本信息是需要填写的

  1. Capabilities__Device_Choice:
  2. tds__GetCapabilitiesResponse->Capabilities->Device = (struct tt__DeviceCapabilities *)soap_malloc(soap,sizeof(struct tt__DeviceCapabilities));
  3. memset(tds__GetCapabilitiesResponse->Capabilities->Device, 0, sizeof(struct tt__DeviceCapabilities));
  4. tds__GetCapabilitiesResponse->Capabilities->Device->XAddr = (char *)soap_malloc(soap, sizeof(char) * MAX_64_LEN );
  5. memset(tds__GetCapabilitiesResponse->Capabilities->Device->XAddr, 0, sizeof(char) * MAX_64_LEN);
  6. //填写设备的ip地址以及需要通过onvif协议通信的端口号
  7. sprintf(tds__GetCapabilitiesResponse->Capabilities->Device->XAddr, "%s/onvif/device_service", "192.168.12.135:8899");
  8. //设备的一些基本能力值,是否支持那些功能,如果在开发的时候,如果前段设备支持这些功能的话,就可以直接填写true,否则填写false
  9. tds__GetCapabilitiesResponse->Capabilities->Device->Network = (struct tt__NetworkCapabilities *)soap_malloc(soap, sizeof(struct tt__NetworkCapabilities ));
  10. memset(tds__GetCapabilitiesResponse->Capabilities->Device->Network, 0, sizeof(struct tt__NetworkCapabilities ));
  11. tds__GetCapabilitiesResponse->Capabilities->Device->Network->IPFilter = (enum xsd__boolean *)soap_malloc(soap, sizeof(enum xsd__boolean));
  12. *(tds__GetCapabilitiesResponse->Capabilities->Device->Network->IPFilter) = xsd__boolean__false_; // xsd__boolean__true_
  13. tds__GetCapabilitiesResponse->Capabilities->Device->Network->ZeroConfiguration= (enum xsd__boolean *)soap_malloc(soap, sizeof(enum xsd__boolean));
  14. *(tds__GetCapabilitiesResponse->Capabilities->Device->Network->ZeroConfiguration) = xsd__boolean__true_; // xsd__boolean__false_
  15. tds__GetCapabilitiesResponse->Capabilities->Device->Network->IPVersion6 = (enum xsd__boolean *)soap_malloc(soap, sizeof(enum xsd__boolean));
  16. *(tds__GetCapabilitiesResponse->Capabilities->Device->Network->IPVersion6) = xsd__boolean__false_; // xsd__boolean__true_
  17. tds__GetCapabilitiesResponse->Capabilities->Device->Network->DynDNS = (enum xsd__boolean *)soap_malloc(soap, sizeof(enum xsd__boolean));
  18. *(tds__GetCapabilitiesResponse->Capabilities->Device->Network->DynDNS) = xsd__boolean__true_; // xsd__boolean__false_
  19. tds__GetCapabilitiesResponse->Capabilities->Device->System = (struct tt__SystemCapabilities *)soap_malloc(soap, sizeof(struct tt__SystemCapabilities));
  20. memset( tds__GetCapabilitiesResponse->Capabilities->Device->System, 0, sizeof(struct tt__SystemCapabilities));
  21. tds__GetCapabilitiesResponse->Capabilities->Device->System->DiscoveryResolve = xsd__boolean__true_;
  22. tds__GetCapabilitiesResponse->Capabilities->Device->System->DiscoveryBye     = xsd__boolean__true_;
  23. tds__GetCapabilitiesResponse->Capabilities->Device->System->RemoteDiscovery  = xsd__boolean__false_;
  24. tds__GetCapabilitiesResponse->Capabilities->Device->System->SystemBackup     = xsd__boolean__false_;
  25. tds__GetCapabilitiesResponse->Capabilities->Device->System->SystemLogging    = xsd__boolean__false_;
  26. tds__GetCapabilitiesResponse->Capabilities->Device->System->FirmwareUpgrade  = xsd__boolean__false_;
  27. tds__GetCapabilitiesResponse->Capabilities->Device->System->__sizeSupportedVersions = 1;
  28. tds__GetCapabilitiesResponse->Capabilities->Device->System->SupportedVersions = (struct tt__OnvifVersion *)soap_malloc(soap, sizeof(struct tt__OnvifVersion));
  29. tds__GetCapabilitiesResponse->Capabilities->Device->System->SupportedVersions->Major = 2;
  30. tds__GetCapabilitiesResponse->Capabilities->Device->System->SupportedVersions->Minor = 0;
  31. // 设备IO的一些支持
  32. tds__GetCapabilitiesResponse->Capabilities->Device->IO = (struct tt__IOCapabilities *)soap_malloc(soap, sizeof(struct tt__IOCapabilities));
  33. memset(tds__GetCapabilitiesResponse->Capabilities->Device->IO, 0, sizeof(struct tt__IOCapabilities));
  34. tds__GetCapabilitiesResponse->Capabilities->Device->IO->InputConnectors = (int *)soap_malloc(soap, sizeof(int));
  35. *(tds__GetCapabilitiesResponse->Capabilities->Device->IO->InputConnectors) = 1;
  36. tds__GetCapabilitiesResponse->Capabilities->Device->IO->RelayOutputs = (int *)soap_malloc(soap, sizeof(int));
  37. *(tds__GetCapabilitiesResponse->Capabilities->Device->IO->RelayOutputs) = 1;
  38. tds__GetCapabilitiesResponse->Capabilities->Device->Security = (struct tt__SecurityCapabilities *)soap_malloc(soap, sizeof(struct tt__SecurityCapabilities));
  39. memset(tds__GetCapabilitiesResponse->Capabilities->Device->Security, 0, sizeof(struct tt__SecurityCapabilities));
  40. tds__GetCapabilitiesResponse->Capabilities->Device->Security->TLS1_x002e1          = xsd__boolean__false_;
  41. tds__GetCapabilitiesResponse->Capabilities->Device->Security->TLS1_x002e2          = xsd__boolean__false_;
  42. tds__GetCapabilitiesResponse->Capabilities->Device->Security->OnboardKeyGeneration = xsd__boolean__false_;
  43. tds__GetCapabilitiesResponse->Capabilities->Device->Security->AccessPolicyConfig   = xsd__boolean__false_;
  44. tds__GetCapabilitiesResponse->Capabilities->Device->Security->X_x002e509Token      = xsd__boolean__false_;
  45. tds__GetCapabilitiesResponse->Capabilities->Device->Security->SAMLToken            = xsd__boolean__false_;
  46. tds__GetCapabilitiesResponse->Capabilities->Device->Security->KerberosToken        = xsd__boolean__false_;
  47. tds__GetCapabilitiesResponse->Capabilities->Device->Security->RELToken             = xsd__boolean__false_;
  48. Capabilities__Imaging_Choice:
  49. //Imaging的一些基本信息,关于视频颜色,IRCut的一些基本信息
  50. tds__GetCapabilitiesResponse->Capabilities->Imaging = (struct tt__ImagingCapabilities *)soap_malloc(soap,sizeof(struct tt__ImagingCapabilities));
  51. memset(tds__GetCapabilitiesResponse->Capabilities->Imaging, 0, sizeof(struct tt__ImagingCapabilities));
  52. tds__GetCapabilitiesResponse->Capabilities->Imaging->XAddr = (char *)soap_malloc(soap, sizeof(char) * MAX_64_LEN );
  53. memset(tds__GetCapabilitiesResponse->Capabilities->Imaging->XAddr, '\0', sizeof(char) * MAX_64_LEN);
  54. sprintf(tds__GetCapabilitiesResponse->Capabilities->Imaging->XAddr, "%s/onvif/imaging_service","192.168.12.135:8899");
  55. Capabilities__Media__Choice:
  56. tds__GetCapabilitiesResponse->Capabilities->Media = (struct tt__MediaCapabilities *)soap_malloc(soap,sizeof(struct tt__MediaCapabilities));
  57. memset(tds__GetCapabilitiesResponse->Capabilities->Media, 0, sizeof(struct tt__MediaCapabilities));
  58. tds__GetCapabilitiesResponse->Capabilities->Media->XAddr = (char *)soap_malloc(soap, sizeof(char) * MAX_64_LEN );
  59. memset(tds__GetCapabilitiesResponse->Capabilities->Media->XAddr, 0, sizeof(char) * MAX_64_LEN);
  60. sprintf(tds__GetCapabilitiesResponse->Capabilities->Media->XAddr, "%s/onvif/media_service", "192.168.12.135:8899");
  61. tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities = (struct tt__RealTimeStreamingCapabilities *)soap_malloc(soap,
  62. sizeof(struct tt__RealTimeStreamingCapabilities));
  63. memset(tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities, 0, sizeof(struct tt__RealTimeStreamingCapabilities));
  64. tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTPMulticast   = (enum xsd__boolean *)soap_malloc(soap,sizeof(int));
  65. *tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTPMulticast  = xsd__boolean__false_;
  66. tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTP_USCORETCP  = (enum xsd__boolean*)soap_malloc(soap,sizeof(int));
  67. *tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTP_USCORETCP = xsd__boolean__true_;
  68. tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTP_USCORERTSP_USCORETCP = (enum xsd__boolean*)soap_malloc(soap,sizeof(int));
  69. *tds__GetCapabilitiesResponse->Capabilities->Media->StreamingCapabilities->RTP_USCORERTSP_USCORETCP = xsd__boolean__true_;

2 __tds__GetServices函数的一些基本信息的填写

  1. tds__GetServicesResponse->__sizeService = 1;
  2. tds__GetServicesResponse->Service = (struct tds__Service *)soap_malloc(soap, sizeof(struct tds__Service));
  3. tds__GetServicesResponse->Service[0].Namespace = (char *)soap_malloc(soap, sizeof(char)* INFO_LENGTH);
  4. strcpy(tds__GetServicesResponse->Service[0].Namespace, "http://www.onvif.org/ver10/events/wsdl");
  5. tds__GetServicesResponse->Service[0].XAddr     = (char *)soap_malloc(soap, sizeof(char)* INFO_LENGTH);
  6. strcpy(tds__GetServicesResponse->Service[0].XAddr, "http://192.168.12.135/onvif/services");
  7. tds__GetServicesResponse->Service[0].Capabilities = NULL;
  8. tds__GetServicesResponse->Service[0].Version = (struct tt__OnvifVersion *)soap_malloc(soap, sizeof(struct tt__OnvifVersion));
  9. tds__GetServicesResponse->Service[0].Version->Major = 0;
  10. tds__GetServicesResponse->Service[0].Version->Minor = 3;
  11. tds__GetServicesResponse->Service[0].__size = 0;
  12. tds__GetServicesResponse->Service[0].__any = NULL;
  13. tds__GetServicesResponse->Service[0].__anyAttribute = NULL;

3  __trt__GetProfiles获取设备的配置信息

  1. // VideoSourceConfiguration
  2. trt__GetProfilesResponse->Profiles[i].Name = (char *)soap_malloc(soap, sizeof(char)*MAX_PROF_TOKEN);
  3. memset(trt__GetProfilesResponse->Profiles[i].Name, '\0', sizeof(char)*MAX_PROF_TOKEN);
  4. //profiles的名字,和token不同,实际请求的时候都是需要对应的token值来获取的
  5. strcpy(trt__GetProfilesResponse->Profiles[i].Name, "test_profile");
  6. trt__GetProfilesResponse->Profiles[i].token = (char *)soap_malloc(soap, sizeof(char)*MAX_PROF_TOKEN);
  7. memset(trt__GetProfilesResponse->Profiles[i].token, '\0', sizeof(char)*MAX_PROF_TOKEN);
  8. //此token也就是每次需要获取对应profiles的一些信息的时候,就需要在请求的时候填写此对应的token来,来进行验证判断
  9. strcpy(trt__GetProfilesResponse->Profiles[i].token, "test_token");
  10. trt__GetProfilesResponse->Profiles[i].fixed = (enum xsd__boolean *)soap_malloc(soap, sizeof(int));
  11. memset(trt__GetProfilesResponse->Profiles[i].fixed, 0, sizeof(int));
  12. *(trt__GetProfilesResponse->Profiles[i].fixed) = (enum xsd__boolean )0;
  13. trt__GetProfilesResponse->Profiles[i].__anyAttribute = NULL;
  14. trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration = (struct tt__VideoSourceConfiguration *)soap_malloc(soap,sizeof(struct tt__VideoSourceConfiguration));
  15. memset(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration, 0, sizeof(struct tt__VideoSourceConfiguration));
  16. trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Name = (char *)soap_malloc(soap,sizeof(char) * MAX_PROF_TOKEN);
  17. memset(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Name, '\0', sizeof(char) * MAX_PROF_TOKEN);
  18. // 类似与上面,VideoSource Name,
  19. strcpy(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Name, "test_vsname");
  20. trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->token = (char *)soap_malloc(soap,sizeof(char) * MAX_PROF_TOKEN);
  21. memset(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->token, '\0', sizeof(char) * MAX_PROF_TOKEN);
  22. //求不同码流的视频源信息需要此token值匹配
  23. strcpy(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->token, "test_vsoken");
  24. trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->SourceToken = (char *)soap_malloc(soap,sizeof(char) * MAX_PROF_TOKEN);
  25. memset(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->SourceToken, '\0', sizeof(char) * MAX_PROF_TOKEN);
  26. strcpy(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->SourceToken, "test_vstoken");
  27. trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->UseCount = 1;
  28. trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds = (struct tt__IntRectangle *)soap_malloc(soap, sizeof(struct tt__IntRectangle));
  29. memset(trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds, 0, sizeof(struct tt__IntRectangle));
  30. trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds->x = 0;
  31. trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds->y = 0;
  32. trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds->width = 1280;
  33. trt__GetProfilesResponse->Profiles[i].VideoSourceConfiguration->Bounds->height = 720;
  34. // VideoEncoderConfiguration
  35. trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration = (struct tt__VideoEncoderConfiguration *)soap_malloc(soap, sizeof(struct tt__VideoEncoderConfiguration)) ;
  36. memset(trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration, '\0', sizeof(struct tt__VideoEncoderConfiguration));
  37. trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->Name = (char *)soap_malloc(soap, sizeof(char)*MAX_PROF_TOKEN);
  38. memset(trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->Name, '\0', sizeof(char)*MAX_PROF_TOKEN);
  39. strcpy(trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->Name, "test_vename");
  40. trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->token = (char *)soap_malloc(soap, sizeof(char)*MAX_PROF_TOKEN);
  41. memset(trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->token, '\0', sizeof(char)*MAX_PROF_TOKEN);
  42. strcpy(trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->token, "test_vstoken");
  43. trt__GetProfilesResponse->Profiles[i].VideoEncoderConfiguration->UseCount = 1;
  44. //当然在实际开发的过程中最好把单个也实现了,也就是__trt__GetProfile函数接口,此接口是根据对应的请求的token来获取对应的信息的!

4  视频源已经视频编码必须填充的一些基本需要填写的一些关键信息

(1)__trt__GetVideoEncoderConfiguration函数接口一些主要信息

  1. //请求的时候需要匹配的一些基本信息
  2. trt__GetVideoEncoderConfigurationResponse->Configuration->Name = (char *)soap_malloc(soap, sizeof(char)*MAX_PROF_TOKEN);
  3. memset(trt__GetVideoEncoderConfigurationResponse->Configuration->Name, '\0', sizeof(char)*MAX_PROF_TOKEN);
  4. strcpy(trt__GetVideoEncoderConfigurationResponse->Configuration->Name, "test_vsname");
  5. trt__GetVideoEncoderConfigurationResponse->Configuration->token = (char *)soap_malloc(soap, sizeof(char)*MAX_PROF_TOKEN);
  6. memset(trt__GetVideoEncoderConfigurationResponse->Configuration->token, '\0', sizeof(char)*MAX_PROF_TOKEN);
  7. strcpy(trt__GetVideoEncoderConfigurationResponse->Configuration->token, "test_vstoken");
  8. trt__GetVideoEncoderConfigurationResponse->Configuration->UseCount = 1;
  9. trt__GetVideoEncoderConfigurationResponse->Configuration->Quality = 100;
  10. //根据前端设备时间支持的编码格式选择对应的值,因为我测试的是设备只支持H264 ,所以选了2
  11. trt__GetVideoEncoderConfigurationResponse->Configuration->Encoding = (enum tt__VideoEncoding) 2;   // JPEG = 0 , MPEG = 1, H264 = 2;
  12. trt__GetVideoEncoderConfigurationResponse->Configuration->Resolution = (struct tt__VideoResolution *)soap_malloc(soap,sizeof(struct tt__VideoResolution));
  13. memset(trt__GetVideoEncoderConfigurationResponse->Configuration->Resolution, 0 , sizeof(struct tt__VideoResolution));
  14. // 请求的视频的分辨率,对应前端设备填写对应的值,我这是1280 * 720
  15. trt__GetVideoEncoderConfigurationResponse->Configuration->Resolution->Width  = 1280;
  16. trt__GetVideoEncoderConfigurationResponse->Configuration->Resolution->Height = 720;
  17. trt__GetVideoEncoderConfigurationResponse->Configuration->RateControl = (struct tt__VideoRateControl *)soap_malloc(soap, sizeof(struct tt__VideoRateControl));
  18. memset(trt__GetVideoEncoderConfigurationResponse->Configuration->RateControl, 0, sizeof(struct tt__VideoRateControl));
  19. //请求的对应的编码信息.各个意思参考上面说明
  20. trt__GetVideoEncoderConfigurationResponse->Configuration->RateControl->FrameRateLimit   = 30;
  21. trt__GetVideoEncoderConfigurationResponse->Configuration->RateControl->EncodingInterval = 1;
  22. trt__GetVideoEncoderConfigurationResponse->Configuration->RateControl->BitrateLimit     =2048;
  23. trt__GetVideoEncoderConfigurationResponse->Configuration->H264 = (struct tt__H264Configuration *)soap_malloc(soap, sizeof(struct tt__H264Configuration));
  24. memset(trt__GetVideoEncoderConfigurationResponse->Configuration->H264, 0, sizeof(struct tt__H264Configuration));
  25. trt__GetVideoEncoderConfigurationResponse->Configuration->H264->GovLength  = 30;
  26. trt__GetVideoEncoderConfigurationResponse->Configuration->H264->H264Profile = (enum tt__H264Profile)3;

  (2)__trt__GetVideoEncoderConfigurations函数接口一些主要信息

  1. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Name = (char *)soap_malloc(soap, sizeof(char)*MAX_PROF_TOKEN);
  2. memset(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Name, '\0', sizeof(char)*MAX_PROF_TOKEN);
  3. strcpy(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Name, "test_vsname");
  4. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].token = (char *)soap_malloc(soap, sizeof(char)*MAX_PROF_TOKEN);
  5. memset(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].token, '\0', sizeof(char)*MAX_PROF_TOKEN);
  6. //请求的token值
  7. strcpy(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].token, "test_vstoken");
  8. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].UseCount = 1;
  9. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Quality = 100;
  10. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Encoding = (enum tt__VideoEncoding) 2;   // JPEG = 0 , MPEG = 1, H264 = 2;
  11. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Resolution = (struct tt__VideoResolution *)soap_malloc(soap,sizeof(struct tt__VideoResolution));
  12. memset(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Resolution, 0 , sizeof(struct tt__VideoResolution));
  13. // 请求的视频的分辨率,对应前端设备填写对应的值,我这是1280 * 720
  14. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Resolution->Width  = 1280;
  15. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].Resolution->Height = 720;
  16. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].RateControl = (struct tt__VideoRateControl *)soap_malloc(soap, sizeof(struct tt__VideoRateControl));
  17. memset(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].RateControl, 0, sizeof(struct tt__VideoRateControl));
  18. //请求的视频数据的一些编码信息
  19. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].RateControl->FrameRateLimit   = 30;
  20. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].RateControl->EncodingInterval = 1;
  21. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].RateControl->BitrateLimit     = 2048;
  22. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].H264 = (struct tt__H264Configuration *)soap_malloc(soap, sizeof(struct tt__H264Configuration));
  23. memset(trt__GetVideoEncoderConfigurationsResponse->Configurations[0].H264, 0, sizeof(struct tt__H264Configuration));
  24. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].H264->GovLength  = 30;
  25. trt__GetVideoEncoderConfigurationsResponse->Configurations[0].H264->H264Profile = (enum tt__H264Profile)3;

(3)__trt__GetVideoSourceConfiguration需要填写的一些基本信息

  1. trt__GetVideoSourceConfigurationResponse->Configuration->UseCount = 1;
  2. trt__GetVideoSourceConfigurationResponse->Configuration->Name = (char*)soap_malloc(soap, sizeof(char) * MAX_PROF_TOKEN);
  3. memset(trt__GetVideoSourceConfigurationResponse->Configuration->Name, '\0', sizeof(char) * MAX_PROF_TOKEN);
  4. strcpy(trt__GetVideoSourceConfigurationResponse->Configuration->Name, "test_vsname");
  5. trt__GetVideoSourceConfigurationResponse->Configuration->token = (char*)soap_malloc(soap, sizeof(char) * MAX_PROF_TOKEN);
  6. memset(trt__GetVideoSourceConfigurationResponse->Configuration->token, '\0', sizeof(char) * MAX_PROF_TOKEN);
  7. strcpy(trt__GetVideoSourceConfigurationResponse->Configuration->token, "test_vstoken");
  8. trt__GetVideoSourceConfigurationResponse->Configuration->SourceToken = (char*)soap_malloc(soap, sizeof(char) * MAX_PROF_TOKEN);
  9. memset(trt__GetVideoSourceConfigurationResponse->Configuration->SourceToken, '\0', sizeof(char) * MAX_PROF_TOKEN);
  10. strcpy(trt__GetVideoSourceConfigurationResponse->Configuration->SourceToken, "test_vstoken");
  11. trt__GetVideoSourceConfigurationResponse->Configuration->Bounds = (struct tt__IntRectangle *)soap_malloc(soap, sizeof(struct tt__IntRectangle));
  12. memset(trt__GetVideoSourceConfigurationResponse->Configuration->Bounds, 0, sizeof(struct tt__IntRectangle));
  13. trt__GetVideoSourceConfigurationResponse->Configuration->Bounds->x      = 0;
  14. trt__GetVideoSourceConfigurationResponse->Configuration->Bounds->y      = 0;
  15. trt__GetVideoSourceConfigurationResponse->Configuration->Bounds->width  = 1280;
  16. trt__GetVideoSourceConfigurationResponse->Configuration->Bounds->height = 720;

(4)__trt__GetVideoSourceConfigurations需要填写的一些基本信息

  1. trt__GetVideoSourceConfigurationsResponse->Configurations[0].UseCount = 1;
  2. trt__GetVideoSourceConfigurationsResponse->Configurations[0].Name = (char*)soap_malloc(soap, sizeof(char) * MAX_PROF_TOKEN);
  3. memset(trt__GetVideoSourceConfigurationsResponse->Configurations[0].Name, '\0', sizeof(char) * MAX_PROF_TOKEN);
  4. strcpy(trt__GetVideoSourceConfigurationsResponse->Configurations[0].Name, "test_vsname");
  5. trt__GetVideoSourceConfigurationsResponse->Configurations[0].token = (char*)soap_malloc(soap, sizeof(char) * MAX_PROF_TOKEN);
  6. memset(trt__GetVideoSourceConfigurationsResponse->Configurations[0].token, '\0', sizeof(char) * MAX_PROF_TOKEN);
  7. strcpy(trt__GetVideoSourceConfigurationsResponse->Configurations[0].token, "test_vstoken");
  8. trt__GetVideoSourceConfigurationsResponse->Configurations[0].SourceToken = (char*)soap_malloc(soap, sizeof(char) * MAX_PROF_TOKEN);
  9. memset(trt__GetVideoSourceConfigurationsResponse->Configurations[0].SourceToken, '\0', sizeof(char) * MAX_PROF_TOKEN);
  10. strcpy(trt__GetVideoSourceConfigurationsResponse->Configurations[0].SourceToken, "test_vstoken");
  11. trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds = (struct tt__IntRectangle *)soap_malloc(soap, sizeof(struct tt__IntRectangle));
  12. memset(trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds, 0, sizeof(struct tt__IntRectangle));
  13. trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds->x      = 0;
  14. trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds->y      = 0;
  15. trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds->width  = 1280;
  16. trt__GetVideoSourceConfigurationsResponse->Configurations[0].Bounds->height = 720;

这里里面本来都是一些个不相同的,通过对应不同的Token值来获取不同的视频源以及视频编码的一些信息的,因为这里我只是一个简单的测试,所以都是对单一的视频码流填写的相关信息,可能大家看到很多地方类似的,但是当不同的token值过来的时候,需要对应填写不同的相关信息的, 每次获取的时候都需要对应的判断token值是否正确,我这里都作了一些简化,在实际开发的时候都需要填充进去

5 __trt__GetStreamUri后去设备的URi,通过RTSP获取视频流

  1. trt__GetStreamUriResponse->MediaUri = (struct tt__MediaUri *)soap_malloc(soap, sizeof(struct tt__MediaUri));
  2. memset(trt__GetStreamUriResponse->MediaUri, 0, sizeof(struct tt__MediaUri));
  3. trt__GetStreamUriResponse->MediaUri->Uri = (char *)soap_malloc(soap, sizeof(char) * MAX_64_LEN);
  4. memset(trt__GetStreamUriResponse->MediaUri->Uri, '\0', sizeof(char) * MAX_64_LEN);
  5. //根据各个设备的rtsp协议的uri不同填写对应的值
  6. strncpy(trt__GetStreamUriResponse->MediaUri->Uri, "rtsp://192.168.12.135:554/livestream", MAX_64_LEN);
  7. trt__GetStreamUriResponse->MediaUri->InvalidAfterConnect = (enum xsd__boolean)0;
  8. trt__GetStreamUriResponse->MediaUri->InvalidAfterReboot  = (enum xsd__boolean)0;
  9. //超时时间
  10. trt__GetStreamUriResponse->MediaUri->Timeout = 200;

设备端通过Onvif协议来实现RTSP预览的代码已经基本写完,现在可以看看效果,首先确定设备端能够通过vlc正确预览图像, 也就是说设备端需要支持RTSP协议,

可能通过Live555来实现。然后就可以通过onvif的工具 Onvif  Deviece Manager 来查看效果了!

先看看Live Video的效果

z

再看看Video Stream的效果图

最后看看token的一些显示的基本信息

里面因为是自己的一些token和name信息,所以我就打了码,这是都是可以根据自己的设备自己来定的,所以对对接视频没有响,只要在请求的时候对应自己的设备的能力值获取的时候对应起来就可以的!onvif设备端对接视频流也就完成!

 

这个过程中还是有很多不不懂的地方,可能上面的开发过程很多不够完善的地方,如果有懂的更多这方面知识的开发者,
希望能指出我的不足或者提出自己的观点,大家相互促进学习。

Onvif开发之服务端成功对接Rtsp视频流篇的更多相关文章

  1. Onvif开发之服务端发现篇

    服务端的开发相对来说比客户端稍微难一点,也就是给填充相关结构体的时候,需要一点一点的去查阅,验证各个结构中各个成员各自代表什么意思,以及对应的功能需要是那个接口实现,这是开发服务端最头疼的事情.(在开 ...

  2. HttpURLConnection实现两个服务端的对接

    在企业开发中,很多时候需要用到两个服务端的对接,在java类中进行连接并传递参数,其中的HttpURLConnection是一种轻量化,并且简单的方法! package httptest; impor ...

  3. Delphi XE5通过WebService开发Web服务端和手机客户端

    Delphi XE5通过WebService开发Web服务端和手机客户端介绍 我们开发一个三层的android程序 建立一个webservices  stand-alone vcl applicati ...

  4. 项目二:企业级java电商网站开发(服务端)

    声明:项目源于网络,支持正版教程,学习使用,仅记录在此 项目介绍 企业级java电商网站开发(服务端),模块划分:用户管理,商品管理,商品品类管理,订单管理,订单详情管理,购物车管理,收货地址管理,支 ...

  5. iOS推送小结(证书的生成、客户端的开发、服务端的开发)

    1.推送过程简介 1.1.App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请 ...

  6. 使用Apache CXF开发WebServices服务端、客户端

    在前一篇的博客中,我使用Xfire1.x来开发了WebServies的服务端. 但是如果你访问Apache的官网,可以看到xfire已经被合并了. 最新的框架叫做CXF. Apache CXF = C ...

  7. 转:: 刺鸟:用python来开发webgame服务端(5)

    来源:http://ciniao.me/article.php?id=19 --------------- 刺鸟原创文章,转载请注明出处    在前面的文章中,我们已经开始了不少逻辑功能的开发,在这期 ...

  8. 转:: 刺鸟:用python来开发webgame服务端(2)

    来源:http://ciniao.me/article.php?id=10 --------------- 刺鸟原创文章,转载请注明出处    就在刚才,我们用基于python下的Twisted库写了 ...

  9. 转:: 刺鸟:用python来开发webgame服务端(1)

    来源:http://ciniao.me/article.php?id=9 --------------- 刺鸟原创文章,转载请注明出处    在开始之前,先简单描述一下项目的特点:我要实现的是一个mm ...

随机推荐

  1. 互不侵犯_状压$dp$

    如果有想学习状压\(dp\)的童鞋,请光临博客状压\(dp\)初学 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八 ...

  2. Apache Bench测试

    - 压力测试神器 Siege - Locust Web测压工具python开源 - 介绍: ab是apachebench命令的缩写. ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某 ...

  3. IDEA中FindBugs编码规范工具使用

    IDEA中安装FindBugs插件: file--Settings--Plugins 在Plugins搜索FindBugs: 安装完成后在项目中选中文件右键找到findBugs: 检查代码结果: 按照 ...

  4. Node+Deployd+MongoDB安装问题

    首先:祝大家新年快乐!然后:最近在看一本angular教程,教程里面需要装一些软件(node,deployd,mongodb),当三个装完后在doc命令行下运行项目时出现问题了 mongodb已经按照 ...

  5. Django分页和查询参数的问题

    查询是通过get的方式,之前没有分页之前,url是这样的: http://hostname/search?query=port%3A8080 那么我的想法是如果分页了. 1,不带page参数了.nex ...

  6. 机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

    六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocess ...

  7. Mac sublime快捷键操作

    1.打开命令面板 command + shift + p 2.打开关闭side bar command + k , command + b 3.打开新sublime窗口 command + shift ...

  8. 紫书 习题 10-15 UVa 12063(数位dp)

    大佬真的强!!https://blog.csdn.net/u014800748/article/details/45225881 #include<cstdio> #include< ...

  9. Unity 实现Log实时输出到屏幕或控制台上<二>

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/49884507 作者:car ...

  10. Android Studio更改项目SDK的版本

    Elipse 中的安卓项目,在Android Studio中可以通过File -->new -- > Import Project的方法建立起来.但是有时候需要用到更改项目的API Lev ...