海康威视摄像头项目使用:踩坑经验,从sdk下载到demo启动
由于该公司必须在以前的项目中使用Hikvision的相机,因此我以前还进行了在线研究。尽管它也给了我一些灵感,但它仍然无法满足许多问题。这是我所接受的坑。

首先,下载官方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();
}
}
运行后,将有一个其他视频文件,然后您可以使用一般玩家播放新视频。至于旧视频,只需根据您的需要将其处理。