在接触海康之前有接触过大华视频的集成,萤石视频的集成,现在海康8800的视频是第一次集成,其中遇到了一个坑还是值得说一下的(个人认为还是很坑的)。
下载地址:海康8800所需jar 和so文件
Demo地址:海康视频AndroidDemo

海康8800的视频集成步骤如下:


1、导入jar和so文件 (如果自己没有的话,文章开头有下载链接)

在build.gradle 中配置如下代码:

repositories { flatDir { dirs 'libs' } }

2、在Application中注册,代码如下:

   OkHttpUtils.init(this);MCRSDK.init();RtspClient.initLib();MCRSDK.setPrint(1, null);}
  1. 你要有视频服务器的IP地址和端口,还需要登录视频平台的用户名和密码,这里我就不贴出公司的账号了,不然吃不了兜着走了:)。
    4.根据3 的IP和端口获取分支
 /** 获取分支线*/private void getFetchLine() {new Thread() {@Overridepublic void run() {super.run();List<LineInfo> lineInfoList = new ArrayList<>();boolean ret = VMSNetSDK.getInstance().getLineList(SERVER_URL, lineInfoList);if (ret) {Message message = new Message();message.what = AppConfig.Login.GET_LINE_SUCCESS;message.obj = lineInfoList;handler.sendMessage(message);} else {handler.sendEmptyMessage(AppConfig.Login.GET_LINE_FAILED);}}}.start();}

获取分之,需要在子线程中获取, 声明一个LineInfo 集合对象,用来存放获取到的分之,通过如下代码获取分之VMSNetSDK.getInstance().getLineList(SERVER_URL, lineInfoList); 该方法返回值是一个boolean类型,获取到分之返回true否则返回false, getLineList有两个参数,第一个是服务器地址,格式如下http://xxx.xxx.xxx.xxx:端口,第二个参数是获取到分支的集合。
z这里我用handler 处理几种状态,代码如下 代码2

    Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case AppConfig.Login.GET_LINE_SUCCESS://分支获取成功List<LineInfo> list = (List<LineInfo>) msg.obj;if (list.size() > 0) {login(list.get(0)); //登录}break;case AppConfig.Login.GET_LINE_FAILED:ToastUtils.showShort(getActivity(), "分支获取失败");break;case AppConfig.Login.LOGIN_SUCCESS:ToastUtils.showShort(getActivity(), "登录成功");requestResource();//获取资源break;case AppConfig.Login.LOGIN_FAILED:ToastUtils.showShort(getActivity(), "视频登录失败");break;case MsgIds.GET_SUB_F_R_SUC:break;}}};============================   ==============================================
//以下是状态类型/*** 登录逻辑相关常量*/public interface Login {/*** 获取线路成功*/int GET_LINE_SUCCESS = 0;/*** 获取线路失败*/int GET_LINE_FAILED = 1;/*** 显示进度*/int SHOW_LOGIN_PROGRESS = 2;/*** 取消进度提示*/int CANCEL_LOGIN_PROGRESS = 3;/*** 登录成功*/int LOGIN_SUCCESS = 4;/*** 登录失败*/int LOGIN_FAILED = 5;/*** 获取线路中*/int GET_LINE_IN_PROCESS = 6;}

4、分支获取成功后就可以登录了,代码如下:

  /*** 登录视频服务器** @param lineInfo*/private void login(final LineInfo lineInfo) {new Thread() {@Overridepublic void run() {super.run();String macAddress = CommonUtils.getMac(getActivity());boolean ret = VMSNetSDK.getInstance().login(AppConfig.SERVER_URL, AppConfig.USERNAME, AppConfig.PASSWORD, lineInfo.lineID, macAddress, servInfo);if (servInfo != null) {// 打印出登录时返回的信息Log.i(TAG, "login ret : " + ret);Log.i(TAG, "login response info[" + "sessionID:" + servInfo.sessionID + ",userID:"+ servInfo.userID + ",magInfo:" + servInfo.magInfo + ",picServerInfo:"+ servInfo.picServerInfo + ",ptzProxyInfo:" + servInfo.ptzProxyInfo + ",userCapability:"+ servInfo.userCapability + ",vmsList:" + servInfo.vmsList + ",vtduInfo:"+ servInfo.vtduInfo + ",webAppList:" + servInfo.webAppList + "]");}if (ret) {TempData.getIns().setLoginData(servInfo);handler.sendEmptyMessage(AppConfig.Login.LOGIN_SUCCESS);} else {handler.sendEmptyMessage(AppConfig.Login.LOGIN_FAILED);}}}.start();}

登录时需要传入获取到的分支实体,因为当前我就一个分支,所以我取出来直接穿了一个LineInfo 对象。登录方法如下:VMSNetSDK.getInstance().login(AppConfig.SERVER_URL, AppConfig.USERNAME, AppConfig.PASSWORD, lineInfo.lineID, macAddress, servInfo)在这个方法里面一共有6个参数,第一个是服务器地址,第二个是登录视频平台的用户名,第三个是登录视频平台的密码,第四个是分支ID,第五个是手机的mac地址, 第六个是该方法登录成功后获取到的视频服务器信息,保存在servInfo里面。该方法返回一个boolean类型,true登录成功,false 登录失败。
同样我也是用handler 处理的几种状态,代码在上面的Login 接口中。
5、请求视频资源树

 public interface Resource {/*** 控制中心*/int TYPE_CTRL_UNIT = 1;/*** 区域*/int TYPE_REGION = 2;/*** 未知*/int TYPE_UNKNOWN = 3;}ResourceControl rc;private int pResType = AppConfig.Resource.TYPE_UNKNOWN;//获取资源private int pId = 0;/*** 请求资源*/private void requestResource() {rc = new ResourceControl();rc.setCallback(this);rc.setCallback(new MsgCallback() {@Overridepublic void onMsg(int msgId, Object data) {Message msg = new Message();msg.what = msgId;msg.obj = data;rcHandler.sendMessage(msg);}});new Thread(new Runnable() {@Overridepublic void run() {rc.reqResList(pResType, pId);}}).start();这段代码的意思是获取资源树  请求结果会反会到rc 注册的监听里面,然后通过handler具体处理,如下是整个rchandlerHandler rcHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {// 获取控制中心列表成功case MsgIds.GET_C_F_NONE_SUC:List<ControlUnitInfo> controlUnitInfoList = (List<ControlUnitInfo>) msg.obj;if (controlUnitInfoList.size() > 0) {pId = controlUnitInfoList.get(0).controlUnitID;pResType = AppConfig.Resource.TYPE_CTRL_UNIT;requestResource();}break;// 从控制中心获取下级资源列表成功case MsgIds.GET_SUB_F_C_SUC:List<RegionInfo> regionInfoList = (List<RegionInfo>) msg.obj;if (regionInfoList.size() > 0) {pId = regionInfoList.get(0).controlUnitID;pResType = AppConfig.Resource.TYPE_REGION;requestResource();}break;// 从区域获取下级列表成功case MsgIds.GET_SUB_F_R_SUC:cameraInfos = (List<CameraInfo>) msg.obj;addrAdapter = new BaseAddrAdapter<>(getActivity(), cameraInfos);spinner.setAdapter(addrAdapter);break;// 获取控制中心列表失败case MsgIds.GET_C_F_NONE_FAIL:// 调用getControlUnitList失败case MsgIds.GET_CU_F_CU_FAIL:// 调用getRegionListFromCtrlUnit失败case MsgIds.GET_R_F_C_FAIL:// 调用getCameraListFromCtrlUnit失败case MsgIds.GET_C_F_C_FAIL:// 从控制中心获取下级资源列表成失败case MsgIds.GET_SUB_F_C_FAIL:// 调用getRegionListFromRegion失败case MsgIds.GET_R_F_R_FAIL:// 调用getCameraListFromRegion失败case MsgIds.GET_C_F_R_FAIL:// 从区域获取下级列表失败case MsgIds.GET_SUB_F_R_FAILED:ToastUtils.showShort(getActivity(), "获取资源列表失败");default:break;}}};

z这里可以看到 GET_C_F_NONE_SUC,GET_SUB_F_C_SUC,这里可以看到 GET_C_F_NONE_SUC 获取控制中心和获取控制中心下级资源列表成功后,并没有终止,而是再次调用requestResource方法,知道获取到区域下级列表才会停止。

这里我把集合数据放到了一个spinner 里面展示, 通过选择Spinner的Item 播放选中的视频,代码如下:

    /*** 初始化视频*/private void initData() {mRealPlayURL = new RealPlayURL();mLiveControl = new LiveControl();mLiveControl.setLiveCallBack(this);mDeviceID = cameraInfo.deviceID;mVmsNetSDK = VMSNetSDK.getInstance();DeviceInfo deviceInfo = new DeviceInfo();if (mVmsNetSDK == null) {CLog.e(TAG, "mVmsNetSDK is null");return;}boolean ret = mVmsNetSDK.getDeviceInfo(SERVER_URL,TempData.getIns().getLoginData().sessionID, mDeviceID, deviceInfo);if (ret) {name = deviceInfo.userName;password = deviceInfo.password;}startPlayVideo();}/*** 启动播放 void** @since V1.0*/private void startPlayVideo() {progressBar.setVisibility(View.VISIBLE);new Thread() {@Overridepublic void run() {super.run();mLiveControl.setLiveParams(getPlayUrl(2), mName, mPassword);if (mLiveControl.LIVE_PLAY == mLiveControl.getLiveState()) {mLiveControl.stop();}if (mLiveControl.LIVE_INIT == mLiveControl.getLiveState()) {mLiveControl.startLive(surfaceView);}}}.start();}/*** 该方法是获取播放地址的,当mStreamType=2时,获取的是MAG,当mStreamType =1时获取的子码流,当mStreamType = 0时获取的是主码流* 由于该方法中部分参数是监控点的属性,所以需要先获取监控点信息,具体获取监控点信息的方法见resourceActivity。** @param streamType 2、表示MAG取流方式;1、表示子码流取流方式;0、表示主码流取流方式;* @return String 播放地址 :2、表示返回的是MAG的播放地址;1、表示返回的是子码流的播放地址;0、表示返回的是主码流的播放地址。* @since V1.0*/private String getPlayUrl(int streamType) {String url = "";// 登录平台地址String mAddress = SERVER_URL;// 登录返回的sessiondString mSessionID = TempData.getIns().getLoginData().sessionID;if (cameraInfo == null) {LogUtils.i(TAG, "getPlayUrl():: cameraInfo is null");return url;}if (streamType == 2) {// TODO 原有代码streamType传0VMSNetSDK.getInstance().getRealPlayURL(mAddress, mSessionID, cameraInfo.cameraID, streamType, mRealPlayURL);if (null == mRealPlayURL) {LogUtils.i(TAG, "getPlayUrl():: mRealPlayURL is null");return "";}// MAG地址url = mRealPlayURL.url2;LogUtils.i(TAG, "getPlayUrl():: url is " + url);} else {VMSNetSDK.getInstance().getRealPlayURL(mAddress, mSessionID, cameraInfo.cameraID, streamType, mRealPlayURL);if (null == mRealPlayURL) {LogUtils.i(TAG, "getPlayUrl():: mRealPlayURL is null");return "";}// mRealPlayURL.url1 是主码流还是子码流取决于 streamType,见上面注释url = mRealPlayURL.url1;LogUtils.i(TAG, "getPlayUrl():: url is " + url);}DeviceInfo deviceInfo = new DeviceInfo();boolean ret = VMSNetSDK.getInstance().getDeviceInfo(mAddress, mSessionID, cameraInfo.deviceID, deviceInfo);if (ret && deviceInfo != null) {mName = deviceInfo.userName;mPassword = deviceInfo.password;} else {LogUtils.i(TAG, "getPlayUrl():: deviceInfo is error");}return url;}

播放视频的代码没啥好讲的了, 注释写的比较清楚了,
啊如下是停止播放视频的代码:

    /*** 停止播放 void** @since V1.0*/private void stopLive() {if (null != mLiveControl) {mLiveControl.stop();hidePlayBtn(true);}}

到此,视频就集成完了, 如果顺利 播放就可以看到视频了。

海康8800实时视频Android客户端集成总结相关推荐

  1. uni-app 海康(HIKVISION)实时视频预览、录像回放、语音对讲

    uni-app 海康(HIKVISION)实时视频预览.录像回放.语音对讲:https://ext.dcloud.net.cn/plugin?id=2403

  2. 海康网络摄像头android,海康网络摄像头的Android端Demo

    [实例简介]海康网络摄像头的Android端Demo; 可实现通过wifi实时读取并显示摄像头捕捉的画面; [实例截图] [核心代码] /** * DemoActivity Class * @auth ...

  3. android客户端集成微信登录

    客户端集成微信登录 1.WXEntryActivity public class WXEntryActivity extends WeCareActivity implements IWXAPIEve ...

  4. Android客户端和Java服务器端集成支付宝

    移动端集成支付,似乎是每个App都可能面临的一件事.所有项目都在谈盈利模式,而从C端获取现金流是盈利中最重要的一个途径之一. 当前大家主要采用微信支付和阿里支付集成到自己的移动应用,虽然官方提供一些文 ...

  5. Qt音视频开发06-海康sdk内核linux客户端

    一.前言 海康sdk的示例在官方是提供了的,但是无论UI还是交互简直是宇宙无敌的垃圾,猜测应该是初学者编写的,估计练手用的,所以老早就想把这个linux支持集成到自己的示例中,既然已经支持了windo ...

  6. EasyStreamClient对接海康流媒体V4.X实现无插件播放流程记录

    之前有一位朋友找到我们寻求帮助,需要解决对接海康流媒体的问题,当时对接的是海康流媒体V4.X,因为平台只支持SDK方式对接,无法满足无插件播放的需求,后来经过与海康官方SDK联系后,取得了开发版SDK ...

  7. Android平台上集成海康SDK

    在项目中需要接入海康设备,因此我们集成了海康Android版本SDK.它分为Device Network SDK和Player SDK.前者用于设备连接.网络通信:后者用于解码.播放. 在APP中,关 ...

  8. Android平台上集成海康SDK(二)

    Android平台上集成海康SDK 以上是我之前写的一篇Android平台上集成海康SDK的文章,其中对于Android平台上集成海康SDK.基于海康SDK进行二次开发基本上进行了详细地介绍. 这篇文 ...

  9. 海康的android sdk,AndroidStudio 集成海康威視 Android SDK,集成螢石Android SDK。

    之前以為海康威視的android sdk 就是螢石的sdk,其實不是 海康威視的: 螢石的: 下面的是以前的:可以忽略 ++++++++++++++++++++++++++++++++++++++++ ...

最新文章

  1. OpenCV+python:图像梯度
  2. svn的安装以及post-commit实时更新网站
  3. CSS设置超出表格的内容用省略号显示
  4. HashMap+双向链表实现LRU
  5. 剖析Disruptor:为什么会这么快?(一)锁的缺点
  6. linux 之 getopt_long()
  7. 【渝粤教育】广东开放大学 财政学 形成性考核 (43)
  8. java bitset_Java BitSet clone()方法及示例
  9. mariadb10.2 mysql5.7_说说在MySQL5.7迁到MariaDB10.2时栽的一部分坑
  10. 【1】windows下IOS开发基础环境搭建
  11. php ci框架开发手册,CodeIgniter 教程 - php CodeIgniter 框架 - CodeIgniter手册
  12. JAVA 中一个非常轻量级只有 200k 左右的 RESTful 路由框架
  13. 283.判断二分图(力扣leetcode) 博主可答疑该问题
  14. linux版本的caj,同方知网文献阅读器CAJViewer for Linux版本安装说明
  15. 微信小程序支付---详解(python)
  16. 电脑的wifi天线原理_详解无线路由器天线的原理
  17. Python抓取网易云音乐热搜榜热评
  18. scrapy-selenium-谷歌浏览器爬取带有时效性cookies的网站
  19. nginx 域名重定向跳转至另一个域名
  20. 目标函数(object function),损失函数(loss function)以及代价函数(cost function)之间的关系与区别

热门文章

  1. Keras深度学习实战(37)——手写文字识别
  2. 基于产生式表示的动物识别系统
  3. Windows装逼操作
  4. 项目构建工具--webpack
  5. 大学计算机基础教程第10章数据通信技术基础
  6. 编程的宗派(OOP与FP孰优孰劣)--王垠
  7. 英雄之盾-第11届蓝桥杯Scratch省赛真题第4题
  8. OpenCV数字图像处理基于C++:灰度变换
  9. 2022山东国际养老服务业博览会,智慧养老产业展会
  10. WebGIS前端框架(openlayers,mapbox,leaflet)图形图像底层渲染原理分析