当前位置: 首页 > news >正文

SSM架构 +java后台 实现rtsp流转hls流,在前端html上实现视频播放

序言:书接上文,我们继续
SSM架构 +Nginx+FFmpeg实现rtsp流转hls流,在前端html上实现视频播放

步骤一:把rtsp流转化为hls流,用Java代码进行转换

package com.tools;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class RTSPtoHLS {public static void main(String[] args) {System.out.println("111111111111111111");String inputVideoPath="rtsp://admin:bfm100766@192.168.1.64:554/streaming/channels/101";String outputVideoPath ="D:/nginx/html/orb/test.m3u8";generateVideo( inputVideoPath,  outputVideoPath);}//视频拼接的接口public static boolean generateVideo(String inputVideoPath, String outputVideoPath) {try {// 构建FFmpeg命令,这里假设是将输入视频与模板视频合成,并输出成片// 命令示例: ffmpeg -i input.mp4 -i template.mp4 -filter_complex "your_complex_filter_graph" output.mp4// "your_complex_filter_graph" 是你用来应用模板的复杂滤波图// ffmpeg -fflags +genpts -i rtsp://admin:bfm100766@192.168.1.64:554/streaming/channels/101 -c copy -f hls -hls_time 2.0 -hls_list_size 1  D:/nginx/html/hls/test.m3u8String[] command = new String[]{"ffmpeg","-fflags", "+genpts","-i", inputVideoPath,"-c", "copy","-f", "hls","-hls_time","10","-hls_list_size","10",outputVideoPath};                                        ProcessBuilder processBuilder = new ProcessBuilder(command);Process process = processBuilder.start();// 读取错误流并打印BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));String line;while ((line = errorReader.readLine()) != null) {System.out.println(line);}// 等待进程结束 process.waitFor();System.out.println("Video generation completed!!!");return true;} catch (IOException | InterruptedException e) {e.printStackTrace();System.out.println("Error generating video.");}return false;}}

步骤二:SSM 架构中Controller层 如何调用


package com.controller;import java.util.Calendar;
import java.util.Timer;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;import com.alibaba.fastjson.JSONObject;
import com.tools.FileCleanupTask;
import com.tools.RTSPtoHLS;@Controller
@RequestMapping("/rh")
public class RtspHlsController {//1跳转到前端首页面@RequestMapping("/rh_login.html")public String  getdrLogin(HttpServletRequest request,HttpSession session){return "rh_login";}//使用传递 参数改变全局变量的参数@ResponseBody@RequestMapping(value="/setHls")public String set_Entity(HttpServletRequest request)			{ JSONObject  jsonObject=new JSONObject();//第一步先清空nginx中hls文件夹中的内容 String directoryPath = "D:/nginx/html/hls/";long thresholdSize = 2000 * 1024; //  文件阈值大小,例如10KB// 创建定时任务FileCleanupTask cleanupTask = new FileCleanupTask(directoryPath, thresholdSize);// 创建定时器并设置初始延迟为0,之后每5分钟执行一次任务(5 * 60 * 1000毫秒)Timer timer = new Timer();timer.schedule(cleanupTask, 60*60*1000, 60 * 60 * 1000); // 初始延迟为1000毫秒,之后每5分钟执行一次(5分钟=5*60*1000毫秒)//第二步nginx中录入中hls文件夹中内容 //rtsp视频流的访问路径String inputVideoPath="rtsp://admin:bfm100766@192.168.1.64:554/streaming/channels/101";//nginx的路径 把hls视频流输入到nginx服务器 hls文件夹中下String outputVideoPath ="D:/nginx/html/hls/test.m3u8";RTSPtoHLS.generateVideo( inputVideoPath,  outputVideoPath);jsonObject.put("saveUrl", outputVideoPath);return   jsonObject.toString();}//使用传递 参数改变全局变量的参数@ResponseBody@RequestMapping(value="/setHls1")public String set_Entity1(HttpServletRequest request)			{ JSONObject  jsonObject=new JSONObject();//第一步先清空nginx中hls文件夹中的内容 String directoryPath = "D:/nginx/html/hls/";long thresholdSize = 5000 * 1024; //  文件阈值大小,例如5000KB==5M// 创建定时任务FileCleanupTask cleanupTask = new FileCleanupTask(directoryPath, thresholdSize);// 创建定时器并设置初始延迟为0,之后每5分钟执行一次任务(5 * 60 * 1000毫秒)Timer timer = new Timer();//timer.schedule(cleanupTask, 60*60*1000, 60 * 60 * 1000); // 初始延迟为1000毫秒,之后每5分钟执行一次(5分钟=5*60*1000毫秒)//********设置每天的12点,执行某一函数************// 计算下一个12点的时间Calendar calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, 16); // 设置小时为12calendar.set(Calendar.MINUTE, 40); // 设置分钟为0calendar.set(Calendar.SECOND, 0); // 设置秒为0calendar.set(Calendar.MILLISECOND, 0); // 设置毫秒为0// 如果当前时间已超过今天的12点,则设置明天的12点if (calendar.before(Calendar.getInstance())) {calendar.add(Calendar.DATE, 1); // 明天的日期}// 安排任务在计算出的时间执行timer.schedule(cleanupTask, calendar.getTime());//第二步nginx中录入中hls文件夹中内容 //rtsp视频流的访问路径String inputVideoPath="rtsp://admin:bfm100766@192.168.1.64:554/streaming/channels/101";//nginx的路径 把hls视频流输入到nginx服务器 hls文件夹中下String outputVideoPath ="D:/nginx/html/hls/test.m3u8";RTSPtoHLS.generateVideo( inputVideoPath,  outputVideoPath);jsonObject.put("saveUrl", outputVideoPath);return   jsonObject.toString();}}

步骤三:html播放hls流视频

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>  
<!DOCTYPE html>
<html><head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0" /><title>FLV-HLS 监控视频播放展示界面</title><link rel="stylesheet" href="${pageContext.request.contextPath }/statics/common/commonCss/bootstrap.min.css" /><link rel="stylesheet" href="${pageContext.request.contextPath }/statics/common/demo.css" /><script type="text/javascript" src="${pageContext.request.contextPath }/statics/common/commonJs/jquery.min.js"></script><script type="text/javascript" src="${pageContext.request.contextPath }/statics/common/commonJs/bootstrap.min.js"></script><script type="text/javascript" src="${pageContext.request.contextPath }/statics/common/player/dhhls.min.js"></script><script type="text/javascript" src="${pageContext.request.contextPath }/statics/common/player/dhflv.min.js"></script></head><style>.mgt20 {margin-top: 20px;margin-bottom: 20px;}</style><%-- ${saveUrl} --%><body><div class="demo-box"><div class="title">HLS播放器Demo</div><div class="content"><!-- 左侧导航栏 -->
<!--                 <div class="nav-box"><ul class="nav nav-pills" role="tablist" id="mainTabs"><li role="presentation" class="nav-link list-group-item active-item"><a href="#home" aria-controls="home" role="tab" data-toggle="tab">HLS 视频流播放</a></li><li role="presentation" class="nav-link list-group-item"><a href="#profile" aria-controls="profile" role="tab" data-toggle="tab">FLV 视频流播放</a></li></ul></div> --><!-- tab主要内容 --><div class="tab-content content-box"><!-- HLS 播放 --><div role="tabpanel" class="tab-pane active" id="home"><!-- 步骤引导 --><!-- <div class="common-step play-step"><div class="sec-title">HLS视频流播放步骤</div><div class="step-box"><div class="step-item">1. 获取HLS实时流地址(如何获取流地址请查看<a href="https://open-icc.dahuatech.com/hlsplayer/#5">HLS详细说明</a>),获取HLS录像回放流地址(如何获取流地址请查看<a href="https://open-icc.dahuatech.com/#/home?url=%3Fnav%3Dwiki%2Fadmin%2Freplay.html&version=enterprisebase/5.0.15&blank=true">详细说明</a></div><div class="line-with-arrow"></div><div class="step-item">3. 播放配置输入流地址</div><div class="step-item">4. 开始播放</div></div></div> --><!-- 播放配置--><div class="common-step play-setting"><div class="sec-title">播放配置</div><div id="oneInput" class="mgt20 mgl10"><label style="display: none;">流地址:</label><input type="text" style="display: none;" class="stream-input" id="oneStartUrl" placeholder="请输入流地址" value="http://192.168.1.103:80/hls/test.m3u8"><button class="common-btn" id="oneStartVideo">播放</button><button class="common-btn" style="display: none;" id="downloadVideo">录像下载</button><br><br></div></div><!-- 播放器 --><div><video class="video-box" id="myVideo" controls preload="auto" autoplay="autoplay"></video></div><!--  <div><strong>补充说明</strong>: hls H265视频编码播放仅Chrome104及以上版本支持</div> --></div></div></div></div></body><script src="${pageContext.request.contextPath }/statics/common/player/dhflv.min.js"></script><script src="${pageContext.request.contextPath }/statics/common/player/dhhls.min.js"></script><script type="text/javascript">//异步请求处理,开始进行视频流输出$.ajax({async:true,   type:"post",url:"${pageContext.request.contextPath }/rh/setHls1",dataType:"json",success:function(data){console.log("nginx 输出视频流的绝对路径路径"+data.saveUrl);},error:function(){//layer.msg('出现异常');}});//菜单切换$('#mainTabs a').click(function (e) {$(this).tab('show');$(this).siblings().removeClass('active');$(this).parent().siblings().removeClass('active-item active');$(this).parent().addClass('active-item');})/*** 第一部分* HLS实时播放**///检测浏览器是否支持HLS 播放器if (!Hls.isSupported()) {alert("浏览器不支持 HLS, 请升级!");}//视频流帧数据、用于下载let fmp4Data = {audio: [],video: [],};let url = "";let hlsplayer = null;$('#oneStartVideo').click(function(e) {url = $('#oneStartUrl').val();if(!url) {alert("请输入流地址!");return}//初始化录像配置$('#downloadVideo')[0].innerText = "录像下载";fmp4Data = {audio: [],video: [],};//开始播放playHls('myVideo',url)})$(document).ready(function(e){url = $('#oneStartUrl').val();//url ="http://127.0.0.1:80/hls/test.m3u8";if(!url) {alert("请输入流地址!");return}//初始化录像配置$('#downloadVideo')[0].innerText = "录像下载";fmp4Data = {audio: [],video: [],};//开始播放playHls('myVideo',url)})//定时重新播放视频function refreshPageAfter() {//console.log("设定时间符合当前时间")url = $('#oneStartUrl').val();//url ="http://127.0.0.1:80/hls/test.m3u8";if(!url) {alert("请输入流地址!");return}//初始化录像配置$('#downloadVideo')[0].innerText = "录像下载";fmp4Data = {audio: [],video: [],};//开始播放playHls('myVideo',url)}//启动定时器//self.setInterval("refreshPageAfter()", 61 * 60 *1000);//莫一时间定时器function scheduleRefresh() {var now = new Date();var targetTime = new Date();// 设置目标时间为今天的12点15分targetTime.setHours(17, 36, 0, 0);// 如果当前时间已经超过12点15分,则将目标时间设置为明天的12点15分if (now >= targetTime) {targetTime.setDate(targetTime.getDate() + 1);}// 计算从现在到目标时间的毫秒数var delay = targetTime - now;console.log("设定时间符合当前时间"+delay)// 设置延时,直到目标时间到达setTimeout(refreshPageAfter, delay);console.log("设定时间符合当前时间")}//初始化调用== 调用函数以设置定时刷新scheduleRefresh();//创建hls播放器function playHls(id, url) {//先触发销毁if(hlsplayer != null) {hlsplayer.destroy();}//创建播放let video = document.getElementById(id);if(Hls.isSupported()) {hlsplayer = new Hls();hlsplayer.loadSource(url);hlsplayer.attachMedia(video);hlsplayer.on(Hls.Events.MANIFEST_PARSED, function() {hlsplayer.play(); });} else if(video.canPlayType('application/vnd.apple.mpegurl')) {console.log("apple原生");// 如果支持原生播放video.src = url;video.play();}}//hls录像下载$('#downloadVideo').click(function(e) {if(!hlsplayer) {alert("请先触发播放");return}let text = e.target.innerText;if(text === "录像下载") {$('#downloadVideo')[0].innerText = "录像中";playHls('myVideo',url);hlsplayer.on(Hls.Events.BUFFER_APPENDING, function (eventName, data) {//录像数据缓存fmp4Data[data.type].push(data.data);console.log(fmp4Data)});} else {$('#downloadVideo')[0].innerText = "录像下载";//结束并下载录像let type = "video";if (fmp4Data[type].length) {const blob = new Blob([arrayConcat(fmp4Data[type])], {type: 'application/octet-stream',});const filename = type + '-' + new Date().toISOString() + '.mp4';let aDom = document.createElement('a')aDom.setAttribute("download",`hlsjs-` + filename);aDom.setAttribute("href", self.URL.createObjectURL(blob));aDom.style.display = 'none';document.body.appendChild(aDom)aDom.click()document.body.removeChild(aDom);}//重置录像数据fmp4Data = {audio: [],video: [],};}})//组合视频数据function arrayConcat(inputArray) {const totalLength = inputArray.reduce(function (prev, cur) {return prev + cur.length;}, 0);const result = new Uint8Array(totalLength);let offset = 0;inputArray.forEach(function (element) {result.set(element, offset);offset += element.length;});return result;} /*** 第二部分* FLV实时播放**///检测浏览器是否支持flv 播放器if ( !dhflvjs.isSupported() ){alert("浏览器不支持 FLV, 请升级!");}let flvUrl = "";let flvPlayer = null;$('#oneStartVideoFlv').click(function(e) {flvUrl = $('#oneStartUrlFlv').val();if(!flvUrl) {alert("请输入流地址!");return}//开始播放playflv('myVideoflV',flvUrl)})//创建flv播放器function playflv(id, url) {if (typeof flvPlayer !== "undefined") {if (flvPlayer != null) {flvPlayer.unload();flvPlayer.detachMediaElement();flvPlayer.destroy();flvPlayer = null;}}const video = document.getElementById(id);flvPlayer = dhflvjs.createPlayer({type: 'flv',url : flvUrl,});flvPlayer.attachMediaElement(video);flvPlayer.load();flvPlayer.play();}//录像下载$('#downloadVideoFlv').click(function(e) {if(!flvPlayer) {alert("请先触发播放");return}let text = e.target.innerText;if(text === "录像下载") {$('#downloadVideoFlv')[0].innerText = "录像中";//开始录像downloadFLV(1);} else {$('#downloadVideoFlv')[0].innerText = "录像下载";//结束录像downloadFLV(0);}})//下载录像function downloadFLV(startFlag) {if( startFlag ) {flvPlayer && flvPlayer.startRecord()} else {flvPlayer && flvPlayer.endRecord()}}</script><script type="text/javascript" src="${pageContext.request.contextPath }/statics/jquery-2.1.0.min.js"></script>
<%-- <script type="text/javascript" src="${pageContext.request.contextPath }/statics/js/sebeiqiehuan.js"></script> --%><script type="text/javascript" src="${pageContext.request.contextPath }/statics/video.min.js"></script></html>

步骤四:所需物料库
链接下载:SSM架构 +Nginx+FFmpeg实现rtsp流转hls流—物料包
地址为:https://download.csdn.net/download/qq_39951524/90465236
在这里插入图片描述

相关文章:

SSM架构 +java后台 实现rtsp流转hls流,在前端html上实现视频播放

序言&#xff1a;书接上文&#xff0c;我们继续 SSM架构 NginxFFmpeg实现rtsp流转hls流&#xff0c;在前端html上实现视频播放 步骤一&#xff1a;把rtsp流转化为hls流&#xff0c;用Java代码进行转换 package com.tools;import java.io.BufferedReader; import java.io.IOExc…...

时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍

化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累&#xff0c;精准聚焦行业痛点&#xff0c;并携手 TDengine 提供高效解决方案。通过应用 TDengine&#xff0c;力川科技助力化工企业实现…...

信号完整性基础:高速信号的扩频时钟SSC测试

扩频时钟 SSC 是 Spread Spectrum Clock 的英文缩写&#xff0c;目前很多数字电路芯片都支持 SSC 功能&#xff0c;如&#xff1a;PCIE、USB3.0、SATA 等等。那么扩频时钟是用来做什么的呢&#xff1f; SSC背景&#xff1a; 扩频时钟是出于解决电磁干扰&#xff08;EMI&#…...

深入理解与配置 Nginx TCP 日志输出

一、背景介绍 在现代网络架构中&#xff0c;Nginx 作为一款高性能的 Web 服务器和反向代理服务器&#xff0c;广泛应用于各种场景。除了对 HTTP/HTTPS 协议的出色支持&#xff0c;Nginx 从 1.9.0 版本开始引入了对 TCP 和 UDP 协议的代理功能&#xff0c;这使得它在处理数据库…...

Java为什么是跨平台的

一、Java虚拟机(JVM)的抽象层作用 JVAM是Java跨平台的核心技术。Java代码编译后生成字节码(.class文件)&#xff0c;这些字节码并非直接由操作系统执行&#xff0c;而是由JVM解释或编译为特定平台的机器码。 屏蔽底层差异:JVM为不同操作系统提供统一的运行时环境&#xff0c;开…...

Sora与AGI的结合:从多模态模型到智能体推理的演进

全文目录&#xff1a; 开篇语前言前言&#xff1a;AGI的挑战与Sora的突破Sora的多模态学习架构&#xff1a;支撑智能体推理的基础1. **多模态学习的核心&#xff1a;信息融合与交叉理解**2. **智能体推理&#xff1a;从感知到决策** Sora如何推动AGI的发展&#xff1a;自主学习…...

一个针对煤炭市场的人工智能项目的开发示例

以下是一个针对煤炭市场的人工智能项目的开发示例&#xff0c;此项目将涵盖数据收集、数据预处理、模型构建、模型训练和预测等步骤。这里我们以预测煤炭价格为例&#xff0c;使用 Python 语言结合常见的机器学习库&#xff08;如pandas、scikit - learn&#xff09;来完成。 …...

QILSTE H6-S115FOKYG高亮橙光和黄绿光LED灯珠

型号&#xff1a;H6-S115FOKYG --- 在众多电子元件中&#xff0c;H6-S115FOKYG型号的LED以其独特的性能脱颖而出。这款产品采用了高亮橙光和黄绿光两种颜色&#xff0c;尺寸仅为1.6x1.5x0.55mm&#xff0c;却蕴含着强大的光电性能。其透明平面胶体设计&#xff0c;不仅美观&a…...

EasyDSS视频推拉流/直播点播平台:Mysql数据库接口报错502处理方法

视频推拉流/视频直播点播EasyDSS互联网直播平台支持一站式的上传、转码、直播、回放、嵌入、分享功能&#xff0c;具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务&#xff0c;全面满足超低延迟、超高画质、超大并发访…...

测试直播postman+Jenkins所学

接口自动化 什么是接口&#xff1f;本质上就是一个url&#xff0c;用于提供数据。后台程序提供一种数据地址&#xff0c;接口的数据一般是从数据库中查出来的。 postman自动化实操&#xff1a; 一般来说公司会给接口文档&#xff0c;如果没有&#xff0c;通过拦截&#xff0c…...

上线DeepSeek大模型,黄山“大位”智算中心正式点亮

2月28日&#xff0c;智启黄山&#xff0c;算领未来——黄山“大位”智算中心点亮仪式在黄山市大位人工智能计算中心举行&#xff0c;标志着黄山“大位”智算中心正式投入运营。同日&#xff0c;DeepSeek-R1大模型在黄山“大位”正式上线&#xff0c;通过“顶尖大模型普惠算力底…...

计算机毕业设计SpringBoot+Vue.js医院药品管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Linux安装nvm和node

执行curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash命令下载安装nvm 执行 source ~/.bashrc命令重新加载shell配置文件以使NVM生效 执行nvm ls-remote 查看可用node版本 如果确定版本&#xff0c;可以直接执行npm install 版本号&#xff0…...

HarmonyOS Next元服务网络请求封装实践

【HarmonyOS Next实战】元服务网络通信涅槃&#xff1a;深度封装如何实现80%性能跃升与零异常突破 ————从架构设计到工程落地的全链路优化指南 一、架构设计全景 1.1 分层架构模型 #mermaid-svg-VOia4RMx7iqmLnu7 {font-family:"trebuchet ms",verdana,arial,…...

网络编程-----服务器(多路复用IO 和 TCP并发模型)

一、单循环服务器模型 1. 核心特征 while(1){newfd accept();recv();close(newfd);}2. 典型应用场景 HTTP短连接服务&#xff08;早期Apache&#xff09;CGI快速处理简单测试服务器 3. 综合代码 #include <stdio.h> #include <sys/types.h> /* See NO…...

PostgreSQL 数据库专家可从事以的工作

数据库管理员&#xff08;DBA&#xff09; 职责 负责 PostgreSQL 数据库的日常管理和维护&#xff0c;包括安装、配置、升级数据库系统&#xff0c;确保数据库的稳定运行。 进行数据库性能调优&#xff0c;通过调整数据库参数、优化查询语句等方式&#xff0c;提高数据库的响应…...

如何学习编程?

如何学习编程&#xff1f; 笔记来源&#xff1a;How To Study Programming The Lazy Way 声明&#xff1a;该博客内容来自链接&#xff0c;仅作为学习参考 写在前面的话&#xff1a; 大多数人关注的是编程语言本身&#xff0c;而不是解决问题和逻辑思维。不要试图记住语言本身…...

策略模式详解:实现灵活多样的支付方式

多支付方式的实现&#xff1a;策略模式详解 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换使用。策略模式使得算法可以独立于使用它的客户端变化。本文将通…...

SQL根据分隔符折分不同的内容放到临时表

SQL Server存储过程里根据分隔符折分不同的内容放到临时表里做查询条件&#xff0c;以下分隔符使用“/”&#xff0c;可修改不同分隔符 --根据分隔符折分不同的内容放到临时表--------------- SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS id, LTRIM(RTR…...

微信小程序引入vant-weapp组件教程

本章教程,介绍如何在微信小程序中引入vant-weapp。 vant-weapp文档:https://vant-ui.github.io/vant-weapp/#/button 一、新建一个小程序 二、npm初始化 npm init三、安装 Vant Weapp‘ npm i @vant/weapp -...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...