前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。
对人工智能感兴趣或者想了解的小伙伴,可以点击跳转到网站一起学习哟。
https://www.captainai.net/xxf

项目背景

项目中用到了海康威视的摄像机视频服务器。项目要求,要将海康威视的摄像视频同步按时间至我们自己的服务器,并且在项目中记录文件信息。

项目环境

  • SpringBoot + JDK1.8
  • 海康威视设备型号:DS-7608N-K2/8P

引入SDK

首先在海康卫视下载对应的SDK包。

官网下载地址:https://www.hikvision.com/cn/download_61.html

解压下载的SDK文件,如下图:

  • Demo示例:其中有java的一个demo,大家也可以参考一下
  • 开发文档:包含了海康威视不同设备的SDK对接文档
  • 库文件:需要部分dll文件引用,通过dll文件去调用海康威视的服务器,需要的文件下文详细介绍

打开我们的SpringBoot项目

  • 首先将demo示例中java例子的HCNetSDK.java文件拷贝至我们项目,项目位置没有特殊要求。

  • 然后将库文件中的HCNetSDKCom文件夹及下面的所有文件、AudioRender.dll、HCCore.dll、HCNetSDK.dll、PlayCtrl.dll、SuperRender.dll文件放置指定的文件夹

  • 修改HCNetSDK.java文件的HCNetSDK加载dll文件的位置。如下:D:\HKSDK\HCNetSDK为dll文件存放的位置。

 HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("D:\\HKSDK\\HCNetSDK", HCNetSDK.class);
  • pom文件引入SDK二次开发所需要的jar包。jar包均手动引入,不是通过maven网上下载。官方示例中的javaDemo中有相应的jar包。
<dependency><groupId>net.java.jna</groupId><artifactId>jna</artifactId><version>1.0.0</version>
</dependency>
<dependency><groupId>net.java.jna</groupId><artifactId>examples</artifactId><version>1.0.0</version>
</dependency>

编写程序代码

import com.sun.jna.NativeLong;
import com.sun.jna.ptr.IntByReference;
import com.urgentlogistic.util.HCNetSDK;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;/*** @author ZhangFZ* @date 2020/4/20 20:23**/
public class VideoDowload {private static Logger logger = LoggerFactory.getLogger(VideoDowload.class);private static HCNetSDK hcNetSDK = HCNetSDK.INSTANCE;private NativeLong userId;//用户句柄private NativeLong loadHandle;//下载句柄private Timer downloadTimer;/*** 按时间下载视频*/private boolean downloadVideo(Dvr dvr, Date startTime, Date endTime, String filePath, int channel) {boolean initFlag = hcNetSDK.NET_DVR_Init();if (!initFlag) { //返回值为布尔值 fasle初始化失败logger.warn("hksdk(视频)-海康sdk初始化失败!");return false;}HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();userId = hcNetSDK.NET_DVR_Login_V30(dvr.getDvrip(), (short) dvr.getDvrport(), dvr.getDvrusername(), dvr.getDvrpassword(), deviceInfo);logger.info("hksdk(视频)-登录海康录像机信息,状态值:" + hcNetSDK.NET_DVR_GetLastError());long lUserId = userId.longValue();if (lUserId == -1) {logger.warn("hksdk(视频)-海康sdk登录失败!");return false;}loadHandle = new NativeLong(-1);if (loadHandle.intValue() == -1) {loadHandle = hcNetSDK.NET_DVR_GetFileByTime(userId, new NativeLong(channel), getHkTime(startTime), getHkTime(endTime), filePath);logger.info("hksdk(视频)-获取播放句柄信息,状态值:" + hcNetSDK.NET_DVR_GetLastError());if (loadHandle.intValue() >= 0) {// 判断文件夹是否存在File files = new File(filePath);if(!files.exists()){files.mkdirs();}boolean downloadFlag = hcNetSDK.NET_DVR_PlayBackControl(loadHandle, hcNetSDK.NET_DVR_PLAYSTART, 0, null);int tmp = -1;IntByReference pos = new IntByReference();while (true) {boolean backFlag = hcNetSDK.NET_DVR_PlayBackControl(loadHandle, hcNetSDK.NET_DVR_PLAYGETPOS, 0, pos);if (!backFlag) {//防止单个线程死循环return downloadFlag;}int produce = pos.getValue();if ((produce % 10) == 0 && tmp != produce) {//输出进度tmp = produce;logger.info("hksdk(视频)-视频下载进度:" + "==" + produce + "%");}if (produce == 100) {//下载成功hcNetSDK.NET_DVR_StopGetFile(loadHandle);loadHandle.setValue(-1);hcNetSDK.NET_DVR_Logout(userId);//退出录像机logger.info("hksdk(视频)-退出状态" + hcNetSDK.NET_DVR_GetLastError());//hcNetSDK.NET_DVR_Cleanup();return true;}if (produce > 100) {//下载失败hcNetSDK.NET_DVR_StopGetFile(loadHandle);loadHandle.setValue(-1);logger.warn("hksdk(视频)-海康sdk由于网络原因或DVR忙,下载异常终止!错误原因:" + hcNetSDK.NET_DVR_GetLastError());//hcNetSDK.NET_DVR_Logout(userId);//退出录像机//logger.info("hksdk(视频)-退出状态"+hcNetSDK.NET_DVR_GetLastError());return false;}}} else {System.out.println("hksdk(视频)-下载失败" + hcNetSDK.NET_DVR_GetLastError());return false;}}return false;}/*** 获取海康录像机格式的时间*/private HCNetSDK.NET_DVR_TIME getHkTime(Date time) {HCNetSDK.NET_DVR_TIME structTime = new HCNetSDK.NET_DVR_TIME();String str = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(time);String[] times = str.split("-");structTime.dwYear = Integer.parseInt(times[0]);structTime.dwMonth = Integer.parseInt(times[1]);structTime.dwDay = Integer.parseInt(times[2]);structTime.dwHour = Integer.parseInt(times[3]);structTime.dwMinute = Integer.parseInt(times[4]);structTime.dwSecond = Integer.parseInt(times[5]);return structTime;}public static void main(String[] args) {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");Date startTime = null;Date endTime = null;try {startTime = sdf.parse("20200422170000");   //开始时间endTime = sdf.parse("20200422180000");      //结束时间} catch (ParseException e) {e.printStackTrace();}VideoDowload test = new VideoDowload();Dvr dvr = new Dvr("http://192.168.0.167",80,"admin","123456");int channel = 33;//通道System.out.print(test.downloadVideo(dvr, startTime, endTime, "D:\\testhk\\test.mp4", channel));}
}

Dvr类:

import lombok.Data;/*** @author ZhangFZ* @date 2020/4/21 9:32**/
@Data
public class Dvr {// 视频服务器ip地址private String dvrip;// 视频服务器端口号private int dvrport;// 视频服务器用户名private String dvrusername;// 视频服务器密码private String dvrpassword;public Dvr(String dvrip, int dvrport, String dvrusername, String dvrpassword) {this.dvrip = dvrip;this.dvrport = dvrport;this.dvrusername = dvrusername;this.dvrpassword = dvrpassword;}
}

注意事项:

  • 自己的服务器信息请手动修改,保存目录等信息请手动修改
  • channel通道号是32起,比如你的通道为1,这里需要写33,原因咨询海康威视的技术。
  • 这里只是一个简单的demo,具体操作根据自己业务的实际情况来。

视频无法播放的问题

因为你的音频不是mpeg4容器支持的音频格式。通过mediainfo分析可知,你的音频格式是pcm_alaw,并且还有一行警告信息:
FileExtension_Invalid : mpeg mpg m2p vob vro pss evo
你的视频格式应该是MPEG-PS格式,但是后缀却是mp4,其实是一个非法的MP4。mediainfo还会告诉你合法的后缀应该是上述那几个。由于你的音频格式根本不被浏览器支持,但是视频格式是被浏览器支持的(H.264/AVC)。那么解决方案其实也简单,抽调音频即可。参考ffmpeg命令行(不转码,直接复制流):
ffmpeg -i demo.mp4 -c copy -an demp_enc.mp4
速度很快,使用-an参数屏蔽掉音频流,将封装格式转为mp4。再次用mediainfo查看,格式已经显示MPEG-4,是一个标准的mp4容器封装了,在当今主流的浏览器都能直接播放。

下载ffmpeg解码工具官网下载ffmpeg,解压安装找到ffmpeg.exe。

添加一下工具类

// ffmpeg.exe存放的位置
private static String ffmpegEXE = "D:\\software\\ffmpg\\bin\\ffmpeg.exe";//ffmpeg -i demo.mp4 -c copy -an demp_enc.mp4
public static void convetor(String videoInputPath, String videoOutPath) throws Exception {List<String> command = new ArrayList<String>();command.add(ffmpegEXE);command.add("-i");command.add(videoInputPath);command.add("-c");command.add("copy");command.add("-an");command.add(videoOutPath);ProcessBuilder builder = new ProcessBuilder(command);Process process = null;try {process = builder.start();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理InputStream errorStream = process.getErrorStream();InputStreamReader inputStreamReader = new InputStreamReader(errorStream);BufferedReader br = new BufferedReader(inputStreamReader);String line = "";while ((line = br.readLine()) != null) {}if (br != null) {br.close();}if (inputStreamReader != null) {inputStreamReader.close();}if (errorStream != null) {errorStream.close();}}

下载视频成功后,调用该方法进行转码,修改VideoDowload.java代码为以下:

if (produce == 100) {//下载成功hcNetSDK.NET_DVR_StopGetFile(loadHandle);loadHandle.setValue(-1);hcNetSDK.NET_DVR_Logout(userId);//退出录像机logger.info("hksdk(视频)-退出状态" + hcNetSDK.NET_DVR_GetLastError());hcNetSDK.NET_DVR_Cleanup();Media media = new Media();media.setDisasterId(disasterId);media.setType(MediaType.VIDEO);media.setCreateDate(new Date());media.setUploadTime(new Date());media.setAttachmentName("z" + fileName);media.setIsDeleted(false);media.setUpdate_rhtx(1);media.setFlag("OTHER");media.setNewsFeedId(0);String http_path = restUrlLocalhost;media.setUrl(http_path + "/urgentlogistic/file/mp4/" + newDate + "/z" +fileName);mediaService.create(media);try {// 视频进行转码convetor(filePath + fileName,filePath + "z" +fileName);File file = new File(filePath + fileName);// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除file.delete();} catch (Exception e) {e.printStackTrace();}return true;
}

运行完就会多一个视频文件,然后就可以用通用播放器播放这个新的视频了,至于老的视频任凭自己需求处理掉就行啦

使用微信关注下方公众号,回复《海康威视》获取海康威视下载中心地址、海康威视的错误码NET_DVR_GetLastError对应的错误描述、海康威视官方开发人员联系方式

海康威视SDK基于JAVA二次开发相关推荐

  1. arcsde java_ArcSDE SDK For Java二次开发介绍、演示样例

    在一个工作中,遇到了须要java后台来查询ArcGIS 中用到的Oracle数据库空间数据,因为对ArcGIS空间数据首次接触,仅仅知道Oracle能够使用ST_GEOMETRY字段存储,例如以下图 ...

  2. 基于ARCGIS二次开发可视化开发环境搭建(JAVA)

    这两天为了搭建这么一个基于java的ArcGIS二次开发环境可着实花了一番心血.在网上搜索各种资料,大部分都是基于C#的,关于JAVA的很少,而且很杂乱,没有一个完整的.详细的.适合新手的这么一个教程 ...

  3. 【微信小程序】基于Java+uniapp框架开发的全开源微信小程序商城系统

    应用介绍 基于Java+uniapp框架开发的全开源微信小程序商城系统,前端采用目前主流的uniapp框架开发,后端采用Java语言开发,前后端代码全部开源,减少重复造轮子,支持小程序商城秒杀.优惠券 ...

  4. catia三维轴承_浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文

    浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文 一.概述 单排四点接触球转盘轴承是一种能够同时承受较大轴向负荷.径向负荷和倾覆力矩等综合载荷,集支承.旋转.传动.固定等多种功能于一身的特殊 ...

  5. abaqus python二次开发攻略_基于CAE二次开发进行弹簧批量建模

    一. 为什么要进行弹簧批量建模 当一个公司或者学者从事科研任务时,往往通过有限元进行建模分析,建模的时间通常与工作效率挂钩.例如ABAQUS/CAE建模,想必很多老用户都有某种共同的感受,那就是实体模 ...

  6. 基于ZFAKA二次开发,添加PayJS支付渠道

    基于ZFAKA二次开发,添加PayJS支付渠道 项目地址:https://github.com/hiyouli/payjs-for-zfaka 关于ZFAKA,请移步:ZFAKA 免费.安全.稳定.高 ...

  7. 基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案

    基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案 参考文章: (1)基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案 (2)https://ww ...

  8. 基于ABAQUS二次开发的仿真分析平台

    ✨基于ABAQUS二次开发的仿真分析平台✨ 随着近年来计算机领域里程碑式的进步,计算机软件市场的迅速扩张,推出了许多功能强大的计算机仿真软件.ABAQUS有限元仿真分析软件则是其中的翘楚,作为应用广泛 ...

  9. 基于SOLIDWORKS二次开发的3D产品研发增效和企业信息化工具集SolidKits

    基于SOLIDWORKS二次开发的SolidKits工具的含义是3D产品研发增效和企业信息化工具集,目前已经帮助高科技.机器人.航空航天.船舶.汽车.机械设备.电器.电子等行业的上百家制造业企业提供了 ...

  10. 基于Java与MySQL开发的在线考试系统

    1 概述 1.1 简介 在Exam++考试系统第一版的基础上,我们对ExamStack V2.0进行了大量代码重构,同时也对数据模型做了部分调整.为了减小学员考试交卷时大量并发带来的系统风险,我们尝试 ...

最新文章

  1. [NHibernate]代码生成器的使用
  2. RHCE-postfix
  3. mvc2中如何在下拉列表中显示含有子类的项(子类前加--)
  4. Caffe2:添加CUDA路径
  5. linux7 无法连接网络,CentOS7无法连接网络怎么办
  6. idea怎么把代码放到git_在IDEA中如何初始化Git,把项目推送到Git上
  7. hopper_如何利用卫星收集的遥感数据轻松对蚱hopper中的站点进行建模
  8. java操作redis redis连接池
  9. lol云顶之奕助手_云顶之奕小小英雄介绍 除了棋子以外它也很重要!
  10. SpringCloud中 Feign结合Hystrix断路器开发。
  11. 鲲鹏BoostKit虚拟化使能套件,让数据加密更安全
  12. HTML5期末大作业:京东商城网站设计——京东商城购物网站(4页) 基于Html+Css+javascript的网页制作(购物主题)
  13. 5款网页版思维导图工具测评
  14. (数字通信)星座图 平均功率 峰值功率 峰均比 练习题;16-QAM 星座图 格雷编码
  15. linux rm 提示权限不足
  16. 召回率 matlab代码,召回率和精度(示例代码)
  17. 绿色数据中心空调设计 书评_书评:负责任的响应式设计
  18. Shamir 门限秘密共享
  19. open3D点云操作
  20. 尺寸仅为2.7mm 智芯传感ZXP0120ADB型压力传感器在可穿戴设备中大放异彩

热门文章

  1. wpe修改充值_wpe实现网络游戏修改
  2. Java中od方向是什么意思_od的用法
  3. 第六次人口普查各地级市常住人口数量
  4. linux下xp镜像文件iso下载,Windows XP SP3简体中文专业版[官方MSDN正式原版ISO镜像]
  5. 二代测序 下载 NCBI sra 文件
  6. VMware Workstation 16.2.2 Pro for Windows SLIC 2.6 Unlocker
  7. DMR 数字无线通信原理
  8. 防止phpddos攻击
  9. [渝粤教育] 四川农业大学 农业气象学 参考 资料
  10. 中国上市公司2001-2020年历史股票数据下载(获得方式见网页 http://yanzw.cn )