海康sdk捕获码流数据通过JavaCV推成rtmp流的实现思路(PS流转封装RTMP)

  • 问题分析
    • 转码推rtmp
    • PS流转封装

码云(Gitee)主页:https://gitee.com/banmajio
github主页:https://github.com/banmajio
个人博客:banmajio’s blog

海康sdk二次开发系列文章
海康sdk捕获码流数据通过JavaCV推成rtmp流的实现思路(PS流转封装RTMP)
海康sdk进行历史回放时,码流数据回调过快问题的解决方法
海康sdk项目(java)部署Linux环境相关问题总结
海康sdk部署Linux环境下无法播放子码流的问题
海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误

浏览器不支持flash插件之后,h5播放rtmp直播流的解决方案

【注意】:对于直播来说,可以采用rtsp-rtmp这种方案来实现。但是对于历史回放功能,采用rtsp指令带starttime和endtime参数来进行回放时,因为nvr带宽限制,会出现带宽不足的错误。所以目前没有想到更好的解决方案。故采用海康sdk二次开发,捕获到直播流或者历史流数据,自己转封装推成rtmp。

2020-12-17 修改升级
1.2020-11-17新增的内容中,回放的倍速暂停抓图拖动功能都是基于rtmp的形式做的。因为海康sdk历史录像捕获时是设备全速发送数据,需要自己控制推流速度,使推流速度和播放速度一致才能通过服务精准的做倍速和暂停恢复抓图的功能。但是由于播放速度多多少少会比推流速度慢一点,因此抓图等功能在请求接口后,播放器会有一些延迟。
2.因为上述不够完善,所以目前回放改为hls切片,抓图,倍速,暂停恢复交由客户端(播放器)去做,就可以保证时间点的精准。

2020-11-17 新增
1.抓图接口
2.倍速播放(0.25;0.5;1;2;4;8;16)
3.回放暂停与恢复
4.下载指定时间内的录像文件
5.查询指定时间点内的nvr录像文件列表
6.回放拖动进度条
考虑到开发成本,暂不准备开源,有需要demo的请加Q:1402325991 联系!(收费)

问题分析

通过海康sdk注册回调函数,可以捕获到视频的码流数据。但是因为海康sdk回调的码流数据是ps封装的h264的码流数据,也就是说通过海康sdk可以得到视频的ps流

转码推rtmp

最开始的时候,找到一个demo,是将海康sdk回调函数中将码流数据的byte[]—>BytePointer—>Mat,然后又通过opencv_imgproc.cvtColor()将yv12的Mat转为rgb的Mat,接着将rgb的Mat转为了Frame帧,最后通过FFmpegFrameRecorder.record(Frame)将帧推送到rtmp地址上。虽然这种方式可以实现我们的需求,但是带来的问题是,cpu占用率极高。大概推三路cpu就占满了。查看JavaCV源码发现FFmpegFrameRecorder.record(Frame)方法会对帧进行编解码的动作,然后将Frame转换为AVPacket。CPU高的原因也正是消耗在了编解码的地方。

 this.bPointer = new BytePointer(frameBean.getBuffer().length);this.yv12Mat = new Mat(height + height / 2, width, CV_8UC1);this.rgbMat = new Mat(height, width, CV_8UC3);if (this.converter == null) {this.converter = new ToIplImage();}if (this.matConverter == null) {this.matConverter = new ToMat();}// 图像转码-----↓// 填充指针this.bPointer.put(frameBean.getBuffer());// mat填充this.yv12Mat.data(this.bPointer);// 转码opencv实现方式opencv_imgproc.cvtColor(this.yv12Mat, this.rgbMat, opencv_imgproc.COLOR_YUV2BGR_YV12);// 转换为帧this.matFrame = this.matConverter.convert(this.rgbMat);// 图像转码-----↑try {this.recorder.record(this.matFrame);} catch (Exception e) {e.printStackTrace();}

PS流转封装

后来了解到,Javacv是可以将PS流转封装为flv格式推到rtmp的。具体的实现思路就是通过Java的管道流,将sdk回调函数中获得的码流数据写入PipedOutputStream中,然后将对应的PipedInputStream当做参数传入到FFmpegFrameGrabber的构造方法中。其余的操作和拉rtsp流推rtmp流大体类似。可以参考JavaCV转封装rtsp到rtmp(无需转码,低资源消耗)。
其中要注意的几点就是:
1.管道流PipedInputStream,PipedOutputStream不可以在同一线程下使用否则会造成死锁。
2.管道流是一种阻塞流,PipedOutputStream.write(byte[])会将数据放到PipedInputStream的缓冲区中,当PipedInputStream将这部分数据read()出去后,PipedOutputStream才会继续write。这个缓冲区的大小默认值时1024。也可以自己手动通过下面的这种方式指定缓冲区大小。

 PipedInputStream inputStream = new PipedInputStream(5120);

3.管道流PipedInputStream,PipedOutputStream成对出现,需要将两者建立连接才能正常工作。建立连接有以下两种方式:

 //第一种方式PipedInputStream inputStream = new PipedInputStream();PipedOutputStream outputStream = new PipedOutputStream(inputStream);//第二种方式PipedInputStream inputStream = new PipedInputStream();PipedOutputStream outputStream = new PipedOutputStream();inputStream.connect(outputStream);

4.推流方式和rtsp推流方式几乎相同

海康sdk捕获码流数据通过JavaCV推成rtmp流的实现思路(PS流转封装RTMP)相关推荐

  1. 海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误

    海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误 问题描述 解 ...

  2. 应用海康SDK获取设备图片A fatal error has been detected by the Java Runtime Environment:

    海康SDK版本:CH-HCNetSDKV6.1.6.45 add message # # A fatal error has been detected by the Java Runtime Env ...

  3. 海康SDK开发实时读取摄像头图像

    1.概述 最近项目需要实时读取网络摄像头,并对图像做处理,参考网络资料和海康SDK开发文档,文档中给了两种方式(1)SDK直接解码显示(2)实时流数据回调,用户自行处理码流数据(开发文档上以软解显示为 ...

  4. C#:使用海康SDK解码回调函数DecCallbackFUN()

    简述   使用海康摄像头采集图像时,需要在图像上添加图标.文字等额外数据.可选择使用海康SDK绘图回调函数叠加字符.图像等(请参考上一篇文章):也可使用海康SDK的解码回调函数,对视频流数据进行解码后 ...

  5. C#使用WebService调用海康SDK实现抓图与录像实时下载

    1.海康设备网络SDK下载 下载地址:https://www.hikvision.com/cn/download_more_401.html 下载完毕解压后的目录结构如下: 2.代码实现 通过参考&q ...

  6. 海康sdk docker虚拟化

    海康sdk docker虚拟化 主要使用sdk 对接IPC,对外提供视频播放的功能.在容器内运行了海康的sdk对接程序和tcp server. sdk使用的标准码流回调函数,将视频码流拿到后,利用tc ...

  7. Linux环境中对海康威视工业相机SDK进行二次开发(QT+CMake+Opencv+海康SDK)

    关于在Windows环境中对海康威视工业相机SDK进行二次开发的话,可以参考这两篇博客. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一) 海康威视工业相机SDK二 ...

  8. Android平台上集成海康SDK(二)

    Android平台上集成海康SDK 以上是我之前写的一篇Android平台上集成海康SDK的文章,其中对于Android平台上集成海康SDK.基于海康SDK进行二次开发基本上进行了详细地介绍. 这篇文 ...

  9. 海康 sdk 视频截取 demo

    说下这个demo 的背景 .....   好了 说完了 直接上重点 .... 这是在网上看到一个 jijl 的朋友的 demo 基础上面开发的,用到了里面的一些东西 .示例 demo 以及  web ...

最新文章

  1. angular指令ng-class巧用
  2. html载入excel数据库,网页数据采集如何导出为Excel、CSV、Html、数据库、API格式_视频教程 - 八爪鱼采集器...
  3. leetcode-找出数组中重复的数字
  4. 项目实战-本地自动化部署
  5. python运行py文件参数错误_Pycharm运行加载文本出现错误的解决方法
  6. oracle 数据库的非指令备份方法
  7. linux上传下载文件命令rz、sz
  8. AC_Dream 1216 G - Beautiful People
  9. Linux的进程优先级NI和PR
  10. tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案
  11. 用ANSYS画矩形_用SolidWorks画一个带波浪纹路的瓶子
  12. 如何在 iPhone 和 iPad 上快速找到合适照片?
  13. 计算机网络华为模拟器,华为模拟器eNSP Win10版
  14. 【算法】03 SCE-UA算法C++实现
  15. 度量python的运行时间
  16. java4android 听课笔记_Java4Android 课程笔记
  17. 面试官;经典面试题-JVM篇
  18. 分门别类刷leetcode——栈、队列、堆(C++实现)
  19. 数学 余式定理 简介
  20. 常见混沌系统—Chen模型

热门文章

  1. 百思不得姐框架(一)
  2. 楚狂人Windows驱动编程基础教程
  3. 虚拟环境下的Pip引用外部环境的解决方法
  4. 破解字体加密解决思路
  5. 【旅游】【转载】如何徒步虎跳峡
  6. 小Demo:自动提款机
  7. 2.24波斯顿房价预测线性回归
  8. 【内网安全】——CS操作指南(一)
  9. JST日本压着端子ZH系列线对板连接器的PCB封装库
  10. 2021SC@SDUSC山东大学软件学院软件工程应用与实践--quark renderer代码分析 第十二篇 绘画系统分析(3):连线(line)