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

这篇文章,在之前的基础上我对代码进行了优化和封装,我们来看,

/*** Created by Administrator on 2017/3/1.* 封装的大华播放库*/
public class PlayerDahua {private static final String TAG = "Dahua";private DeviceDisConnect disConnect = new DeviceDisConnect();  //网络断线处理,实现网络断线处理接口private NET_PARAM stNetParam = new NET_PARAM();  //设备登入时的相关参数private DeviceReConnect reConnect = new DeviceReConnect();  //设备连接恢复,实现设备连接恢复接口private DeviceSubDisConnect subDisConnect = new DeviceSubDisConnect();  //动态子连接断开处理,实现动态子连接断开处理接口private Test_CB_fMessageCallBack test_cb_fMessageCallBack = new Test_CB_fMessageCallBack();  //消息回调处理,实现消息回调接口private NET_DEVICEINFO deviceInfo = new NET_DEVICEINFO();  //设备信息private Integer error = new Integer(0);private int mPort;private long mLogId;private long mPlayId;private long mPlaybackId;private SurfaceView surfaceView;private Handler handler;static FileOutputStream m_Fout;public PlayerDahua(SurfaceView surfaceView, Handler handler) {this.surfaceView = surfaceView;this.handler = handler;}/*** 登录设备* @param ip* @param port* @param username* @param password*/private void login(String ip, int port, String username, String password) {INetSDK.LoadLibrarys();  //加载动态库INetSDK.Init(disConnect);  //初始化大华的NetSDKINetSDK.SetConnectTime(4000, 2);  //设置连接超时时间为4秒,重连次数为2次stNetParam.nWaittime = 10000;  //设置等待超时时间为10秒stNetParam.nSearchRecordTime = 10000;  //设置按时间查询录像文件的超时时间为10秒INetSDK.SetNetworkParam(stNetParam);  //设置网络环境INetSDK.SetAutoReconnect(reConnect);  //设置断线重连INetSDK.SetSubconnCallBack(subDisConnect);  //设置动态子连接断线回调INetSDK.SetDVRMessCallBack(test_cb_fMessageCallBack);  //设置消息回调mLogId = INetSDK.LoginEx(ip, port, username, password, 20, null, deviceInfo, error);  //调用设备登录接口if (mLogId == 0) {  //登录失败LogUtils.e(TAG, "登录失败,错误码:" + INetSDK.GetLastError());messageFeedback("连接设备失败");}}/*** 实时预览* @param ip* @param port* @param userName* @param password* @param streamType* @param channelNo*/public void live(String ip, int port, String userName, String password, int streamType, int channelNo) {if (mLogId == 0) {  //未登录设备,先登录设备login(ip, port, userName, password);}if (mLogId != 0) {  //已经登录设备,下一步:实时预览mPlayId = INetSDK.RealPlayEx(mLogId, channelNo, streamType);  //调用实时预览接口if (mPlayId == 0) {LogUtils.e(TAG, "实时预览失败,错误码:" + INetSDK.GetLastError());messageFeedback("实时预览失败");} else {mPort = IPlaySDK.PLAYGetFreePort();boolean bOpenRet = IPlaySDK.PLAYOpenStream(mPort, null, 0, 1024 * 1024 * 2) == 0 ? false : true;if (bOpenRet) {boolean bPlayRet = IPlaySDK.PLAYPlay(mPort, surfaceView) == 0 ? false : true;if (bPlayRet) {IPlaySDK.PLAYPlaySoundShare(mPort);TestRealDataCallBackEx m_callbac = new TestRealDataCallBackEx(mPort);TestVideoDataCallBack m_VideoCallback = new TestVideoDataCallBack(m_Fout);INetSDK.SetRealDataCallBackEx(mPlayId, m_callbac, 1);messageFeedback(null);} else {IPlaySDK.PLAYCloseStream(mPort);LogUtils.e(TAG, "实时预览失败,调用IPlaySDK.PLAYPlay接口失败");messageFeedback("实时预览失败");}} else {LogUtils.e(TAG, "实时预览失败,调用IPlaySDK.PLAYOpenStream接口失败");messageFeedback("实时预览失败");}}}}/*** 远程回放* @param ip* @param port* @param userName* @param password* @param channelNo* @param beginYear* @param beginMonth* @param beginDay* @param beginHour* @param beginMinute* @param beginSecond* @param endYear* @param endMonth* @param endDay* @param endHour* @param endMinute* @param endSecond* @param quality*/public void playback(String ip, int port, String userName, String password, int channelNo,int beginYear, int beginMonth, int beginDay, int beginHour, int beginMinute, int beginSecond,int endYear, int endMonth, int endDay, int endHour, int endMinute, int endSecond,int quality) {if (mLogId == 0) {  //未登录设备,先登录设备login(ip, port, userName, password);}if (mLogId != 0) {  //已经登录设备,下一步:远程回放NET_TIME beginTime = new NET_TIME();NET_TIME endTime = new NET_TIME();beginTime.dwYear = beginYear;beginTime.dwMonth = beginMonth;beginTime.dwDay = beginDay;beginTime.dwHour = beginHour;beginTime.dwMinute = beginMinute;beginTime.dwSecond = beginSecond;endTime.dwYear = endYear;endTime.dwMonth = endMonth;endTime.dwDay = endDay;endTime.dwHour = endHour;endTime.dwMinute = endMinute;endTime.dwSecond = endSecond;INetSDK.SetDeviceMode(mLogId, EM_USEDEV_MODE.SDK_RECORD_STREAM_TYPE, quality);TestfDataCallBack m_callback = new TestfDataCallBack();TestDownLoadPosCallBack posUser = new TestDownLoadPosCallBack();mPlaybackId = INetSDK.PlayBackByTimeEx(mLogId, channelNo, beginTime, endTime, posUser, m_callback);  //调用远程回放接口if (mPlaybackId != 0) {IPlaySDK.PLAYSetPlayedTimeEx(mPort, 0);IPlaySDK.PLAYResetBuffer(mPort, 1);  //清码流分析库IPlaySDK.PLAYResetBuffer(mPort, 3);  //清播放队列boolean bOpenRet = IPlaySDK.PLAYOpenStream(mPort, null, 0, 1024 * 1024 * 2) == 0 ? false : true;IPlaySDK.PLAYSetStreamOpenMode(mPort, Constants.STREAME_FILE);if (bOpenRet) {boolean bPlayRet = IPlaySDK.PLAYPlay(mPort, surfaceView) == 0 ? false : true;if (bPlayRet) {IPlaySDK.PLAYPlaySoundShare(mPort);messageFeedback(null);} else {IPlaySDK.PLAYCloseStream(mPort);LogUtils.e(TAG, "远程回放失败,调用IPlaySDK.PLAYPlay接口失败");messageFeedback("远程回放失败");}} else {LogUtils.e(TAG, "远程回放失败,调用IPlaySDK.PLAYOpenStream接口失败");messageFeedback("远程回放失败");}} else {LogUtils.e(TAG, "远程回放失败,错误码:" + INetSDK.GetLastError());messageFeedback("远程回放失败");}}}/*** 获取录像段文件* @param ip* @param port* @param userName* @param password* @param channelNo* @param beginYear* @param beginMonth* @param beginDay* @param beginHour* @param beginMinute* @param beginSecond* @param endYear* @param endMonth* @param endDay* @param endHour* @param endMinute* @param endSecond* @return*/public List<NET_RECORDFILE_INFO> getRecordFile(String ip, int port, String userName, String password, int channelNo,int beginYear, int beginMonth, int beginDay, int beginHour, int beginMinute, int beginSecond,int endYear, int endMonth, int endDay, int endHour, int endMinute, int endSecond) {List<NET_RECORDFILE_INFO> recordList = new ArrayList<NET_RECORDFILE_INFO>();if (mLogId == 0) {  //未登录设备,先登录设备login(ip, port, userName, password);}if (mLogId != 0) {NET_TIME beginTime = new NET_TIME();NET_TIME endTime = new NET_TIME();beginTime.dwYear = beginYear;beginTime.dwMonth = beginMonth;beginTime.dwDay = beginDay;beginTime.dwHour = beginHour;beginTime.dwMinute = beginMinute;beginTime.dwSecond = beginSecond;endTime.dwYear = endYear;endTime.dwMonth = endMonth;endTime.dwDay = endDay;endTime.dwHour = endHour;endTime.dwMinute = endMinute;endTime.dwSecond = endSecond;NET_RECORDFILE_INFO[] m_stFileInfo = new NET_RECORDFILE_INFO[100];for (int i = 0; i < m_stFileInfo.length; i++) {m_stFileInfo[i] = new NET_RECORDFILE_INFO();}Integer nFileCount = new Integer(0);boolean bRetQ = INetSDK.QueryRecordFile(mLogId, channelNo, 0, beginTime, endTime, "", m_stFileInfo, nFileCount, 10000, false);if (bRetQ && nFileCount > 0) {for (int i = 0; i < nFileCount; i++) {recordList.add(m_stFileInfo[i]);}}}return recordList;}/*** 停止实时预览*/public void stopLive() {if (mPlayId != 0) {IPlaySDK.PLAYStop(mPort);IPlaySDK.PLAYStopSoundShare(mPort);IPlaySDK.PLAYStopSound();IPlaySDK.PLAYCloseStream(mPort);INetSDK.StopRealPlayEx(mPlayId);mPlayId = 0;LogUtils.i(TAG, "停止实时预览成功");}}/*** 停止远程回放*/public void stopPlayBack() {if (mPlaybackId != 0) {IPlaySDK.PLAYStop(mPort);IPlaySDK.PLAYStopSoundShare(mPort);IPlaySDK.PLAYStopSound();IPlaySDK.PLAYCloseStream(mPort);INetSDK.StopPlayBack(mPlaybackId);mPlaybackId = 0;LogUtils.i(TAG, "停止远程回放成功");}}/*** 登出设备*/public void logout() {if (mLogId != 0) {if (INetSDK.Logout(mLogId)) {mLogId = 0;LogUtils.i(TAG, "登出设备成功");} else {LogUtils.e(TAG, "登出设备失败,错误码:" + INetSDK.GetLastError());}}}/*** 抓图* @param path* @return*/public boolean capturePicture(String path) {if (mPort != 0) {if (IPlaySDK.PLAYCatchPicEx(mPort, path, Constants.PicFormat_BMP) != 0) {return true;} else {return false;}} else {return false;}}/*** 暂停/播放* @param status  1---暂停;0---播放*/public void pauseOrPlay(short status) {IPlaySDK.PLAYPause(mPort, status);}public class DeviceDisConnect implements CB_fDisConnect {@Overridepublic void invoke(long lLoginID, String pchDVRIP, int nDVRPort) {return;}}public class DeviceReConnect implements CB_fHaveReConnect {@Overridepublic void invoke(long lLoginID, String pchDVRIP, int nDVRPort) {}}public class DeviceSubDisConnect implements CB_fSubDisConnect {@Overridepublic void invoke(int emInterfaceType, boolean bOnline, long lOperateHandle, long lLoginID) {}}public class Test_CB_fMessageCallBack implements CB_fMessageCallBack {@Overridepublic boolean invoke(int lCommand, long lLoginID, Object obj, String pchDVRIP, int nDVRPort) {if (12295 == lCommand) {DEV_PLAY_RESULT stResult = (DEV_PLAY_RESULT) obj;}return true;}}public class TestRealDataCallBackEx implements CB_fRealDataCallBackEx {public int port;public TestRealDataCallBackEx(int port) {this.port = port;}/*** 网络断线回调函数* @param lRealHandle 实时监视ID* @param dwDataType  回调出来的数据类型* @param pBuffer     回调数据,根据数据类型的不同每次回调不同的长度的数据,除类型0,其他数据类型都是按帧,每次回调一帧数据* @param dwBufSize   回调数据参数结构体,根据不同的类型,参数结构也不一致* @param param       回调数据的长度,根据不同的类型,长度也不同(单位字节)*/@Overridepublic void invoke(long lRealHandle, int dwDataType, byte[] pBuffer, int dwBufSize, int param) {if (dwDataType == 0) {IPlaySDK.PLAYInputData(port, pBuffer, pBuffer.length);}}}public class TestVideoDataCallBack implements IPlaySDKCallBack.fDemuxCBFun {public FileOutputStream outputStream;public TestVideoDataCallBack(FileOutputStream outputStream) {this.outputStream = outputStream;}@Overridepublic void invoke(int nPort, byte[] pOrgBuffer, int nOrgLen, byte[] pBuffer, int nLen,IPlaySDKCallBack.DEMUX_INFO stInfo, long dwUser) {try {if (null != outputStream) {outputStream.write(pBuffer);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public class TestfDataCallBack implements CB_fDataCallBack {@Overridepublic int invoke(long lPlaybackHandle, int dwDataType, byte buffer[], int dwBufferSize) {if (0 == dwDataType) {return IPlaySDK.PLAYInputData(mPort, buffer, buffer.length);} else if (dwDataType == 2) {//m_PlayView.drawColor(pBuffer);} else if (dwDataType == 3) {//m_PlayView.drawColor(pBuffer);}return 0;}}public class TestDownLoadPosCallBack implements CB_fDownLoadPosCallBack {@Overridepublic void invoke(long lPlayHandle, int dwTotalSize, int dwDownLoadSize) {LogUtils.i(TAG, "playback total size:" + dwTotalSize);if (-1 == dwDownLoadSize) {//m_sbPbByTime.setProgress(dwTotalSize);new Thread(new Runnable() {@Overridepublic void run() {if (0 != mPlaybackId) {stopPlayBack();}}}).start();} else {//m_sbPbByTime.setProgress(dwDownLoadSize);}}}private void messageFeedback(String msg) {Message message = Message.obtain();message.obj = msg;handler.sendMessage(message);}
}

这个类是已经封装好的可以直接拿去用的。

Android平台上集成大华SDK(二)相关推荐

  1. Android平台上集成大华SDK

    在项目中需要接入大华设备,因此我们集成了大华Android版本SDK.与海康SDK类似,它也是分为NetSDK和PlaySDK. 前者用于设备连接.网络通信:后者用于解码.播放. 在APP中,关于大华 ...

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

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

  3. Android平台上集成海康SDK

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

  4. Android平台上集成萤石SDK

    这篇文章,就Android平台上如何集成萤石SDK进行讲解. 前言: 萤石是海康威视集团旗下的一家做视频云的公司.我们接入萤石设备,实现实时预览.远程回放.抓图.切换画质等功能. 关于具体如何接入,包 ...

  5. Android平台上集成乐橙SDK

    这篇文章,就Android平台上如何集成乐橙SDK进行讲解. 前言: 乐橙是浙江大华技术股份有限公司旗下的一家专注视频智能硬件,视频云和视频智能技术,为视频应用提供云视频能力的服务商. 我们接入乐橙设 ...

  6. 大华SDK二次开发,JAVA

    最近对接大华接口要控制摄像头的旋转,SDK源码中注释比较少也没有详细的技术文档,自己研究下写了这个帮助类可以实现摄像头8个方向的控制,首先需要引入netsdk的jar包,直接上源码: public c ...

  7. 基于大华SDK的二次开发,用于网络摄像头图像的实时显示和捕获(附源码)

    目录 1. 文章背景 2. 主要模块 2.1 初始化SDK 2.2 登录账号 2.3 捕获图片 2.4 实时显示 2.5 断开时释放 2.6 回调函数 3. 源代码 3.1 头文件 3.2 源文件 1 ...

  8. 大华SDK+JAVA+4g网络摄像头进行二次开发

    前言 监控,相信大家都不陌生.现在的监控技术发展迅速,国内以海康威视为首的智能视频监控提供商也层出不穷.现在,这些提供商都已经提供了相应的SDK以及API接口,能够很好的支撑我们进行摄像机的二次开发工 ...

  9. 大华sdk转springboot项目 (刷卡、刷人脸、刷二维码、刷身份证)

    最近公司有个项目需要对接设备扫粤康码! 管理层选择了大华, 拿回来了大华的1台设备给我调试, 因健康码不允许转发 大华那边无法帮我处理, 所以只能申请数字平台后自己对接, 目前我这边的业务流程是: 二 ...

最新文章

  1. centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录)[连载之电子商务系统架构]...
  2. curl get post 示例
  3. Infragistics NetAdvantage控件的使用:该关系不是此 DataView 指向的表的父关系
  4. Docker与虚拟机
  5. 关于iOS中MVC和MVVM的区别和联系
  6. JAVA面向对象初步知识总结:封装、继承、多态
  7. HDU1976 Software Version【水题】
  8. java 算法比较,java几种面消隐算法的比较
  9. Client-Side UI Automation Provider - WinForm Sample
  10. uva297(quadtree)
  11. C/C++ QT图形开发高级组件 [空]
  12. android 校验手机号码,检查Android中的有效手机号码
  13. 龙果学院mysql分布式集群代码_MySQL分布式集群搭建
  14. 【Tableau server日常维护9.0】window server2016 Tableau server保姆教学安装
  15. mysql 1006_MySQL: 1006 - Can't create database '***' (errno: 13) 错误 解决方法
  16. C#一个解决方案创建多个项目
  17. 中国特殊灯具行业市场供需与战略研究报告
  18. 新农具时代,拼多多的进击与本分
  19. 现金流动负债比率 和 ROE详解
  20. ICPR 2018 MTWI挑战赛开启 开放首个网络图片数据集

热门文章

  1. 计算机中的二进制除法
  2. [Linux Audio Driver] 高通TDM总线配置
  3. RZ、NRZ、NRZ1、曼彻斯特编码
  4. 获取本周的开始时间、结束时间、当前日期
  5. Adversarial disentanglement spectrum variations and cross-modality attention networks阅读笔记
  6. Edge浏览器复制地址栏地址变为文字超链接的解决办法
  7. 三、LLC 谐振变换器
  8. 怎么把文件从计算机移到桌面上,解决桌面文件撑死C盘,教你如何把桌面从C盘挪到D盘...
  9. 传输介质:同轴电缆、双绞线和光纤
  10. python--笨方法学python 习题52