三方管理iOS Developer首页投稿(暂停使用,暂停投稿)

iOS端海康威视摄像头接入

2017-03-22  本文已影响2776人  uproject

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

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

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

01.png

其中

2、添加所需库

注:如果编译出现’ libxml/tree.h’ file not found 请在Build Setting Header Search Paths 中设置:”/usr/include/libxml2/**”

3、项目中的使用

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

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

_lineList = [NSMutableArray array];
[vmsNetSDK getLineList:服务器地址 toLineInfoList:_lineList];

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

   //获取当前层级的所有资源
  -(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

_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
上一篇下一篇

猜你喜欢

热点阅读