文章目录

  • 一、NET_DVR_SaveRealData方法
  • 二、NET_DVR_SaveRealData_V30方法
  • 三、强制I帧

一、NET_DVR_SaveRealData方法

使用下面方法可以实现视频录像功能。

    private HCNetSDK sdk = HCNetSDK.INSTANCE;sdk.NET_DVR_SaveRealData_V30(cameraInfo.getKey(), file.getPath() + "/" + fileName + ".mp4")

该方法有个问题,视频可以录制,但是不能被前端页面直接加载播放,因为视频编码格式问题,虽然可以用FFMPEG工具进行格式转化,但是引入第三方的库,无疑会使代码的维护性降低。

FFMPEG工具 地址 提取码 zc14
使用FFmpeg进行转换的方法如下:

ffmpeg -i  in.mp4  out.mp4

该方法网络上有大量的帖子,我直接放连接过来,可以自行前往学习
大牛博客地址

二、NET_DVR_SaveRealData_V30方法

这个方法是问海康的工程师得到的,跟海康的工程师交流还是挺美好的,工程师很耐心,直到自己的问题得到解答,代码测试通过,所以还是必须给点个赞。

附上该方法的SDK文档

按照SDK文档的说明,第二个参数传2,就可以了

  //预览成功后 调用接口使视频资源保存到文件中if (!sdk.NET_DVR_SaveRealData_V30(cameraInfo.getKey(), 2,file.getPath() + "/" + fileName + ".mp4")) {log.error("保存视频文件到文件夹失败 错误码为:  " + sdk.NET_DVR_GetLastError());logoutHIK(cameraInfo);return;}

到这里会发现一个问题,官方下载的SDK HCNetSDK.java文件中没有NET_DVR_SaveRealData_V30这个方法,尴尬了。
这就是官方SDK的坑点,SDK中有,但是HCNetSDK.java文件中没有,好多同学可能都会懵一下,这里可以将SDK中的方法直接复制进HCNetSDK.java文件即可。SDK是按照C语言来描述的,JAVA要做响应的适配改变。

 boolean  NET_DVR_SaveRealData_V30(NativeLong lRealHandle,int STREAM_TYPE,String sFileName);

OK,到此视频已经可以存储,播放也正常,但是你又会发现一个新的问题,就是保存的视频,设定1分钟,但是只有51秒 ,52秒,57秒等,就是没有1分钟的,甚至59秒的都很少,如果要求不那么高还好,到这里就可以结束了,如果要求的高,那就得做出处理了。

三、强制I帧

这里面其实是有一个 I帧的定义

录像数据解码播放必须从I帧开始,而客户端录像的时候开始时间点不一定是I帧,比如帧率25fps、I帧间隔100帧的情况下,每4秒才一个I帧,录像播放可能存在1~4秒的延时,所以录像的时候可以强制设备生成一个I帧。
NET_DVR_MakeKeyFrame强制主码流生成一个I帧,NET_DVR_MakeKeyFrameSub强制子码流生成一个I帧,z这两个是老的接口。
后来因为设备不只有主码流和子码流,还有三码流、虚拟码流等,因此增加了NET_DVR_RemoteControl(命令:NET_DVR_MAKE_I_FRAME)接口,兼容前面的两个接口,输入参数NET_DVR_I_FRAME中byStreamType表示码流类型。建议使用该接口。

可以看到,如果I帧没有到,也是不录视频的,但是I帧一般会慢几秒中,所以视频长度不够自己配置的长度

需要用到NET_DVR_RemoteControl 这个方法,会发现 HCNetSDK.java文件中并没有NET_DVR_RemoteControl 这个方法,继续添加上。

附上NET_DVR_RemoteControl 的SDK
同样,在 HCNetSDK.java文件中增加这个方法(根据java做了语法转换,如果不好转,请参考原HCNetSDK.java文件中的数据类型)

 boolean NET_DVR_RemoteControl(NativeLong lUserID, int dwCommand, Pointer pointer, int dwInBufferSize);

官方SDK简直了,有些方法没有,就连结构体也没有,都需要自己新增,没办法,谁让咱要用人家的产品么
lpInBuffer参数对应结构体 NET_DVR_I_FRAME
看SDK手册 NET_DVR_I_FRAME 结构体的官方文档

//强制I帧参数结构体。
public static class NET_DVR_I_FRAME extends Structure{public int dwSize;public byte[] sStreamID = new byte[32];  //流IDs    SDK 中对  STREAM_ID_LEN进行了定义,赋值32public int dwChannel;//通道号public byte byStreamType; //码流类型:0-主码流,1-子码流,2-码流3,3-虚拟码流,以此类推public byte[] byRes = new byte[63];  //保留,置为0    按照SDK要求进行对应赋值
}
//新建结构体对象HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象netDvrIFrame.read();netDvrIFrame.dwChannel = 1;          //因为上文代码中设置了通道号,按照上文中的设置netDvrIFrame.byStreamType = 0;netDvrIFrame.dwSize = netDvrIFrame.size();netDvrIFrame.write();if(!sdk.NET_DVR_RemoteControl(cameraInfo.getUserId(),3402,netDvrIFrame.getPointer(),netDvrIFrame.dwSize)){log.error("强制I帧 错误码为:  " + sdk.NET_DVR_GetLastError());}

在每次录像之前,对I帧进行强制设置,可以及时录像,经过测试基本上按照配置的时间进行录制,比如1分钟就是1分钟,偶尔有59秒的情况,提到的问题已经大大的修复了。经次一轮,对SDK的使用也有了更深的了解。自己踩过的坑,也记录下来,也让别人能很好的使用官方的SDK。

最后附上程序,欢迎下载传阅,另外还有海康工程师给的有更全结构体的HCNetSDK.java文件
百度网盘 链接:https://pan.baidu.com/s/1JEKvEnb5wTDtmNqlNsKvLg
提取码:x4bj

海康威视SDK视频录制及强制I帧操作相关推荐

  1. 模仿微视视频录制、支持按下录制抬起暂停以及断点进度条(基于javacv)

    apk下载视频录制apk下载, 项目源码地址为https://github.com/qdrzwd/VideoRecorder 补充:感谢雷军辉提供的文档 wiki: http://www.elesos ...

  2. 海康威视SDK控制台程序consoleDemo将实时码流保存为视频文件mp4

    陈拓 2021/08/28-2020/08/29 1. 概述 在<海康威视SDK控制台程序consoleDemo> https://zhuanlan.zhihu.com/p/4039038 ...

  3. 海康威视SDK通过NVR获取视频设备的状态

    海康威视SDK通过NVR获取视频设备的状态 前言 项目现场是通过NVR对多路摄像头设备进行集中管理,包括实时画面的预览和视频信号的存储.回放. 现在要实现这样一个功能:定期查询摄像头的状态,以确保摄像 ...

  4. 海康威视SDK实例QtDemo显示NVR视频窗口(Linux+Qt)

    海康威视SDK实例QtDemo显示NVR视频窗口(Linux+Qt) 陈拓 2021/07/312021/08/01 1. 概述 在<海康威视客户端iVMS-4200连接NVR> http ...

  5. 类似于快手、美拍、抖音短视频录制SDK接入教程

    这几年抖音短视频非常火爆,所以很多公司也希望开发短视频录制功能,现在大部分企业是通过第三方视频SDK来完成的,当然不考虑成本的,公司也可以自己开发. 先给大家看下短视频效果,没法插入视频,直接贴视频地 ...

  6. 类似于抖音等短视频录制功能的SDK接入教程

    1.1概述 美摄SDK致力于解决移动端视频开发的技术门槛,使仅有android界面开发经验的程序员,都可以开发出性能优异.渲染效果丰富的的视频录制.编辑功能.我们的优势体现在: 录制.剪辑不限时长 行 ...

  7. 海康威视SDK控制台程序consoleDemo获取视频通道参数

    陈拓 2021/08/27-2020/08/27 1. 概述 在<海康威视SDK控制台程序consoleDemo> https://zhuanlan.zhihu.com/p/4039038 ...

  8. QT开发小计:五、引入海康威视SDK开发视频监控系统环境搭建步骤及代码示例

    1.新建项目: 标题 2.修改项目配置文件 .pro 增加内容: 3.导入头文件(*.h) 项目目录,新建文件夹 [include],从海康SDK把头文件拷出来 4.导入静态链接库文件(*.lib) ...

  9. android视频分享功能吗,Unity 调用 Android 分享功能(基于ShareRec SDK视频分享)

    需求 Mob 平台是一个强大的提供分享功能的平台,为移动开发者提供 ShareSDK 社交分享.ShareREC 手游录像分享.短信验证码 SDK 及 BigApp 等免费服务. Unity 使用 S ...

最新文章

  1. /dev/null 21
  2. Eclipse alt+/ 失效 解决
  3. 通用mapper_通用Mapper快速开发,搭建项目
  4. (转)投资很难赚到你不信的那份钱︱投资道
  5. Pycharm设置中文版
  6. MaxDOS 网刻服务端网刻教程。
  7. 编译原理教程_10 代码优化和目标代码生成
  8. matlab解方java_matlab解方程
  9. Boost Serialization 库
  10. Python爬虫实战之12306抢票开源
  11. 免费图片转pdf的方法?学会图片转pdf很重要
  12. Zoho One平台正式发布 或将颠覆企业软件和SaaS行业
  13. 成像质量、像素个数、感光元件尺寸的关系
  14. 计算机组成原理研究生试题三,计算机组成原理研究生入学试题.doc
  15. 从空间中理解线性代数
  16. PSpice 模型创建与应用实例
  17. svn:E170001:Authorization failed解决
  18. 全面认识包图,组件图,部署图
  19. thinkphp 调用阿里云短信接口
  20. ArcGIS Pro3.0.2保姆级安装教程(附安装包)

热门文章

  1. 微信公众平台开发 进入篇(Web App开发入门)
  2. 阴阳师手游平民强力式神组合推荐
  3. 升级jenkins 导致jenkins启动失败_升级Jenkins:发布和代理 VUE 项目
  4. 本地文件服务器,使用http -server 搭建本地简易文件服务器
  5. 《天池龙珠 - Python训练营》04.Python数据分析:从0完成一个数据分析实战
  6. 【服务器数据恢复】IBM存储服务器硬盘坏道离线、oracle数据库损坏的数据恢复
  7. IDEA用svn提交代码
  8. 推荐系统学习笔记——特征工程
  9. 【好物小记】好物小记
  10. 数系最终章——复数(1)