JavaCV录屏到网络流

1、pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo1</artifactId><version>0.0.1-SNAPSHOT</version><name>demo1</name><description>demo1</description><properties><java.version>11</java.version><javacpp.platform.macosx-x86_64>macosx-x86_64</javacpp.platform.macosx-x86_64><javacpp.platform.linux-x86_64>linux-x86_64</javacpp.platform.linux-x86_64><javacpp.platform.windows-x86_64>windows-x86_64</javacpp.platform.windows-x86_64><javacv.version>1.5.11</javacv.version><javacv.ffmpeg.version>7.1-1.5.11</javacv.ffmpeg.version><javacv.opencv.version>4.10.0-1.5.11</javacv.opencv.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- mqtt --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-stream</artifactId></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-mqtt</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --><!--        <dependency>--><!--            <groupId>com.baomidou</groupId>--><!--            <artifactId>mybatis-plus-boot-starter</artifactId>--><!--            <version>3.5.1</version>--><!--        </dependency>--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.6</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>2.2.1</version></dependency><!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.6.0</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>dyvmsapi20170525</artifactId><version>2.1.4</version></dependency><!-- https://mvnrepository.com/artifact/io.netty/netty-all --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.75.Final</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.79</version></dependency><!-- https://mvnrepository.com/artifact/org.redisson/redisson --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.0</version></dependency><!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java --><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.20.0</version></dependency><!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util --><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java-util</artifactId><version>3.20.0</version><scope>runtime</scope></dependency><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version></dependency><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency><!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>4.0.3</version></dependency><!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna --><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.14.0</version></dependency><dependency><groupId>ai.djl</groupId><artifactId>api</artifactId><version>0.29.0</version></dependency><!-- https://mvnrepository.com/artifact/ai.djl.mxnet/mxnet-engine --><dependency><groupId>ai.djl.mxnet</groupId><artifactId>mxnet-engine</artifactId><version>0.29.0</version><scope>runtime</scope></dependency><!-- https://mvnrepository.com/artifact/ai.djl.mxnet/mxnet-model-zoo --><dependency><groupId>ai.djl.mxnet</groupId><artifactId>mxnet-model-zoo</artifactId><version>0.29.0</version></dependency><dependency><groupId>ai.djl</groupId><artifactId>basicdataset</artifactId><version>0.29.0</version></dependency><dependency><groupId>ai.djl</groupId><artifactId>model-zoo</artifactId><version>0.29.0</version></dependency><dependency><groupId>ai.djl.timeseries</groupId><artifactId>timeseries</artifactId><version>0.29.0</version></dependency><dependency><groupId>ai.djl.huggingface</groupId><artifactId>tokenizers</artifactId><version>0.29.0</version></dependency><dependency><groupId>ai.djl.audio</groupId><artifactId>audio</artifactId><version>0.29.0</version></dependency><dependency><groupId>commons-cli</groupId><artifactId>commons-cli</artifactId><version>1.5.0</version></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/javacv --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>${javacv.version}</version></dependency><!--javacv 精简依赖  只依赖windows64位ffmpeg--><dependency><groupId>org.bytedeco</groupId><artifactId>javacpp</artifactId><version>${javacv.version}</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg</artifactId><version>${javacv.ffmpeg.version}</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/opencv-platform --><dependency><groupId>org.bytedeco</groupId><artifactId>opencv</artifactId><version>4.10.0-1.5.11</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/tesseract --><dependency><groupId>org.bytedeco</groupId><artifactId>tesseract</artifactId><version>5.5.0-1.5.11</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/openblas --><dependency><groupId>org.bytedeco</groupId><artifactId>openblas</artifactId><version>0.3.28-1.5.11</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/leptonica --><dependency><groupId>org.bytedeco</groupId><artifactId>leptonica</artifactId><version>1.85.0-1.5.11</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/flycapture --><dependency><groupId>org.bytedeco</groupId><artifactId>flycapture</artifactId><version>2.13.3.31-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/libdc1394 --><dependency><groupId>org.bytedeco</groupId><artifactId>libdc1394</artifactId><version>2.2.6-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/libfreenect --><dependency><groupId>org.bytedeco</groupId><artifactId>libfreenect</artifactId><version>0.5.7-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/libfreenect2 --><dependency><groupId>org.bytedeco</groupId><artifactId>libfreenect2</artifactId><version>0.2.0-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/librealsense --><dependency><groupId>org.bytedeco</groupId><artifactId>librealsense</artifactId><version>1.12.4-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/librealsense2 --><dependency><groupId>org.bytedeco</groupId><artifactId>librealsense2</artifactId><version>2.53.1-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/videoinput --><dependency><groupId>org.bytedeco</groupId><artifactId>videoinput</artifactId><version>0.200-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/artoolkitplus --><dependency><groupId>org.bytedeco</groupId><artifactId>artoolkitplus</artifactId><version>2.3.1-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!--javacv 精简依赖  只依赖windows64位ffmpeg--></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2、java代码

package com.example.demo.ffpemg;import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.FFmpegLogCallback;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameRecorder.Exception;
import org.bytedeco.javacv.Java2DFrameConverter;import javax.sound.sampled.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;
import java.util.Scanner;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class VideoRecordRtmp {public final static int WIDTH = Toolkit.getDefaultToolkit().getScreenSize().width;public final static int HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().height;//线程池 screenTimer,录制视频private ScheduledThreadPoolExecutor screenTimer;//获取屏幕尺寸private final Rectangle rectangle = new Rectangle(WIDTH, HEIGHT); // 截屏的大小//视频类 FFmpegFrameRecorderprivate FFmpegFrameRecorder recorder;private Robot robot;//线程池 exec,录制音频private ScheduledThreadPoolExecutor exec;private TargetDataLine line;private AudioFormat audioFormat;private DataLine.Info dataLineInfo;///是否开启录音设备private boolean isHaveDevice = true;private long startTime = 0;private long videoTS = 0;private long pauseTimeStart = 0;//开始暂停的时间private long pauseTime = 0;//暂停的时长private double frameRate = 5;private String state = "start";//录制状态:start正在录制,pause暂停录制,stop停止录制public String getState() {return state;}public VideoRecordRtmp(String fileName, boolean isHaveDevice) {// TODO Auto-generated constructor stubFFmpegLogCallback.set();String rtmpUrl = "rtmp://127.0.0.1:1935/live/streamxxxxx";recorder = new FFmpegFrameRecorder(rtmpUrl, WIDTH, HEIGHT);recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 13recorder.setFormat("flv");// recorder.setFormat("mov,mp4,m4a,3gp,3g2,mj2,h264,ogg,MPEG4");recorder.setSampleRate(44100);recorder.setFrameRate(frameRate);recorder.setVideoQuality(0);recorder.setVideoOption("crf", "23");// 2000 kb/s, 720P视频的合理比特率范围recorder.setVideoBitrate(1000000);/*** 权衡quality(视频质量)和encode speed(编码速度) values(值): ultrafast(终极快),superfast(超级快),* veryfast(非常快), faster(很快), fast(快), medium(中等), slow(慢), slower(很慢),* veryslow(非常慢)* ultrafast(终极快)提供最少的压缩(低编码器CPU)和最大的视频流大小;而veryslow(非常慢)提供最佳的压缩(高编码器CPU)的同时降低视频流的大小* 参考:https://trac.ffmpeg.org/wiki/Encode/H.264 官方原文参考:-preset ultrafast as the* name implies provides for the fastest possible encoding. If some tradeoff* between quality and encode speed, go for the speed. This might be needed if* you are going to be transcoding multiple streams on one machine.*/recorder.setVideoOption("preset", "slow");recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); // yuv420precorder.setAudioChannels(2);recorder.setAudioOption("crf", "0");// Highest qualityrecorder.setAudioQuality(0);recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);try {robot = new Robot();} catch (AWTException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {recorder.start();} catch (Exception e) {// TODO 自动生成的 catch 块e.printStackTrace();}if (isHaveDevice) {/*** float sampleRate:采样率;每秒采样数 ;* int sampleSizeInBits:采样位数;每个样本中的位数 ;* int channels:音频通道数,1为mono,2为立体声;* boolean signed;* boolean bigEndian:是否为大端存储;指示单个样本的数据是否以大字节顺序存储*/audioFormat = new AudioFormat(44100.0F, 16, 2, true, false);dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);try {line = (TargetDataLine) AudioSystem.getLine(dataLineInfo);} catch (LineUnavailableException e1) {// TODO Auto-generated catch blockSystem.out.println("未获得音频线路," + e1);}}this.isHaveDevice = isHaveDevice;}/*** 开始录制*/public void start() {state = "start";if (startTime == 0) {startTime = System.currentTimeMillis();}if (pauseTimeStart != 0) {//计算暂停的时长pauseTime = System.currentTimeMillis() - pauseTimeStart;pauseTimeStart = 0;//归零} else {//没有暂停过,暂停时长为0pauseTime = 0;}// 如果有录音设备则启动录音线程if (isHaveDevice) {new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSoundCaputre();}}).start();}//录屏screenCaptrue();}//开启录屏的线程private void screenCaptrue() {// 录屏screenTimer = new ScheduledThreadPoolExecutor(1);/**** 参数:* 	command - 要执行的任务initialDelay - 延迟第一次执行的时间 ,延迟一帧的时间,我们设置的mp4的帧速为frameRate=每秒5帧,所以一帧的时间为 1秒/5period - 连续执行之间的时期 ,执行周期,为1帧的时间unit - initialDelay和period参数的时间单位,TimeUnit.MILLISECONDS为千分之一秒,就是1毫秒*/screenTimer.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {BufferedImage screenCapture = robot.createScreenCapture(rectangle); // 截屏BufferedImage videoImg = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_3BYTE_BGR); // 声明一个BufferedImage用重绘截图Graphics2D videoGraphics = videoImg.createGraphics();// 创建videoImg的Graphics2DvideoGraphics.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);videoGraphics.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,RenderingHints.VALUE_COLOR_RENDER_SPEED);videoGraphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);videoGraphics.drawImage(screenCapture, 0, 0, null); // 重绘截图Java2DFrameConverter java2dConverter = new Java2DFrameConverter();Frame frame = java2dConverter.convert(videoImg);try {//计算总时长videoTS = 1000L * (System.currentTimeMillis() - startTime - pauseTime);// 检查偏移量if (videoTS > recorder.getTimestamp()) {recorder.setTimestamp(videoTS);}recorder.record(frame); // 录制视频} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}// 释放资源videoGraphics.dispose();videoGraphics = null;videoImg.flush();videoImg = null;java2dConverter = null;screenCapture.flush();screenCapture = null;}}, (int) (1000 / frameRate), (int) (1000 / frameRate), TimeUnit.MILLISECONDS);}/*** 开启抓取声音的线程*/public void SoundCaputre() {try {if (!line.isRunning()) {line.open(audioFormat);line.start();}} catch (LineUnavailableException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}final int sampleRate = (int) audioFormat.getSampleRate();final int numChannels = audioFormat.getChannels();int audioBufferSize = sampleRate * numChannels;final byte[] audioBytes = new byte[audioBufferSize];exec = new ScheduledThreadPoolExecutor(1);exec.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {try {int nBytesRead = line.read(audioBytes, 0, line.available());int nSamplesRead = nBytesRead / 2;short[] samples = new short[nSamplesRead];// Let's wrap our short[] into a ShortBuffer and// pass it to recordSamplesByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(samples);ShortBuffer sBuff = ShortBuffer.wrap(samples, 0, nSamplesRead);// recorder is instance of// org.bytedeco.javacv.FFmpegFrameRecorderrecorder.recordSamples(sampleRate, numChannels, sBuff);// System.gc();} catch (Exception e) {e.printStackTrace();}}}, (int) (1000 / frameRate), (int) (1000 / frameRate), TimeUnit.MILLISECONDS);}/*** 暂停录制*/public void pause() {state = "pause";screenTimer.shutdownNow();screenTimer = null;if (isHaveDevice) {exec.shutdownNow();exec = null;}pauseTimeStart = System.currentTimeMillis();}/*** 停止录制*/public void stop() {state = "stop";if (null != screenTimer) {screenTimer.shutdownNow();}try {if (isHaveDevice) {if (null != exec) {exec.shutdownNow();}if (null != line) {line.stop();line.close();}dataLineInfo = null;audioFormat = null;}recorder.stop();recorder.release();recorder.close();screenTimer = null;// screenCapture = null;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {VideoRecordRtmp videoRecord = new VideoRecordRtmp("C:\\Users\\Administrator\\Desktop\\视频2", false);videoRecord.start();System.out.println("****start继续录制,pause暂停录制,stop停止录制****");while (true) {Scanner sc = new Scanner(System.in);if (sc.hasNext()) {String cmd = sc.next();if (cmd.equalsIgnoreCase("stop")) {videoRecord.stop();System.out.println("****已经停止录制****");break;}if (cmd.equalsIgnoreCase("pause")) {if (videoRecord.getState().equals("pause")) {System.out.println("*error:已经暂停,请勿重复操作pause*");continue;}videoRecord.pause();System.out.println("****已暂停,start继续录制,stop结束录制****");}if (cmd.equalsIgnoreCase("start")) {if (videoRecord.getState().equals("start")) {System.out.println("*error:请勿重复操作start*");continue;}videoRecord.start();System.out.println("****正在录制****");}}}}}

3、采用ZLMediaKit作为流媒体服务器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala 编写 hdfs 工具类

scala 编写 hdfs 工具类 scala 创建 删除 hdfs 文件或目录 scala 上传 下载 hdfs 文件 scala 读取 写入 hdfs 文件 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&quo…

从零用java实现 小红书 springboot vue uniapp (1)

前言 偶尔会用小红书发一些笔记 闲来无事 想自己实现一个小红书 正好可以学习一下 帖子 留言 im 好友 推送 等功能 下面我们就从零 开发一个小红书 后台依旧用我们的会员系统的脚手架 演示 http://120.26.95.195:8889/ 客户端我们使用uniapp 我们首先对主页进行一个分解 顶部我…

Cesium 按区域生成高度图

Cesium 按区域生成高度图 Cesium 按区域生成高度图 const cmd new CustomDrawCommand({vertexArray,shaderProgram,commandType: Compute,outputTexture: bufferColor,uniformMap,postExecute: () > {const url getImageByTexture(bufferAColor, gl);viewer.scene.primiti…

RESTful API设计原则与最佳实践

在当今的数字化时代&#xff0c;应用程序编程接口&#xff08;API&#xff09;已成为企业间数据交换、系统集成和业务扩展的关键工具。RESTful API作为一种基于HTTP协议的轻量级、无状态、可扩展的架构设计风格&#xff0c;在Web服务、移动应用、物联网等多个领域得到了广泛应用…

SpringMVC全局异常处理

一、Java中的异常 定义&#xff1a;异常是程序在运行过程中出现的一些错误&#xff0c;使用面向对象思想把这些错误用类来描述&#xff0c;那么一旦产生一个错误&#xff0c;即创建某一个错误的对象&#xff0c;这个对象就是异常对象。 类型&#xff1a; 声明异常&#xff1…

最小绝对偏差(Least Absolute Deviation, LAD)---子梯度法

最小绝对偏差&#xff08;Least Absolute Deviations&#xff0c;简称LAD&#xff09;是一种用于回归分析的统计方法&#xff0c;其目标是最小化残差的绝对值之和&#xff0c;而不是最小二乘法中的残差平方和。LAD回归特别适用于存在异常值的数据集&#xff0c;因为它对异常值不…

Linux - 进程等待和进程替换

进程等待 前面我们了解了如果父进程没有回收子进程, 那么当子进程接收后, 就会一直处于僵尸状态, 导致内存泄漏, 那么我们如何让父进程来回收子进程的资源. waitpid 我们可以通过 Linux 提供的系统调用函数 wait 系列函数来等待子进程死亡, 并回收资源. #include <sys/t…

mac下载安装jdk

背景 长时间不折腾mac全部忘记 特此记录 安装 1.下载jdk 根据需要下载对应的jdk 我直接 下载到/Applicatiions目录 https://www.oracle.com/java/technologies/downloads/#java8-mac 2.解压 cd /Applicatiions tar -zxvf jdk-8u431-macosx-x64.tar.gz 3.配置环境 …

【Java】—— 图书管理系统

基于往期学习的类和对象、继承、多态、抽象类和接口来完成一个控制台版本的 “图书管理系统” 在控制台界面中实现用户与程序交互 任务目标&#xff1a; 1、系统中能够表示多本图书的信息 2、提供两种用户&#xff08;普通用户&#xff0c;管理员&#xff09; 3、普通用户…

1-1.mysql2 之 mysql2 初识(mysql2 初识案例、初识案例挖掘)

一、mysql2 概述 mysql2 是一个用于 Node.js 的 MySQL 客户端库 mysql2 是 mysql 库的一个改进版本&#xff0c;提供了更好的性能和更多的功能 使用 mysql2 之前&#xff0c;需要先安装它 npm install mysql2 二、mysql2 初识案例 1、数据库准备 创建数据库 testdb CREAT…

[HDCTF 2023]LoginMaster

[HDCTF 2023]LoginMaster 知识点 quine注入 解题 用户名要为admin 查看robots.txt&#xff0c;查看源码 password是注入点 function checkSql($s) {if(preg_match("/regexp|between|in|flag||>|<|and|\||right|left|reverse|update|extractvalue|floor|subs…

springboot398研究生调研管理系统(论文+源码)_kaic

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

OSCP - Proving Grounds - Zino

主要知识点 SMB知识python脚本提权 具体步骤 执行nmap Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-10 01:24 UTC Nmap scan report for 192.168.52.64 Host is up (0.00077s latency). Not shown: 65529 filtered tcp ports (no-response) PORT STATE SER…

JDK8新特性之Stream流03

收集Stream流中的结果 IntStream intStream = Stream.of(1, 2, 3, 4, 5).mapToInt(Integer::intValue); intStream.filter(n -> n > 3).forEach(System.out::println); intStream.filter(n -> n > 3).count; intStream.filter(n -> n > 3).reduce(0, Integer…

自制shell命令行解释器,深入理解Linux系统命令行实现原理

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 ​编辑 1.打印命令提示符 ​编辑 2.获取用户输入指令 3.重定向分析 4.命令行参数表与环境变量表 5.命令解析 6.命令执行 6.1.创建子进程 6.2.文件…

ADB常用各模块操作命令

目录 1. 基本设备信息获取 2. 设备连接与管理 3. 文件管理 4. 进程与应用管理 5. 日志与调试 6. 调试和性能 7. 设备操作 8.adb命令的应用场景 1. 基本设备信息获取 获取设备的系统版本&#xff0c;获取设备安卓版本号&#xff1a; adb shell getprop ro.build.version.…

Mac M1 安装数据库

1. Docker下载 由于Sqlserver和达梦等数据库&#xff0c;不支持M系列的芯片&#xff0c;所以我们通过docker安装 下载并安装docker: https://www.docker.com/get-started/ 安装完成后&#xff0c;打开docker 2. SQL Server 安装 2.1 安装 打开终端&#xff0c;执行命令 doc…

渗透测试实验环境搭建

下载虚拟机镜像 5个虚拟机镜像&#xff0c;其中Linux攻击机我选择用最新的kali Linux镜像&#xff0c;其余的均使用本书配套的镜像。 网络环境配置 VMware虚拟网络编辑器配置&#xff1a; 将VMnet1和VMnet8分别设置IP为192.168.10.0/24和10.10.10.0/24。 虚拟机镜像配置 攻击机…

Linux shell脚本(一)

监控内存和磁盘容量&#xff0c;小于给定值时报警 [rootlinux-lyz test1]# ./monitor.sh & [1] 23110 # 提取根分区剩余空间 disk_size$(df / | awk /\//{print $4})# 提取内存剩余空间 mem_size$(free | awk /Mem/{print $4}) while : do # 注意内存和磁盘提取空间大小都…

C# 中 Interface(接口)和 virtual(虚方法)

文章目录 前言一、Interface&#xff08;接口&#xff09;1. 什么是接口2. 接口的定义3. 实现接口4. 接口的作用 二、virtual&#xff08;虚方法&#xff09;1. 什么是虚方法2. 虚方法的定义3. 重写虚方法4. 虚方法的作用 三、Interface 和 virtual 的结合使用1. 接口中的虚方法…