Android端海康监控视频调用-实例
一、 开发环境
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端海康监控视频调用-实例相关推荐
- 海康摄像头视频调用出错,Jni Error(app bug): accessed stale local reference解决办法
项目中要在Android手机中调用海康摄像头拍摄的画面,在公司网管配置好了网络地址(不要与其他局域网内地址冲突)和端口,并激活摄像头设备后,通过SADPTool(海康提供的摄像头搜索工具)可以自动检索 ...
- 海康监控视频无插件开发3.2版本运行demo
一.海康摄像头跑通web开发的demo注意点 1.首先下载官网的web3.2无插件开发包 1.官网下载 随便注册后登录下载 2.积分下载 2.想要运行demo先要实现在浏览器输入摄像头ip后能够实现预 ...
- android系统 视频流录像,Android端海康视频取流,可以实时预览与查看历史录像
android仿探探卡片滑动 android仿探探卡片滑动public class TanTanCallback extends RenRenCallback { private static fin ...
- 海康摄像头视频实时监控
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 海康摄像 ...
- 海康三维视频融合监控软件系统免费版,支持移动侦测告警
海康三维视频融合监控软件系统免费版,支持移动侦测告警 一.古老的声音预警 千百年来,人们有养狗看家护院的习惯,并一直延续至今天. 当主人家门口或附近有陌生人的时候,狗会觉察到,开 ...
- 海康监控平台监控“视频巡逻”做投屏监控器
海康监控平台监控"视频巡逻"做投屏监控器 平台版本: 把投屏电脑信号拖动到监控窗口上,可以随时监视电脑投屏信号工作情况,也可以提前看电脑投屏信号画面调整内容演示.注意提前把电脑信号 ...
- 使用vue二次开发海康监控H5视频播放
使用vue二次开发海康监控H5视频播放 西瓜播放器示例demo 阿里云的示例demo 使用海康的H5视频开发包, 海康的api 页面中的使用 第一步 第二步 第三步 第四步 切记 bug 由于公司项目 ...
- 海康监控虚拟服务器设置,海康监控如何连接网络设置教程
海康监控如何连接网络设置教程 [2021-02-14 17:49:08] 简介: 建站服务器 这篇文章给大家分享的是有关通过ECS自带监控服务和云监控服务监控实例的方法的内容.小编觉得挺实用的,因此 ...
- 利用flask解析海康摄像头视频
利用flask解析海康摄像头视频 利用flask解析海康摄像头和大华摄像头的视频 一.安装依赖包 二.获取海康摄像头视频流 三.将视频流输出到Web页面 四. 创建HTML模板文件 利用flask解析 ...
最新文章
- python3 django配置数据库(mysql)
- android 辅助服务 简书,Android AccessibilityService使用
- Arduino IDE 如何添加 ESP32 开发板?
- 折叠屏来了,开发者们准备好了吗?
- python第二十八课——编码小常识
- Spring容器创建流程(3)对beanFactory设置
- 【中秋快乐】求问meta-learning和few-shot learning的关系是什么?
- Spring 与 SpringMVC 容器父子关系引出的相应问题
- 基于boost库的搜索引擎项目
- html仿qq截图,javascript实现粘贴qq截图功能(clipboardData)
- c语言读取三菱plc数据,使用用三菱小软件读取三菱PLC数据的方法
- 图片和文本置顶显示的方法
- 手机普通浏览器唤起微信打开网页url
- win7开机卡在正在启动_电脑重装了系统,却卡在图标截面
- 洛谷八连测——关于取模与思维僵化
- 贝拉博客,一个屌丝网站
- 安装打印机后默认不是中文的原因及解决方法
- 业务域名文件如何上传服务器,服务器已备案可以添加域名吗
- 【计算机视觉】图像分割中FCN、DeepLab、SegNet、U-Net、Mask R-CNN等算法的讲解(图文解释 超详细)
- 动物眼睛:百万年进化而成 各适所需