海康威视摄像头项目使用:踩坑经验,从sdk下载到demo启动

由于该公司必须在以前的项目中使用Hikvision的相机,因此我以前还进行了在线研究。尽管它也给了我一些灵感,但它仍然无法满足许多问题。这是我所接受的坑。

海康威视摄像头项目使用:踩坑经验,从sdk下载到demo启动

首先,下载官方SDK。请确保您来自Linux或Windows版本。 SDK存在差异,您调用的插件文件也不同。在官方网站上下载相应的SDK,并在解压缩后打开最后一个TXT文件。请按照说明将文件复制到指定目录。

然后将实例演示导入IDE,请注意示例。JAR和JNA.JAR将导入项目,然后打开HCNETSDK.JAVA并找到

  HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("C:\\Users\\Administrator\\Desktop\\项目资料\\摄像头sdk\\CH-HCNetSDK(Windows64)V5.3.1.21_build20170811\\Demo示例\\4- Java 开发示例\\ClientDemo-NetBeansPro\\HCNetSDK",
            HCNetSDK.class);

在这里,我将HCNETSDK放在C磁盘目录中,根据自己的目录调整路径,然后启动项目,您可以看到演示。如图所示

输入相机信息,然后单击预览。

以下是我在开发过程中遇到的问题和解决方案。我希望这对每个人都会有所帮助

根据开发文档过程,在乘客流量统计模块中,该演示是编写的,发现回调功能没有离开。

第一个原因是它完全基于正式文档。安装防御后,在有时间执行时间之前直接删除回调功能,导致回调功能未离开。这需要删除辩方,并根据您自己的情况释放资源。

第二个原因是相机没有相机硬件保护,请登录到网站

http://相机IP/doc/page/config.asp for配置(配置教程)

视频下载模块,因为我们使用CVR传输多个摄像机,所以视频下载中有一个频道编号设置

 HCNetSDK.NET_DVR_PLAYCOND netDvrPlaycond = new HCNetSDK.NET_DVR_PLAYCOND();
            //通道号
            netDvrPlaycond.dwChannel = Integer.valueOf(1);
            netDvrPlaycond.struStartTime = struStartTime;
            netDvrPlaycond.struStopTime = struStopTime;

NetDvrplaycond.dwchannel设置非常重要。当每个相机将视频传递给CVR时,就会有一个唯一的频道编号。我们根据此通道编号查询相应的相机视频,并将其保存到我们自己的服务器中。

我们的需要是直接在页面上播放下载的视频,但是在播放时,发现它无法播放,因此我们尝试了各种视频插件。只有在老板的指导下,我才意识到视频的音频格式是错误的。下面老板的问题和答案

因为您的音频不是MPEG4容器支持的音频格式。通过MediaInfo分析,我们可以看到您的音频格式是PCM_ALAW,并且还有一系列警告信息:

fileextension_invalid:mpeg mpg m2p m2p vob vro pss evo

您的视频格式应为MPEG-PS格式,但是后缀为MP4,实际上是非法MP4。 MediaInfo还将告诉您法定后缀应为上述。由于您的音频格式完全不受浏览器的支持,因此浏览器(H.264/AVC)支持视频格式。解决方案实际上很简单,只需绘制音频即可。请参阅FFMPEG命令行(无编码,直接复制流):

ffmpeg -i demo.mp4 -c复制-an demp_enc.mp4

速度非常快,使用-A参数阻止音频流并将封装格式转换为MP4。我再次使用MediaInfo查看它。该格式表明MPEG-4是标准MP4容器包,可以直接在主流浏览器中播放。

下载FFMPEG解码工具官方网站以下载FFMPEG,Dempompress并安装以查找ffmpeg.exe。以下是我的Java测试代码

  private static String ffmpegEXE = "E:\\ffmpeg-20190425-1ae5a64-win64-static\\bin\\ffmpeg.exe";
    public static void main(String[] args) {
        try {
            convetor("E:\\ffmpeg-20190425-1ae5a64-win64-static\\bin\\demo.mp4","E:\\ffmpeg-20190425-1ae5a64-win64-static\\bin\\test.mp4");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //ffmpeg -i demo.mp4 -c copy -an demp_enc.mp4
    public static void convetor(String videoInputPath, String videoOutPath) throws Exception {
        List command = new ArrayList();
        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 block
            e.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();
        }
    }

运行后,将有一个其他视频文件,然后您可以使用一般玩家播放新视频。至于旧视频,只需根据您的需要将其处理。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

25阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

27阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

23阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读