本篇介绍海康威视摄像机通过SDK开启关闭实时预览接口

下篇介绍实时预览的回调函数及解码库

测试环境:

系统:Centos 7

SDK:设备网络SDK Linux64

实时预览模块流程:

图中虚线框部分的模块是与预览模块相关,必须在启动预览后才能调用,这些模块之间是并列的 关系,各自完成相应的功能。

关于SDK初始化和设备登录可以看我上一篇博客

实时预览接口(NET_DVR_RealPlay_V40)

NativeLong NET_DVR_RealPlay_V40(NativeLong lUserID, NET_DVR_PREVIEWINFO lpPreviewInfo, FRealDataCallBack_V30 fRealDataCall, Pointer pUser);

实时预览接口需要设置回调函数(fRealDataCallBack_V30接口的实现类)

注意:该接口返回的视频数据流并不能直接使用,需要使用官方解码库或者第三方解码库才能得到图片帧数据

传入参数

1、lUserID (NET_DVR_Login_V40等登录接口的返回值)

2、lpPreviewInfo (预览参数)

3、fRealDataCallBack_V30 (码流数据回调函数)

4、pUser (用户数据)

返回参数

-1表示失败,其他值作为NET_DVR_StopRealPlay等函数的句柄参数

NET_DVR_StopRealPlay 停止实时预览接口

接口调用

/**
* 开始其实预览 设置实时流回调函数
*
* @param nativeLong
* @author 云深小麦
*/
private NativeLong startRealPlay(NativeLong nativeLong) {
HCNetSDK.NET_DVR_PREVIEWINFO previewInfo = new HCNetSDK.NET_DVR_PREVIEWINFO();
previewInfo.lChannel = new NativeLong(1);
previewInfo.dwStreamType = 0;
previewInfo.dwLinkMode = 0;
previewInfo.hPlayWnd = null;
previewInfo.bBlocked = false;
previewInfo.bPassbackRecord = true;
previewInfo.byPreviewMode = 0;
previewInfo.byProtoType = 1;
previewInfo.dwDisplayBufNum = 15;
previewInfo.write(); NativeLong realPlayV40 = HKNETSDK.NET_DVR_RealPlay_V40(nativeLong, previewInfo, cbRealData, null);
if (realPlayV40.intValue() < 0) {
log.error("streamServiceImpl.startRealPlay.NET_DVR_RealPlay_V40 error:{}", HKNETSDK.NET_DVR_GetLastError());
throw new StreamException(HKNETSDK.NET_DVR_GetLastError());
}
return realPlayV40;
}

NET_DVR_GetLastError:返回最后操作的错误码

建议没次调用SDK里的接口都打印一下这个接口,返回0代表没有错误,就怕打印别的

预览参数说明:NET_DVR_PREVIEWINFO

lChannel

通道号,目前设备模拟通道号从1开始,数字通道的起始通道号通过NET_DVR_GetDVRConfig(配置命令NET_DVR_GET_IPPARACFG_V40)获取(dwStartDChan)。

dwStreamType

码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推

dwLinkMode

连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4- RTP/RTSP,5- RTP/HTTP,6- HRUDP(可靠传输) ,7- RTSP/HTTPS,8- NPQ

hPlayWnd

播放窗口的句柄,为NULL表示不解码显示。

bBlocked

0- 非阻塞取流,1- 阻塞取流

若设为不阻塞,表示发起与设备的连接就认为连接成功,如果发生码流接收失败、播放失败等情况以预览异常的方式通知上层。在循环播放的时候可以减短停顿的时间,与NET_DVR_RealPlay处理一致。

若设为阻塞,表示直到播放操作完成才返回成功与否,网络异常时SDK内部connect失败将会有5s的超时才能够返回,不适合于轮询取流操作。

bPassbackRecord

是否启用录像回传:0-不启用录像回传,1-启用录像回传。ANR断网补录功能,客户端和设备之间网络异常恢复之后自动将前端数据同步过来,需要设备支持。

byPreviewMode

延迟预览模式:0- 正常预览,1- 延迟预览

byStreamID

流ID,为字母、数字和"_"的组合,lChannel为0xffffffff时启用此参数

byProtoType

应用层取流协议:0- 私有协议,1- RTSP协议。主子码流支持的取流协议通过登录返回结构参数NET_DVR_DEVICEINFO_V30的byMainProto、bySubProto值得知。设备同时支持私协议和RTSP协议时,该参数才有效,默认使用私有协议,可选RTSP协议。

byRes1

保留,置为0

byVideoCodingType

码流数据编解码类型:0- 通用编码数据,1- 热成像探测器产生的原始数据(温度数据的加密信息,通过去加密运算,将原始数据算出真实的温度值)

dwDisplayBufNum

播放库播放缓冲区最大缓冲帧数,取值范围:1、6(默认,自适应播放模式)、15,置0时默认为1

byNPQMode

NPQ模式:0- 直连模式,1-过流媒体模式

byRes

保留,置为0

备注

1、 dwStreamType(码流类型)、dwLinkMode(连接方式)、bPassbackRecord(录像回传)、byPreviewMode(延迟预览模式)、byStreamID(流ID)这些参数的取值需要设备支持。

2、 NET_DVR_RealPlay_V40支持多播方式预览(dwLinkMode设为2),不需要传多播组地址,底层自动从设备获取已配置的多播组地址(NET_DVR_NETCFG_V50中的参数struMulticastIpAddr)并以该多播组地址实现多播。

3、 码流类型包含主码流、子码流、三码流、事件码流和虚拟码流等,

4、 当dwLinkMode == 7的时候,同时byProtoType == 1的时候,表示RTP over HTTPS预览。

停止实时预览(NET_DVR_StopRealPlay)

传入参数

1、lRealHandle(NET_DVR_RealPlay或者NET_DVR_RealPlay_V30的返回值)

返回参数

true 表示成功,false 表示失败。

接口调用

/**
* 停止实时预览
*
* @return nativeLong
* @author 云深小麦
*/
private void stopRealPlay(NativeLong nativeLong) {
boolean response = HKNETSDK.NET_DVR_StopRealPlay(nativeLong);
if (!response) {
log.info("streamServiceImpl.stopRealPlay.NET_DVR_StopRealPlay error:{}", HKNETSDK.NET_DVR_GetLastError());
}
}

代码写的太乱,我还在整理中。。。

注意:so动态库是linux版本的,windows版本的有部分接口不一样

海康威视摄像机Java SDK拉流(二)开启关闭实时预览的更多相关文章

  1. 海康威视Java SDK拉流(一)初始化SDK

    19年的时候做了一个视频分析的产品,用户使用的安防摄像机基本的都是海康大华宇视,今天写一下关于Java调用海康威视摄像机的demo,当时也踩了很多坑.写个博客记录一下 测试环境: 系统:Centos ...

  2. 海康威视实时预览回调PS流用EasyRTMP向RTMP服务器推流中视频数据处理的代码

    在上一篇方案<EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)>我们介绍了将海康安防摄像机进行互联网直播的整体方案流程,其中有一个 ...

  3. mybatis oracle java.sql.SQLException: 流已被关闭问题

    /** * 按照页码取值(从current_page页开始,每页page_size条) * @param key * @param params * @param current_page * @pa ...

  4. java压缩包上传,解压,预览(利用editor.md和Jstree实现)和下载

    java压缩包上传,解压,预览(利用editor.md和Jstree实现)和下载 实现功能:zip文件上传,后台自动解压,Jstree树目录(遍历文件),editor.md预览 采用Spring+Sp ...

  5. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  6. WebRTC 源码分析(二):安卓预览

    有过一定相机开发经验的朋友可能会疑惑,预览还有什么好分析的,不是直接 camera.setPreviewDisplay 或者 camera.setPreviewTexture 就能在 SurfaceV ...

  7. [java]文件上传下载删除与图片预览

    图片预览 @GetMapping("/image") @ResponseBody public Result image(@RequestParam("imageName ...

  8. JavaCV的摄像头实战之二:本地窗口预览

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. EasyDarwin云平台:EasyCamera开源摄像机接入海康威视摄像机PS流转ES流

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376 海康威视使用PS流封装H.264流,EasyDarwin云平台支持ES流.当我们 ...

随机推荐

  1. LeetCode移除元素

    LeetCode 移除元素 题目描述 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不需要使用额外的数组空间,你必须仅使用 O(1) ...

  2. Web安全学习二

    目录 常见漏洞攻防 SQL注入 注入分类 按技巧分类 按获取数据的方式分类 注入检测 权限提升 数据库检测 绕过技巧 CheatSheet SQL Server Payload MySQL Paylo ...

  3. 100个Shell脚本——【脚本9】统计ip

    [脚本9]统计ip 有一个日志文件,日志片段:如下: 112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com "/ ...

  4. 转 Android Studio中Junit调试

    转:https://blog.csdn.net/xanthus_li/article/details/54314189 在程序开发完成后,需要交给专业的调试人员进行相关的专业调试(白盒测试,黑盒测试, ...

  5. 【编程思想】【设计模式】【其他模式】hsm

    Python版 https://github.com/faif/python-patterns/blob/master/other/hsm/hsm.py """ Impl ...

  6. Identity Server 4 从入门到落地(十一)—— Docker部署

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  7. Java如何生成随机数 - Random、ThreadLocalRandom、SecureRandom

    Java7 的Random伪随机数和线程安全的ThreadLocalRandom 一.Random伪随机数: Random 类专门用于生成一个伪随机数,它有两个构造器: 一个构造器使用默认的种子(以当 ...

  8. &和nohup

    目录 一.简介 二.& 三.nohup 一.简介 当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事情要做,比如阅读电子邮件.对于密集访问磁盘的进程,我 ...

  9. Linux 文件权限、系统优化

    目录 Linux 文件权限.系统优化 1.文件权限的详细操作 1.简介: 2.命令及归属: 3.权限对于用户和目录的意义 权限对于用户的意义: 权限对于目录的意义: 4.创建文件/文件夹的默认权限来源 ...

  10. 在【自定义列】中编辑简单运算公式(Power Query 之 M 语言)

    数据源: "品名"."数量"."单价"三列 目标: 计算销售单价(单价*1.2) 解决方案: 在[自定义列]中使用乘法四则运算 步骤: 打开 ...