iOS端海康威视摄像头接入

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

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

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容