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上实现视频播放
序言:书接上文,我们继续 SSM架构 NginxFFmpeg实现rtsp流转hls流,在前端html上实现视频播放 步骤一:把rtsp流转化为hls流,用Java代码进行转换 package com.tools;import java.io.BufferedReader; import java.io.IOExc…...

时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍
化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累,精准聚焦行业痛点,并携手 TDengine 提供高效解决方案。通过应用 TDengine,力川科技助力化工企业实现…...

信号完整性基础:高速信号的扩频时钟SSC测试
扩频时钟 SSC 是 Spread Spectrum Clock 的英文缩写,目前很多数字电路芯片都支持 SSC 功能,如:PCIE、USB3.0、SATA 等等。那么扩频时钟是用来做什么的呢? SSC背景: 扩频时钟是出于解决电磁干扰(EMI&#…...

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

Java为什么是跨平台的
一、Java虚拟机(JVM)的抽象层作用 JVAM是Java跨平台的核心技术。Java代码编译后生成字节码(.class文件),这些字节码并非直接由操作系统执行,而是由JVM解释或编译为特定平台的机器码。 屏蔽底层差异:JVM为不同操作系统提供统一的运行时环境,开…...
Sora与AGI的结合:从多模态模型到智能体推理的演进
全文目录: 开篇语前言前言:AGI的挑战与Sora的突破Sora的多模态学习架构:支撑智能体推理的基础1. **多模态学习的核心:信息融合与交叉理解**2. **智能体推理:从感知到决策** Sora如何推动AGI的发展:自主学习…...
一个针对煤炭市场的人工智能项目的开发示例
以下是一个针对煤炭市场的人工智能项目的开发示例,此项目将涵盖数据收集、数据预处理、模型构建、模型训练和预测等步骤。这里我们以预测煤炭价格为例,使用 Python 语言结合常见的机器学习库(如pandas、scikit - learn)来完成。 …...
QILSTE H6-S115FOKYG高亮橙光和黄绿光LED灯珠
型号:H6-S115FOKYG --- 在众多电子元件中,H6-S115FOKYG型号的LED以其独特的性能脱颖而出。这款产品采用了高亮橙光和黄绿光两种颜色,尺寸仅为1.6x1.5x0.55mm,却蕴含着强大的光电性能。其透明平面胶体设计,不仅美观&a…...

EasyDSS视频推拉流/直播点播平台:Mysql数据库接口报错502处理方法
视频推拉流/视频直播点播EasyDSS互联网直播平台支持一站式的上传、转码、直播、回放、嵌入、分享功能,具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务,全面满足超低延迟、超高画质、超大并发访…...
测试直播postman+Jenkins所学
接口自动化 什么是接口?本质上就是一个url,用于提供数据。后台程序提供一种数据地址,接口的数据一般是从数据库中查出来的。 postman自动化实操: 一般来说公司会给接口文档,如果没有,通过拦截,…...

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

计算机毕业设计SpringBoot+Vue.js医院药品管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介: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版本 如果确定版本,可以直接执行npm install 版本号࿰…...
HarmonyOS Next元服务网络请求封装实践
【HarmonyOS Next实战】元服务网络通信涅槃:深度封装如何实现80%性能跃升与零异常突破 ————从架构设计到工程落地的全链路优化指南 一、架构设计全景 1.1 分层架构模型 #mermaid-svg-VOia4RMx7iqmLnu7 {font-family:"trebuchet ms",verdana,arial,…...

网络编程-----服务器(多路复用IO 和 TCP并发模型)
一、单循环服务器模型 1. 核心特征 while(1){newfd accept();recv();close(newfd);}2. 典型应用场景 HTTP短连接服务(早期Apache)CGI快速处理简单测试服务器 3. 综合代码 #include <stdio.h> #include <sys/types.h> /* See NO…...
PostgreSQL 数据库专家可从事以的工作
数据库管理员(DBA) 职责 负责 PostgreSQL 数据库的日常管理和维护,包括安装、配置、升级数据库系统,确保数据库的稳定运行。 进行数据库性能调优,通过调整数据库参数、优化查询语句等方式,提高数据库的响应…...

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

策略模式详解:实现灵活多样的支付方式
多支付方式的实现:策略模式详解 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。策略模式使得算法可以独立于使用它的客户端变化。本文将通…...
SQL根据分隔符折分不同的内容放到临时表
SQL Server存储过程里根据分隔符折分不同的内容放到临时表里做查询条件,以下分隔符使用“/”,可修改不同分隔符 --根据分隔符折分不同的内容放到临时表--------------- 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 -...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
【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 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...