一、 开发环境
1、 操作系统:windows7(X64)
2、 开发工具:eclipse adt Build: v22.2.1-833290 JDK7 android SDK
3、 客户端设备版本:HUAWEI C8813 android 4.1.1
4、 监控设备型号:HIK/DS-8116HC-F/AF-DVR-II-B/16-16
5、 所需库文件(SDK):海康视频8116 播放库和网络库

二、 开发背景
目前的DVR所监控的视频只能在IE下实时预览,先应项目需要在移动平台进行实时预览

三、 环境搭建
1、 创建android工程在libs目录下导入开发项目所需要的依赖架包和库文件
2、 编写活动主页面
3、 编写主activity其中有一个广播接收器StartRenderingReceiver
4、 编写设备实体类
5、 编写视频播放核心类所有的状态-1 均表示未完成
6、 给项目赋权限

四、 相关说明
先介绍下为什麽要用两个sdk,海康威视android 网络库是用来与设备建立远程连接,音、视频解码,进行实时预览、回放等等功能的,但是它所得到的仅仅是二进制的音、视频数据而已,要真正的显示到手机界面上,还需要海康威视android 播放库sdk得支持,通过播放库sdk,才可以将视频显示到SurfaceView之上。流程如下图

核心代码如下:

public class HC_DVRManager {

private final static String TAG = "HC_DEBUG";
public final static String ACTION_START_RENDERING = "action_start_rendering";
public final static String ACTION_DVR_OUTLINE = "action_dvr_outline";
/*** 设备信息* 模拟通道数bychannum* 数字通道数byipchanum*/
private NET_DVR_DEVICEINFO_V30 deviceInfo_V30 = null;
/*** 登入标记 -1未登入,0已登入*/
private int m_iLogID = -1;/*** 播放标记 -1未播放,0正在播放*/
private int m_iPlayID = -1;
private int m_iPort = -1;
private String ip;
private int port;
private String username;
private String password;
private int channel;
private SurfaceHolder holder;
/*** 用于发广播的上下文*/
private Context context;private static HC_DVRManager manager = null;private HC_DVRManager() {
}public static synchronized HC_DVRManager getInstance() {if (manager == null) {manager = new HC_DVRManager();}return manager;
}/*** 设置播放设备信息* * @param bean*/
public void setDeviceBean(DeviceBean bean) {this.ip = bean.getIP();this.port = Integer.parseInt(bean.getPort());this.username = bean.getUserName();this.password = bean.getPassWord();this.channel = Integer.parseInt(bean.getChannel());
}/*** 设置播放视口* @param holder*/
public void setSurfaceHolder(SurfaceHolder holder) {this.holder = holder;
}/*** 用于发送广播的上下文* @param context*/
public void setContext(Context context) {this.context = context;
}public void initSDK() {if (m_iPlayID >= 0) {stopPlay();}if (HCNetSDK.getInstance().NET_DVR_Init()) {Log.i(TAG, "初始化SDK成功!");} else {Log.e(TAG, "初始化SDK失败!");}
}public void loginDevice() {deviceInfo_V30 = new NET_DVR_DEVICEINFO_V30();m_iLogID = HCNetSDK.getInstance().NET_DVR_Login_V30(ip, port, username, password, deviceInfo_V30);System.out.println("下面是设备信息************************");System.out.println("userId=" + m_iLogID);System.out.println("通道开始=" + deviceInfo_V30.byStartChan);System.out.println("通道个数=" + deviceInfo_V30.byChanNum);System.out.println("设备类型=" + deviceInfo_V30.byDVRType);System.out.println("ip通道个数=" + deviceInfo_V30.byIPChanNum);if (m_iLogID < 0) {Log.e(TAG, "登入设备失败!" + getErrorMsg(HCNetSDK.getInstance().NET_DVR_GetLastError()));} else {Log.i(TAG, "登入设备成功!");}
}public synchronized void realPlay() {try {if (m_iLogID < 0) {Log.e(TAG, "尝试重新登入");int count = 0;while (count < 10) {Log.i(TAG, "正在第" + (count + 1) + "次重新登入");loginDevice();if (m_iLogID < 0) {count++;Thread.sleep(200);} else {Log.i(TAG, "第" + (count + 1) + "次登入成功");break;}}if (m_iLogID < 0) {Log.e(TAG, "尝试登入" + count + "次均失败!");return;}}if (m_iPlayID < 0) {//预览参数配置NET_DVR_CLIENTINFO ClientInfo = new NET_DVR_CLIENTINFO();ClientInfo.lChannel = channel + deviceInfo_V30.byStartChan;ClientInfo.lLinkMode = 0;// 多播地址,需要多播预览时配置 ClientInfo.sMultiCastIP = null;m_iPlayID = HCNetSDK.getInstance().NET_DVR_RealPlay_V30(m_iLogID, ClientInfo, getRealPlayerCallBack(), true);if (m_iPlayID < 0) {Log.e(TAG, "实时播放失败!" + getErrorMsg(HCNetSDK.getInstance().NET_DVR_GetLastError()));if (HCNetSDK.getInstance().NET_DVR_GetLastError() == 416) {//发送广播context.sendBroadcast(new Intent(ACTION_DVR_OUTLINE));}return;} else {Log.i(TAG, "开始实时播放!");}} else {Log.d(TAG, "正在播放中?");}} catch (Exception e) {Log.e(TAG, "异常:" + e.toString());}
}/*** 获取实时播放回调* * @return*/
private RealPlayCallBack getRealPlayerCallBack() {return new RealPlayCallBack() {/*** iRealHandle 当前的预览句柄* iDataType 数据类型* pDataBuffer 存放数据的缓冲区指针* iDataSize 缓冲区大小*/@Overridepublic void fRealDataCallBack(int iRealHandle, int iDataType, byte[] pDataBuffer, int iDataSize) {processRealData(iDataType, pDataBuffer, iDataSize, Player.STREAM_REALTIME);}};
}/*** 停止播放*/
public synchronized void stopPlay() {if (m_iPlayID < 0) {Log.d(TAG, "已经停止?");return;}// 停止网络播放if (HCNetSDK.getInstance().NET_DVR_StopRealPlay(m_iPlayID)) {Log.i(TAG, "停止实时播放成功!");} else {Log.e(TAG, "停止实时播放失败!" + getErrorMsg(HCNetSDK.getInstance().NET_DVR_GetLastError()));return;}// 停止本地播放if (Player.getInstance().stop(m_iPort)) {Log.i(TAG, "停止本地播放成功!");} else {Log.e(TAG, "停止本地播放失败!");return;}// 关闭视频流if (Player.getInstance().closeStream(m_iPort)) {Log.i(TAG, "关闭视频流成功!");} else {Log.e(TAG, "关闭视频流失败!");return;}// 释放播放端口if (Player.getInstance().freePort(m_iPort)) {Log.i(TAG, "释放播放端口成功!");} else {Log.e(TAG, "释放播放端口失败!");return;}// 播放端口复位m_iPort = -1;// 正在播放标记复位m_iPlayID = -1;Log.i(TAG, "停止播放成功!");
}/*** 登出设备*/
public void logoutDevice() {if (HCNetSDK.getInstance().NET_DVR_Logout_V30(m_iLogID)) {m_iLogID = -1;Log.i(TAG, "登出设备成功!");} else {m_iLogID = 0;Log.e(TAG, "登出设备失败!" + getErrorMsg(HCNetSDK.getInstance().NET_DVR_GetLastError()));}
}/*** 释放海康SDK*/
public void freeSDK() {// 清理缓存if (HCNetSDK.getInstance().NET_DVR_Cleanup()) {Log.i(TAG, "释放SDK资源成功!");} else {Log.e(TAG, "释放SDK资源失败!");}
}/*** 视频流解码* * @param iDataType* @param pDataBuffer* @param iDataSize* @param iStreamMode*/
private void processRealData(int iDataType, byte[] pDataBuffer, int iDataSize, int iStreamMode) {int i = 0;try {switch (iDataType) {case HCNetSDK.NET_DVR_SYSHEAD:Log.d(TAG, "处理头数据");if (m_iPort >= 0) {break;}m_iPort = Player.getInstance().getPort();if (m_iPort == -1) {Log.e(TAG, "获取播放端口失败!");break;} else {Log.i(TAG, "获取播放端口成功!");}if (iDataSize > 0) {if (Player.getInstance().setStreamOpenMode(m_iPort, iStreamMode)) {Log.i(TAG, "设置视频流成功!");} else {Log.e(TAG, "设置视频流失败!");break;}//抓图回调函数PlayerDisplayCB displayCB = new PlayerDisplayCB() {@Overridepublic void onDisplay(int arg0, ByteBuffer arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) {if (null != context) {context.sendBroadcast(new Intent(ACTION_START_RENDERING));} else {Log.e(TAG, "Context为空!没有setContext(Context context)?");}Log.d(TAG, "开始画面渲染");if (Player.getInstance().setDisplayCB(m_iPort, null)) {Log.i(TAG, "移除显示回调成功!");} else {Log.e(TAG, "移除显示回调失败!");}}};if (Player.getInstance().setDisplayCB(m_iPort, displayCB)) {Log.i(TAG, "设置显示回调成功!");} else {Log.e(TAG, "设置显示回调失败!");break;}if (Player.getInstance().setDisplayBuf(m_iPort, 10)) { // 帧率,不设置为默认15Log.i(TAG, "设置播放缓冲区最大缓冲帧数成功!");} else {Log.e(TAG, "设置播放缓冲区最大缓冲帧数失败!");break;}if (Player.getInstance().openStream(m_iPort, pDataBuffer, iDataSize, 2 * 1024 * 1024)) {Log.i(TAG, "打开视频流成功!");} else {Log.e(TAG, "打开视频流失败!");break;}if (Player.getInstance().play(m_iPort, holder)) {Log.i(TAG, "本地播放成功!");} else {Log.e(TAG, "本地播放失败!");break;}} else {Log.e(TAG, "视频流无数据!");}break;case HCNetSDK.NET_DVR_STREAMDATA:case HCNetSDK.NET_DVR_STD_AUDIODATA:case HCNetSDK.NET_DVR_STD_VIDEODATA:// Log.i(TAG, "处理流数据");if (iDataSize > 0 && m_iPort != -1) {for (i = 0; i < 400; i++) {if (Player.getInstance().inputData(m_iPort, pDataBuffer, iDataSize)) {Log.i(TAG, "输入数据成功!");break;}Thread.sleep(10);}if (i == 400) {Log.e(TAG, "输入数据失败!");}}break;default:break;}} catch (Exception e) {Log.e(TAG, "视频流解码异常!" + e.toString());}
}

Android端海康监控视频调用-实例相关推荐

  1. 海康摄像头视频调用出错,Jni Error(app bug): accessed stale local reference解决办法

    项目中要在Android手机中调用海康摄像头拍摄的画面,在公司网管配置好了网络地址(不要与其他局域网内地址冲突)和端口,并激活摄像头设备后,通过SADPTool(海康提供的摄像头搜索工具)可以自动检索 ...

  2. 海康监控视频无插件开发3.2版本运行demo

    一.海康摄像头跑通web开发的demo注意点 1.首先下载官网的web3.2无插件开发包 1.官网下载 随便注册后登录下载 2.积分下载 2.想要运行demo先要实现在浏览器输入摄像头ip后能够实现预 ...

  3. android系统 视频流录像,Android端海康视频取流,可以实时预览与查看历史录像

    android仿探探卡片滑动 android仿探探卡片滑动public class TanTanCallback extends RenRenCallback { private static fin ...

  4. 海康摄像头视频实时监控

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 海康摄像 ...

  5. 海康三维视频融合监控软件系统免费版,支持移动侦测告警

               海康三维视频融合监控软件系统免费版,支持移动侦测告警 一.古老的声音预警 千百年来,人们有养狗看家护院的习惯,并一直延续至今天. 当主人家门口或附近有陌生人的时候,狗会觉察到,开 ...

  6. 海康监控平台监控“视频巡逻”做投屏监控器

    海康监控平台监控"视频巡逻"做投屏监控器 平台版本: 把投屏电脑信号拖动到监控窗口上,可以随时监视电脑投屏信号工作情况,也可以提前看电脑投屏信号画面调整内容演示.注意提前把电脑信号 ...

  7. 使用vue二次开发海康监控H5视频播放

    使用vue二次开发海康监控H5视频播放 西瓜播放器示例demo 阿里云的示例demo 使用海康的H5视频开发包, 海康的api 页面中的使用 第一步 第二步 第三步 第四步 切记 bug 由于公司项目 ...

  8. 海康监控虚拟服务器设置,海康监控如何连接网络设置教程

    海康监控如何连接网络设置教程 [2021-02-14 17:49:08]  简介: 建站服务器 这篇文章给大家分享的是有关通过ECS自带监控服务和云监控服务监控实例的方法的内容.小编觉得挺实用的,因此 ...

  9. 利用flask解析海康摄像头视频

    利用flask解析海康摄像头视频 利用flask解析海康摄像头和大华摄像头的视频 一.安装依赖包 二.获取海康摄像头视频流 三.将视频流输出到Web页面 四. 创建HTML模板文件 利用flask解析 ...

最新文章

  1. python3 django配置数据库(mysql)
  2. android 辅助服务 简书,Android AccessibilityService使用
  3. Arduino IDE 如何添加 ESP32 开发板?
  4. 折叠屏来了,开发者们准备好了吗?
  5. python第二十八课——编码小常识
  6. Spring容器创建流程(3)对beanFactory设置
  7. 【中秋快乐】求问meta-learning和few-shot learning的关系是什么?
  8. Spring 与 SpringMVC 容器父子关系引出的相应问题
  9. 基于boost库的搜索引擎项目
  10. html仿qq截图,javascript实现粘贴qq截图功能(clipboardData)
  11. c语言读取三菱plc数据,使用用三菱小软件读取三菱PLC数据的方法
  12. 图片和文本置顶显示的方法
  13. 手机普通浏览器唤起微信打开网页url
  14. win7开机卡在正在启动_电脑重装了系统,却卡在图标截面
  15. 洛谷八连测——关于取模与思维僵化
  16. 贝拉博客,一个屌丝网站
  17. 安装打印机后默认不是中文的原因及解决方法
  18. 业务域名文件如何上传服务器,服务器已备案可以添加域名吗
  19. 【计算机视觉】图像分割中FCN、DeepLab、SegNet、U-Net、Mask R-CNN等算法的讲解(图文解释 超详细)
  20. 动物眼睛:百万年进化而成 各适所需

热门文章

  1. Python恶搞代码
  2. 邮件发送中Virtual domains 和 Local domains 的概念
  3. APP移动应用安全加固是如何进行的?
  4. Robomaster2020学习(一)——电机选型
  5. dw网页插入java小程序_DW网页设计100例35:构建Java插入模块
  6. “IP+空格+域名”方式解决外国网站访问慢问题
  7. mui h5+文档最详版
  8. 第二节:配置django环境!
  9. Jenkins 忘记登录密码解决办法
  10. java 输入输出总结(牛客、笔试、机试)