iOS端海康威视摄像头接入

欢迎各位客官大老爷进QQ群交流: 257011323 (SDK都在群共享)

这几天公司要求在手机端需要看到海康威视的监控视频,网上找了半天也没有现成能用的demo。后来向海康威视的技术人员要了份demo,在这里总结一下。另外需要Demo的可以私信我。

1、导入如图所示的三个文件

iOS端海康威视摄像头接入_第1张图片
01.png

其中

  • VideoPlaySDK 是用监控点的播放地址(多为rtsp url)通过流媒体或者MAG取流,实现播放、实时预览和远程回放功能。
  • VMSNetSDK 是获取平台资源的接口。如获取设备信息,获取区域信息等等。

2、添加所需库

  • 在使用VMSNetSDK中libVMSNetSDK.a的时候需要同时添加
    MobileCoreServices.framework
    SystemConfiguration.framework
    CFNetwork.framework
    CoreGraphics.framework
    libz.1.2.5.dylib
    libxml2.dylib
    libsql3.dylib
    libc++.dylib
    libstdc++.6.0.9.dylib
    以及VMSNetSDK中的所有静态库
注:如果编译出现’ libxml/tree.h’ file not found 请在Build Setting Header Search Paths 中设置:”/usr/include/libxml2/**”
  • 在使用VideoPlaySDK的时候,需要添加以下库
    AVFoundation.framework
    AudioToolbox.framework
    CoreGraphics.framework
    OpenAL.framework
    OpenGLES.framework
    QuartzCore.framework
    LibiconV2.4.0.dylib
    VideoToolbox.framework
    GLKit.framework
    CoreMedia.framework
    CoreGraphice.framework
    AudioToolbox.framework

3、项目中的使用

  • 1.在didFinishLaunchingWithOptions方法中调用
//初始化播放库 
InitLib();
VP_InitSDK();
  • 2.登录平台获取登录信息
  • 2.1 获取登录信息:
 [vmsNetSDK login:_serverAddressTextField.text
                        toUserName:平台账号
                        toPassword:平台密码
                          toLineID:可用线路
                     passwordLevel:3 //用户密码强度由开发者自行判断,强度由弱到强分别为0,1,2,3
                        toServInfo:mspInfo]; 

其中mspInfo就是所需的登录信息

  • 2.2 获取线路列表:
_lineList = [NSMutableArray array];
[vmsNetSDK getLineList:服务器地址 toLineInfoList:_lineList];

内网测试环境为http://10.33.27.240

  • 3.获取平台账号当前层级下的所有资源
   //获取当前层级的所有资源
  -(NSMutableArray *)_getAllResources {
    VMSNetSDK *vmsNetSDK = [VMSNetSDK shareInstance];
     _allResorceList = [NSMutableArray array];
     NSMutableArray *tempArray = [NSMutableArray array];    
   //判断当前对象应该获取控制中心还是区域下的资源
   if (nil == _regionInfo) {
       if (nil == _controlUnitInfo) {      
           //获取根控制中心
           [vmsNetSDK getControlUnitList:_serverAddress
                             toSessionID:_mspInfo.sessionID
                         toControlUnitID:0
                            toNumPerOnce:50
                               toCurPage:1
                       toControlUnitList:tempArray];
           [_allResorceList addObjectsFromArray:tempArray];
           [tempArray removeAllObjects];
           
       } else {
           
           //获取控制中心下的控制中心
           [vmsNetSDK getControlUnitList:_serverAddress
                             toSessionID:_mspInfo.sessionID
                         toControlUnitID:_controlUnitInfo.controlUnitID
                            toNumPerOnce:50
                               toCurPage:1
                       toControlUnitList:tempArray];
           [_allResorceList addObjectsFromArray:tempArray];
           [tempArray removeAllObjects];
           
           //获取控制中心下的区域
           [vmsNetSDK getRegionListFromCtrlUnit:_serverAddress
                                    toSessionID:_mspInfo.sessionID
                                toControlUnitID:_controlUnitInfo.controlUnitID
                                   toNumPerOnce:50
                                      toCurPage:1
                                   toRegionList:tempArray];
           [_allResorceList addObjectsFromArray:tempArray];
           [tempArray removeAllObjects];
           
           //获取控制中心下的设备
           [vmsNetSDK getCameraListFromCtrlUnit:_serverAddress
                                    toSessionID:_mspInfo.sessionID
                                toControlUnitID:_controlUnitInfo.controlUnitID
                                   toNumPerOnce:50
                                      toCurPage:1
                                   toCameraList:tempArray];
           [_allResorceList addObjectsFromArray:tempArray];
           [tempArray removeAllObjects];
           
       }
     } else {      
       //获取区域下的区域
       [vmsNetSDK getRegionListFromRegion:_serverAddress
                              toSessionID:_mspInfo.sessionID
                               toRegionID:_regionInfo.regionID
                             toNumPerOnce:50
                                toCurPage:1
                             toRegionList:tempArray];
       [_allResorceList addObjectsFromArray:tempArray];
       [tempArray removeAllObjects];
       //获取区域下的设备
       [vmsNetSDK getCameraListFromRegion:_serverAddress
                              toSessionID:_mspInfo.sessionID
                               toRegionID:_regionInfo.regionID
                             toNumPerOnce:50
                                toCurPage:1
                             toCameraList:tempArray];
       [_allResorceList addObjectsFromArray:tempArray];
       [tempArray removeAllObjects];
     }
     return _allResorceList;
     }

如果进行递归遍历,可以获取到所有设备以及播放通道。
获取到的资源数组中如果是属于CCameraInfo 类或其子类的,就是可以用于播放的设备,将所需的参数传递过去即可
服务器地址、登录信息MspInfo以及监控点信息cameraInfo

  • 4.准备播放
    • 获取播放地址

_realPlayURL = [[CRealPlayURL alloc] init];
BOOL result = [vmsNetSDK getRealPlayURL:服务器地址
toSessionID:_mspInfo.sessionID
toCameraID:_cameraInfo.cameraID
toRealPlayURL:_realPlayURL
toStreamType:STREAM_SUB]; //StreamType=0时,返回主码流和MAG地址,其=1时返回子码流和MAG地址


  - 获取设备信息

CDeviceInfo *deviceInfo = [[CDeviceInfo alloc] init];
result = [vmsNetSDK getDeviceInfo:_serverAddress
toSessionID:_mspInfo.sessionID
toDeviceID:_cameraInfo.deviceID
toDeviceInfo:deviceInfo];

 - 填充监控点信息

//填充vidioInfo
VideoPlayInfo *videoInfo = [[VideoPlayInfo alloc] init];
//监控点ID
videoInfo.strID = _cameraInfo.cameraID;
//取流协议类型 UDP或TCP
videoInfo.protocalType = PROTOCAL_UDP;
//播放模式,实时预览或者远程回放
videoInfo.playType = REAL_PLAY;
//取流方式,目前只支持从流媒体
videoInfo.streamMethod = STREAM_METHOD_VTDU;
//主子码流
VP_STREAM_TYPE streamType = STREAM_SUB;
videoInfo.streamType = streamType;
//播放的控件 UIView即可
videoInfo.pPlayHandle = (id)self.playView;
//是否要开启转封装
videoInfo.bSystransform = NO;
//播放地址
videoInfo.strPlayUrl = _realPlayURL.url1;

- 5.开始播放

// 获取VideoPlaySDK 播放句柄
if (_vpHandle == NULL)
{
_vpHandle = VP_Login(videoInfo);
}

// 设置状态回调
if (_vpHandle != NULL)
{
    VP_SetStatusCallBack(_vpHandle, StatusCallBack, (__bridge void *)self);
}

// 开始实时预览
if (_vpHandle != NULL)
{
    if (!VP_RealPlay(_vpHandle))
    {
        NSLog(@"start VP_RealPlay failed");
    }
}

###4、总结
- 虽然_mspInfo.sessionID和 _cameraInfo.cameraID是动态的,但是在播放的时候并不需要获取到,在自己项目集成的时候,只需要获取到rtsp流播放的地址,这个地址也是写死的,初始化一个VideoplayInfo,监控点ID可以不填,把其他的参数填好,然后开始播放就可以了
- 播放的卡顿跟网络很有关系,车载摄像头最好使用网线上传流媒体,使用3/4g卡上传的话延迟会比较严重。

- 关于优化的方面
VideoPlaySDK是封装好的播放控件,如果需要播放流畅度优化的话应该需要自己写一个播放器来播放了。

欢迎各位客官大老爷进QQ群交流: 257011323

你可能感兴趣的:(iOS端海康威视摄像头接入)