海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
1.首先说了一下为什么要用ISUP协议来取流
ISUP主要就是用来解决摄像头没有公网ip的情况,如果摄像头或者所在局域网的路由器有公网ip的话,其实采用rtsp直接取流是最方便也是性能最好的,但是项目的摄像头没有公网IP所以被迫使用ISUP,ISUP是海康自己的协议,海康官网是有对应的DEMO,我主要根据他们的java版本的demo进行改造海康DEMO地址,
2.具体实现
首先得设置摄像头编码格式H.264

音频编码要改成ACC

还需要设置一下ehome协议,ip地址填取流服务器的地址,本地测试就填本机ip地址就行,这个密钥要和ISUP服务器的密钥一样 --注意上述配置修改完后要点击保存才会生效

3.核心代码_取流并再推流到nginx-rtmp
代码(完整服务源码地址)
thread = new Thread(() -> {try {
// 打印FFmpeg日志可以帮助确定输入流的音视频编码格式帧率等信息,需要时可以取消注释
// avutil.av_log_set_level(avutil.AV_LOG_INFO);
// FFmpegLogCallback.set();grabber = new FFmpegFrameGrabber(inputStream, 0);grabber.setOption("rtsp_transport", "tcp"); // 设置RTSP传输协议为TCP
// grabber.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 设置视频编解码器为H.264
// grabber.setAudioCodec(avcodec.AV_CODEC_ID_AAC); // 设置音频编解码器为ACCgrabber.setFormat("mpeg"); // 设置格式为MPEGgrabber.start();// 获取输入格式上下文AVFormatContext ifmt_ctx = grabber.getFormatContext();log.info("视频宽度:" + grabber.getImageWidth());log.info("视频高度:" + grabber.getImageHeight());log.info("音频通道:" + grabber.getAudioChannels());recorder = new FFmpegFrameRecorder(pushAddress, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels());recorder.setInterleaved(true); // 设置音视频交织方式recorder.setVideoOption("crf", "23"); //画质参数recorder.setFormat("flv"); // 设置推流格式为 FLV
// recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); // 设置音频编码器为 AACrecorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 设置视频编码器为 H.264recorder.setSampleRate(grabber.getSampleRate()); // 设置音频采样率recorder.setFrameRate(grabber.getFrameRate()); //设置视频帧率recorder.setVideoBitrate(3000000); // 设置视频比特率为 3 Mbps(根据需要调整)
// recorder.setVideoQuality(0); // 设置视频质量参数(0为最高质量)
// recorder.setAudioQuality(0); // 设置音频质量参数(0为最高质量)recorder.setGopSize((int) (grabber.getFrameRate()*2));recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);recorder.setVideoOption("tune", "zerolatency"); // 降低编码延迟recorder.setVideoOption("preset", "superfast"); // 提升编码速度recorder.start(ifmt_ctx); // 启动推流器Frame frame;count=0;long t1 = System.currentTimeMillis();AVPacket packet;while (running &&(packet = grabber.grabPacket()) != null) {count++;recorder.recordPacket(packet);
// if ((System.currentTimeMillis() - t1) > RECORD_LENGTH) {
// break;
// }if (count % 100 == 0) {// 处理每帧log.info("packet推流帧====>" + count);}}}
4.结语
搭建nginx-rtmp可以看看搭建nginx-rtmp,搭建完成后,nginx-rtmp可以提供HLS的url以供前端播放,也可以使用rtmp协议的url播放,只不过rtmp协议的现在的浏览器基本不支持播放了
本地实测延迟大概在5秒内,一般3秒左右
其实刚开始用的是别人代码,虽然也能实现视频预览,但是光一个摄像头进行推流就占了40%的cpu,性能消耗太多了,后来改了一下javaCV的配置,现在4核8G的服务器实测开启一个摄像头推流仅占1%cpu,cpu占用下降了不少
有些问题,
1.如果你拉的流解析没有音频通道(为0)的话,nginx-rtmp是不会生成.m3u8和ts文件的,无法生成播放hls的文件那么就只能用rtmp协议的url播放了 或者 手动添加音频。。。
2.如果运行出现Pipe closed异常,那么你应该找异常栈栈顶出现的异常,栈顶异常会导致流被关闭,但主线程会一直向流里面写入数据,所以会导致出现一大串Pipe closed
3.源码中依赖的lib文件里面动态链接库最好不要修改相对位置。.dll是windows系统运行需要的,.so是linux系统需要的
4.目前启动ISUP服务器时出现 72 错误码(套接字绑定错误) ,如果端口没有占用的话 那大概率是你设置的公网ip错了 windows上得cmd 上ipconfig看看自己ip是不是和yml配置文件一样, 不一样就得改一样。
5 出现169错误码的,要把SMS服务的端口打开,例如我demo中的7660端口,不然摄像头无法上传视频流
相关文章:
海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
1.首先说了一下为什么要用ISUP协议来取流 ISUP主要就是用来解决摄像头没有公网ip的情况,如果摄像头或者所在局域网的路由器有公网ip的话,其实采用rtsp直接取流是最方便也是性能最好的,但是项目的摄像头没有公网IP所以被迫使用ISUP,ISUP是海康…...
蓝桥杯之阶段考核
📖 Day 7:阶段考核 - 蓝桥杯官方模拟赛(限时 4 小时) 📖 一、如何高效完成模拟赛? 模拟赛是一种接近真实竞赛的训练方式。要高效完成模拟赛,需要掌握以下策略: 1. 赛前准备 ✅ 环…...
Python爬虫基础重要数据类型
重要数据类型 列表数据类型 在实际开发中,经常需要将一组(不只一个)数据存储起来,以便后边的代码使用。列表就是这样的一个数据结构。且列表是Python中最基本也是最常用的数据结构之一。什么是数据结构呢?通俗来讲&a…...
乐享数科:供应链金融—三个不同阶段的融资模式
供应链金融是与产业链紧密结合的融资模式,它主要体现在订单采购、存货保管、销售回款这三个不同的业务阶段,并针对这些阶段提供了相应的金融服务。以下是这三个阶段中主要的融资模式及其特点: 供应链金融融资模式主要分为以下几种࿱…...
【AI】openEuler 22.03 LTS SP4安装 docker NVIDIA Container Toolkit
NVIDIA Container Toolkit 打开网址 Unsupported distribution or misconfigured repository settings | NVIDIA Container Toolkit 为方便离线安装,先下载过来 wget https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo mk…...
【2025全网首发B站教程】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!
【2025全站首发】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测! 文章目录 1. 数据集准备1.1 标签格式转换1.2 数据集划分1.3 yaml配置文件创建 2. 训练验证 1. 数据集准备 示例数据集下载链接:P…...
设计模式教程:中介者模式(Mediator Pattern)
中介者模式是一种行为型设计模式,它用于减少对象之间的直接依赖关系。通过引入一个中介者对象,所有对象的交互都通过中介者进行,而不是直接相互通信。这种模式的主要目的是减少对象之间的耦合,提升系统的灵活性和可维护性。 1. 定…...
编写dockercompose脚本,管理redis,activemq,mysql5.7
编写dockercompose脚本,管理redis,activemq,mysql5.7,mysql的root密码设置Duke2007,redis密码设置duke0591 Docker Compose 多服务编排脚本(安全增强版) yaml 复制 services: # # MySQL 5.7 服务配置 #…...
【编程语言】委托与函数指针
委托与函数指针的相似之处: 指向方法:C# 的委托和 C 的函数指针都可以用来指向一个方法或函数。调用方法:它们都可以通过引用(委托或函数指针)来调用指向的方法。 委托与函数指针的主要区别: 类型安全&am…...
基于vue和微信小程序的校园自助打印系统(springboot论文源码调试讲解)
第3章 系统设计 3.1系统功能结构设计 本系统的结构分为管理员和用户、店长。本系统的功能结构图如下图3.1所示: 图3.1系统功能结构图 3.2数据库设计 本系统为小程序类的预约平台,所以对信息的安全和稳定要求非常高。为了解决本问题,采用前端…...
数字后端实现之Innovus中open net原因解析及解决方案
数字IC后端设计实现Innovus中我们经常会碰到如下的WARNING警告信息。这个log是在route或ECO Route阶段报的。这个WARNING必须要看,因为这里是报告当前设计存在open的net,即某些pin只有逻辑连接,而没有实际的物理连接。 这里正常工具应该报ERR…...
MATLAB基础学习相关知识
MATLAB安装参考:抖音-记录美好生活 MATLAB基础知识学习参考:【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分:变量定义和基本运算 生成矩阵: % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…...
Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统
随着大语言模型的广泛应用,知识库问答系统逐渐成为提升工作效率和个人学习的有力工具。MaxKB是一款基于LLM(Large Language Model)大语言模型的知识库问答系统,支持多模型对接、文档上传和自动爬取等功能。本文将详细介绍如何在Ma…...
RT-Thread+STM32L475VET6——icm20608传感器
文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟,并修改时钟树1.2 打开I2C3,参数默认即可(I2C根据自己需求调整)1.3 打开串口1.4 生成工程 2. 添加icm20608软件包3. 使能传感器,打开动态链接库4.…...
【信息系统项目管理师-案例真题】2022下半年案例分析答案和详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一(24分)【问题1】(6分)【问题2】(10分)【问题3】(8分)试题二(26分)【问题1】(8分)【问题2】(8分)【问题3】(4分)【问题4】(6分)试题三(25分)【问题1】(12分)【问题2】(7分)【问题…...
3D机器视觉工业3D图像格式常见的格式
工业3D图像格式主要用于存储和交换三维模型数据,常见的格式包括: STL (Stereolithography) 用途: 3D打印和快速成型。 特点: 存储三角面片信息,文件较小,但不包含颜色和材质数据。STEP (Standard for the Exchange of Product Data) 用途: CAD数据交换。 特点: 支持几何、拓…...
SkyWalking集成Kafka实现日志异步采集经验总结
SkyWalking日志异步采集架构 【重点知识】 1、【Agent】kafka-reporter-plugin-x.x.x.jar包放plugins目录后必走kafka(kafka没有正确配置就会报错) 2、【Agent】异步如不开启数据压缩,日志数据较大,pod多、业务大时容易造成网络…...
Java知识点——IO流
目录 一、IO流基础概念 二、常见的IO流类 三、字符流 1.字符输入流(Reader)与字符输出流(Writer) 2.常用实现类 3.实例 四、字节流 1.字节输入流(InputStream)与字节输出流(OutputStrea…...
uniapp h5端和app端 使用 turn.js
前提:添加页后,添加页与当前页会重叠在一起,不知道为什么,没有找到解决办法 1.h5端 <template><view class"container"><view id"flipbook"><view class"page page1">Page 1</view><view class"page pag…...
使用大语言模型(Deepseek)构建一个基于 SQL 数据的问答系统
GitHub代码仓库 架构 从高层次来看,这些系统的步骤如下: 将问题转换为SQL查询:模型将用户输入转换为SQL查询。 执行SQL查询:执行查询。 回答问题:模型根据查询结果响应用户输入。 样本数据 下载样本数据…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
