欢迎各位客官大老爷进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
网友评论
非常感谢
非常感谢
rtsp start stream failed. error code is 18
start VP_RealPlay failed
知道什么原因吗 老哥
#pragma mark 截图
- (void)capture
{
NSLog(@"截图........");
VPCaptureInfo *captureInfo = [[VPCaptureInfo alloc] init];
if (![VideoPlayUtility getCaptureInfo:@"camera01" toCaptureInfo:captureInfo]) {
NSLog(@"getCaptureInfo failed");
return;
}
// 设置抓图质量 1-100 越高质量越高
captureInfo.nPicQuality = 80;
BOOL result = [g_playMamager capture:captureInfo];
if (result) {
NSLog(@"截图成功,图片路径:%@",captureInfo.strCapturePath);
} else {
NSLog(@"截图失败");
}
}