海康威视-按时间下载录像文件

news2024/11/27 23:46:19

目录

1、流程图

1.1、录像查找

1.2、录下下载 

2、按时间下载

2.1、开启下载 

2.2、后台下载

2.2.1、方式一

2.2.2、方式二

3、问题整理

3.1、错误码34

3.2、错误码10

3.3、下载的文件大小为0kb

4、错误码


由于没有在官方文档中找到通过ISAPI协议透传实现按时间下载文件的方式。所以采取了SDK本地调用方式。

1、流程图

按照官方文档中描述的流程,下载文件分为按文件名和时间两种方式。本文仅以按时间段下载录像文件。

1.1、录像查找

 

1.2、录下下载 

在官方的设备网络SDK使用手册_V6.1版本中,用例代码使用C++语法实现录像下载功能。实际上使用Java改写,调用时存在错误。

2、按时间下载

前期准备的初始化,登录模块请参考之前文章 的后半部分海康威视-NVR使用及ISAPI协议透传接入-CSDN博客

以下是核心代码:

public static void main(String[] args) {
        boolean flag = init();
        if(!flag){
            return ;
        }
        // 登录
        String sDeviceIP = "192.168.1.1";//登录设备IP地址
        String sUsername = "admin";//设备用户名
        String sPassword = "admin";//设备密码
        flag = loginByV40(sDeviceIP, sUsername, sPassword);
        if(!flag){
            log.info("登录nvr失败");
            return ;
        }

        // 设置查找范围
        Calendar start = Calendar.getInstance();
        start.setTime(DateUtil.parse("2024-06-15 08:00:00", DatePattern.NORM_DATETIME_PATTERN));
        Calendar end = Calendar.getInstance();
        end.setTime(DateUtil.parse("2024-06-15 08:00:10", DatePattern.NORM_DATETIME_PATTERN));
        downloadVideoByRangeTime(1, start, end , "D:\\1.mp4");
        logout();
    }

2.1、开启下载 

/**
     * 下载指定时间段内的视频
     * @param channel 通道号
     * @param startTime
     * @param endTime
     * @param savePath  保存视频的绝对路径,mp4格式
     */
    public static boolean downloadVideoByRangeTime(int channel, Calendar startTime, Calendar endTime, String savePath){
        // NET_DVR_GetFileByTime_V40
        HCNetSDK.NET_DVR_PLAYCOND playcond = new HCNetSDK.NET_DVR_PLAYCOND();
        playcond.read();
        //通道号 NVR设备路数小于32路的起始通道号从33开始,依次增加
        playcond.dwChannel = channel + 32;
        playcond.struStartTime.dwYear = startTime.get(Calendar.YEAR);
        playcond.struStartTime.dwMonth = startTime.get(Calendar.MONTH)+1;
        playcond.struStartTime.dwDay =  startTime.get(Calendar.DAY_OF_MONTH);
        playcond.struStartTime.dwHour = startTime.get(Calendar.HOUR_OF_DAY);
        playcond.struStartTime.dwMinute = startTime.get(Calendar.MINUTE);
        playcond.struStartTime.dwSecond = startTime.get(Calendar.SECOND);

        //HCNetSDK.NET_DVR_TIME ed = new HCNetSDK.NET_DVR_TIME();
        playcond.struStopTime.dwYear = endTime.get(Calendar.YEAR);
        playcond.struStopTime.dwMonth = endTime.get(Calendar.MONTH)+1;
        playcond.struStopTime.dwDay =  endTime.get(Calendar.DAY_OF_MONTH);
        playcond.struStopTime.dwHour = endTime.get(Calendar.HOUR_OF_DAY);
        playcond.struStopTime.dwMinute = endTime.get(Calendar.MINUTE);
        playcond.struStopTime.dwSecond = endTime.get(Calendar.SECOND);
        playcond.write();

        int code = hCNetSDK.NET_DVR_GetFileByTime_V40(lUserID, savePath, playcond);
        if(code < 0){
            log.info("初始化下载失败 channel={},playcond={}, code={}", channel, playcond, hCNetSDK.NET_DVR_GetLastError());
            return false;
        }
        return playBackControl(code);
    }

2.2、后台下载

2.2.1、方式一

通过循环检查Pos状态判断是否下载完成

private static boolean playBackControl(int hPlayback){
        hCNetSDK.NET_DVR_PlayBackControl(hPlayback, HCNetSDK.NET_DVR_PLAYSTART, 0, null);

        Date nowTime = new Date(System.currentTimeMillis());
        SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        System.out.println("开始下载时间:"+sdFormatter.format(nowTime));
        while(true){
            IntByReference nPos = new IntByReference(0);
            hCNetSDK.NET_DVR_PlayBackControl(hPlayback, HCNetSDK.NET_DVR_PLAYGETPOS, 0, nPos);
            if (nPos.getValue() > 100)
            {
                System.out.println( "由于网络原因或DVR忙,下载异常终止!");
                break;
            }
            if (nPos.getValue() == 100)
            {
                System.out.println("结束下载时间:"+sdFormatter.format(nowTime));
                System.out.println("按时间下载结束!");
                break;
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
}

2.2.2、方式二

结合Pos状态,记录下载进度,主要针对大文件反馈结果。

/**
     * 控制后台下载过程
     */
    private static boolean playBackControl(int hPlayback){

        boolean flag = hCNetSDK.NET_DVR_PlayBackControl_V40(hPlayback, HCNetSDK.NET_DVR_PLAYSTART, null, 0, null, null);
        if(!flag) {
            log.info("Play back control failed code=" +  hCNetSDK.NET_DVR_GetLastError());
            return false;
        }

        int nPos = 0;
        for(nPos = 0; nPos < 100&&nPos>=0; nPos = hCNetSDK.NET_DVR_GetDownloadPos(hPlayback))
        {
            log.info("Be downloading... " + nPos);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        if(!hCNetSDK.NET_DVR_StopGetFile(hPlayback))
        {
            log.info("failed to stop get file " + hCNetSDK.NET_DVR_GetLastError());
            return false;
        }
        if(nPos<0||nPos>100)
        {
            log.info("download err "  + hCNetSDK.NET_DVR_GetLastError());
            return false;
        }
        log.info("Be downloading..." + nPos);
        return true;
    }

3、问题整理

3.1、错误码34

描述:创建文件出错。本地录像、保存图片、获取配置文件和远程下载录像时创建文件失败。

原因:由于windows下,存储的文件路径指定到了C盘,造成无法写入。

解决:选择其他盘符即可

3.2、错误码10

描述:从设备接收数据超时。

原因:由于传入的channelID 设备通道号错误

解决:与ISAPI调用传入的channelID不同,在NVR设备路数小于32路的起始通道号从33开始,依次增加

// channel 为原始的 1、2、3...

playcond.dwChannel = channel + 32;

3.3、下载的文件大小为0kb

原因:传入的起止日期值错误,导致无法查找对应通道的回放录像

解决:由于我在代码中使用了java.util.Calendar 类,该类在查询日期字段值存在差异。

其中 Calendar.MONTH 以0为起点,需要+1

// 以下是年月日,时分秒的查询

playcond.struStartTime.dwYear = startTime.get(Calendar.YEAR);
playcond.struStartTime.dwMonth = startTime.get(Calendar.MONTH)+1;
playcond.struStartTime.dwDay =  startTime.get(Calendar.DAY_OF_MONTH);
playcond.struStartTime.dwHour = startTime.get(Calendar.HOUR_OF_DAY);
playcond.struStartTime.dwMinute = startTime.get(Calendar.MINUTE);
playcond.struStartTime.dwSecond = startTime.get(Calendar.SECOND);

4、错误码

以下错误码仅代表 NET_DVR_GetFileByTime_V40 方法

错误类型错误值错误信息
NET_DVR_NOERROR0没有错误。
NET_DVR_PASSWORD_ERROR1用户名密码错误。注册时输入的用户名或者密码错误。
NET_DVR_NOINIT3SDK未初始化。
NET_DVR_OVER_MAXLINK5连接到设备的用户个数超过最大。
NET_DVR_NETWORK_FAIL_CONNECT7连接设备失败。设备不在线或网络原因引起的连接超时等。
NET_DVR_NETWORK_SEND_ERROR8向设备发送失败。
NET_DVR_NETWORK_RECV_ERROR9从设备接收数据失败。
NET_DVR_NETWORK_RECV_TIMEOUT10从设备接收数据超时。
NET_DVR_COMMANDTIMEOUT14设备命令执行超时。
NET_DVR_PARAMETER_ERROR17参数错误。SDK接口中给入的输入或输出参数为空。
NET_DVR_CREATEFILE_ERROR34创建文件出错。本地录像、保存图片、获取配置文件和远程下载录像时创建文件失败。
NET_DVR_ALLOC_RESOURCE_ERROR41SDK资源分配错误。
NET_DVR_NOENOUGH_BUF43缓冲区太小。接收设备数据的缓冲区或存放图片缓冲区不足。
NET_DVR_CREATESOCKET_ERROR44创建SOCKET出错。
NET_DVR_USERNOTEXIST47用户不存在。注册的用户ID已注销或不可用。
NET_DVR_BINDSOCKET_ERROR72绑定套接字失败。
NET_DVR_SOCKETCLOSE_ERROR73socket连接中断,此错误通常是由于连接中断或目的地不可达。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1825549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

---String类---

在c语言中要使用字符串&#xff0c;只能通过字符指针或者字符数组&#xff0c;然后再通过函数进行各种操作&#xff0c;这种将变量和变量方法分开的方式显然不符合面向对象的编程&#xff0c;所以java中添加了String这个类 String类构造 而对于string有很多的方法 字符串长度…

DataFrames相关介绍文件读取

目录 1.初识DataFrame 2.DataFrame的构造函数 3.数据框的轴 4.CSV文件读取 5.Excel文件读取 1.初识DataFrame &#xff08;1&#xff09;昨天&#xff0c;我们学习了Series。而Pandas的另一种数据类型&#xff1a;DataFrame&#xff0c;在许多特性上和Series有相似之处。 …

Python虚拟环境的配置

前言&#xff1a; 本人一度被Python的虚拟环境的配置所困扰&#xff0c;前段时间抽空学习了一下&#xff0c;现在总结一下方法&#xff0c;供大家参考。 先使用winr打开命令行窗口。 展示所有虚拟环境 conda env list 创建虚拟环境 例如我们创建一个叫做py_sk的虚拟环境 …

JProfiler 性能分析案列——dump.hprof 堆内存快照文件分析排查内存溢出

在 windows 环境下实现。 一、配置 JVM 参数 配置两个 JVM 参数&#xff1a; -XX:HeapDumpOnOutOfMemoryError&#xff0c;配置这个参数&#xff0c;会在发生内存溢出时 dump 生成内存快照文件&#xff08;xxx.hprof&#xff09;-XX:HeapDumpPathF:\logs&#xff0c;指定生成…

SQLServer使用 PIVOT 和 UNPIVOT行列转换

在SQL Server中&#xff0c;PIVOT是一个用于将行数据转换为列数据的操作。它特别适用于将多个行中的值转换为多个列的情况&#xff0c;并在此过程中执行聚合操作。以下是关于SQL Server中PIVOT操作的详细解释和示例&#xff1a; 1、本文内容 概述语法备注关键点简单 PIVOT 示…

拒绝Token焦虑,盘点可白嫖的6款LLM大语言模型API~

上篇分享了如何从0到1搭建一套语音交互系统。 其中&#xff0c;大语言模型&#xff08;LLM&#xff09;是实现智能对话的关键所在。 很多小伙伴反应&#xff1a;本地部署 LLM 还是有门槛&#xff0c;本文将系统盘点&#xff1a;目前市面上都有哪些可以免费调用的云端API&…

华为云开发者社区活动-基于MindNLP的ChatGLM-6B聊天机器人体验

MindNLP ChatGLM-6B StreamChat 本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。支持流式回复。 本活动通过配置环境&#xff0c;模型接入&#xff0c;以及gradio前端界面搭建&#xff0c;实现了聊天机器人的功能。 以下是一些体验记录&#xff1a; 有兴趣的可以通过以下链…

平台型组织的战略及OKR

本文主要探讨了在平台型组织中战略和OKR&#xff08;目标与关键结果&#xff09;的应用&#xff0c;以及如何在不同的组织架构中有效制定和执行战略。原文: Strategy and OKRs in the Platform Organization 战略&#xff1a;重要的承诺、复杂的过程 对于什么是组织的战略&…

PS通过GTX实现SFP网络通信1

将 PS ENET1 的 GMII 接口和 MDIO 接口 通过 EMIO 方 式引出。在 PL 端将引出的 GMII 接口和 MDIO 接口与 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 连接&#xff0c; 1G/2.5G Ethernet PCS/PMA or SGMII 通过高速串行收发器 GTX 与 MIZ7035/7100 开发…

openh264 帧内预测编码原理:WelsMdIntraChroma 函数

帧内色度预测编码 帧内预测的目的是利用图像中相邻像素的亮度和色度值之间的接近性来进行压缩。在H.264中&#xff0c;帧内预测包括亮度和色度的预测。色度预测模式通常是基于亮度预测模式来确定的&#xff0c;因为色度分量通常具有更高的空间冗余度。色度预测模式的选择可以基…

汽车级TPSI2140QDWQRQ1隔离式固态继电器,TMUX6136PWR、TMUX1109PWR、TMUX1133PWR模拟开关与多路复用器(参数)

1、TPSI2140-Q1 是一款隔离式固态继电器&#xff0c;专为高电压汽车和工业应用而设计。 TPSI2140-Q1 与 TI 具有高可靠性的电容隔离技术和内部背对背 MOSFET 整合在一起&#xff0c;形成了一款完全集成式解决方案&#xff0c;无需次级侧电源。 该器件的初级侧仅由 9mA 的输入电…

Blender帧动画

时间线窗口Timeline用于定义帧动画 -视图&#xff1a;方法&#xff0c;平移&#xff0c;框显全部 -帧范围&#xff1a;可以调整动画共多少帧 -当前帧&#xff1a;可以拖动或手工指定 默认每秒24帧 定义一个帧动画类似unity的Timeline&#xff0c;只需定义关键帧&#xff0c…

java学习 项目篇 一

学习地址&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6?p6&spm_id_frompageDriver&vd_sourcea6f7db332f104aff6fadf5b3542e5875 后端环境搭建 Entity 实体&#xff0c;通常和数据库的表对应DTO 数据传输对象&#xff0c;用于程序中各层之间传递数据 (前端…

如何使用Keil打开GD32 FPU及使用ARM DSP库

GD32目前支持ARM Cortex-M和RISC-V两种内核系列芯片&#xff0c;其中Cortex-M内核已经支持的有M3、M4、M23、M33、M7&#xff0c;这里面除了M3和M23以外&#xff0c;其他的都带FPU单元。我们知道&#xff0c;FPU在浮点运算速度上有很大的提升&#xff0c;并且只有带FPU才可以使…

服务器权限管理

我们linux服务器上有严格的权限等级&#xff0c;如果权限过高导致误操作会增加服务器的风险。所以对于了解linux系统中的各种权限及要给用户&#xff0c;服务等分配合理的权限十分重要。&#xff08;权限越大&#xff0c;责任越大&#xff09; 1.基本权限 U--user用户,G-group…

板凳------56.Linux/Unix 系统编程手册(下) -- SOCKET 介绍

56.1.概述 socket 是一种IPC方法&#xff0c;允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据。 UNIX 允许位于同一主机系统上的应用程序之间通信 Internet domain IPv4 and IPV6 // socket 通信方式 1.各个应用程序创建一个socket&#xff0c;socket是…

GraogGNSSLib学习

GraogGNSSLib学习 程序编译环境版本项目编译结果问题 程序编译 GraphGNSSLib 环境版本 程序开源是在ubuntu16.04-kinetic环境跑通的&#xff0c;但是我的环境是UBUNTU20.04&#xff0c;所以&#xff0c;先进行了ROS的安装&#xff0c;因为我的系统是ubuntu20.04所以&#xf…

软考中级|软件设计师-知识点整理

目录 计算机网络概论 计算机系统基础知识 中央处理单元 数据表示 校验码 计算机体系结构 计算机体系结构的发展 存储系统 输入/输出技术 安全性、可靠性与系统性能评测基础知识 加密技术和认证技术 计算机可靠性 程序设计语言基础知识 程序设计语言概述 程序设计…

Python自动化办公(二) —— 查看文件夹中的PDF文件数量

Python自动化办公&#xff08;二&#xff09; —— 查看文件夹中的PDF文件数量 在日常办公中&#xff0c;我们经常需要统计某个文件夹中的PDF文件数量。手动操作不仅费时费力&#xff0c;而且容易出错。幸运的是&#xff0c;使用Python可以轻松实现这个过程。本文将介绍如何使用…

南通国际高中有哪些?南通惠立学校高中部校长见面日重磅来袭

惠灵顿&#xff08;中国&#xff09;自2011年成立以来&#xff0c;一直坚持深耕国际与双语教育&#xff0c;拥有丰厚的办学经验。依托于集团化的深厚经验南通惠立学校于2024-2025学年开设9-11年级&#xff0c;这所南通国际高中为高中学生搭建一个集卓越升学成果、强大师资、纯正…