FFmpeg获取视频详情
话不多说,直接上代码:
pom依赖:
<!--视频多媒体工具包 包含 FFmpeg、OpenCV--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.3</version></dependency><!-- https://mvnrepository.com/artifact/commons-lang/commons-lang --><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.openjfx</groupId><artifactId>javafx-controls</artifactId><version>16</version></dependency>
工具类:
package com.example.mybatisdemo02.util;import com.example.mybatisdemo02.model.VideoInfoVO;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Stage;
import org.apache.commons.lang.StringUtils;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.Java2DFrameConverter;
import javafx.scene.control.Button;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.channels.FileChannel;
import java.util.UUID;public class FFmpegUtil {private static final String IMAGE_SUFFIX = "png";/*** 获取视频时长,单位为秒S* @return*/public static long getVideoTime( String localPath) throws FrameGrabber.Exception {
// String localPath = "C:/Users/Administrator/Desktop/dab2d14cad0244229e228e7bf297dd9a.flv";FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(localPath);grabber.start();long duration = grabber.getLengthInTime() / (1000 * 1000);grabber.stop();System.out.println("此视频时长(s/秒):"+duration);return duration;}/*** 获取视频帧图片* @param file 视频源* @param number 第几帧* @param dir 文件存放根目录* @param args 文件存放根目录* @return*/@SuppressWarnings("resource")public static String videoImage(File file, Integer number, String dir, String args) {String picPath = StringUtils.EMPTY;FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);try {ff.start();int i = 0;int length = ff.getLengthInFrames();Frame frame = null;while (i < length) {frame = ff.grabFrame();//截取第几帧图片if ((i > number) && (frame.image != null)) {//获取生成图片的路径picPath = getImagePath(args);//执行截图并放入指定位置doExecuteFrame(frame, dir + File.separator + picPath);break;}i++;}ff.stop();} catch (FrameGrabber.Exception e) {e.printStackTrace();}return picPath;}/*** 截取缩略图* @param frame* @param targerFilePath 图片存放路径*/public static void doExecuteFrame(Frame frame, String targerFilePath) {//截取的图片if (null == frame || null == frame.image) {return;}Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage srcImage = converter.getBufferedImage(frame);int srcImageWidth = srcImage.getWidth();int srcImageHeight = srcImage.getHeight();//对帧图片进行等比例缩放(缩略图)int width = 480;int height = (int) (((double) width / srcImageWidth) * srcImageHeight);BufferedImage thumbnailImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);thumbnailImage.getGraphics().drawImage(srcImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);File output = new File(targerFilePath);try {ImageIO.write(thumbnailImage, IMAGE_SUFFIX, output);} catch (IOException e) {e.printStackTrace();}}/*** 生成图片的相对路径* @param args 传入生成图片的名称、为空则用UUID命名* @return 例如 upload/images.png*/public static String getImagePath(String args) {if (StringUtils.isNotEmpty(args)) {return args + "." + IMAGE_SUFFIX;}return getUUID() + "." + IMAGE_SUFFIX;}/*** 生成唯一的uuid* @return uuid*/public static String getUUID(){return UUID.randomUUID().toString().replace("-","");}/*** 时长格式换算* @param duration 时长* @return HH:mm:ss*/public static String formatDuration(Long duration) {String formatTime = StringUtils.EMPTY;double time = Double.valueOf(duration);if (time > -1) {int hour = (int) Math.floor(time / 3600);int minute = (int) (Math.floor(time / 60) % 60);int second = (int) (time % 60);if (hour < 10) {formatTime = "0";}formatTime += hour + ":";if (minute < 10) {formatTime += "0";}formatTime += minute + ":";if (second < 10) {formatTime += "0";}formatTime += second;}return formatTime;}/*** 获取图片大小Kb* @param urlPath* @return*/public static String getImageSize(String urlPath){// 得到数据byte[] imageFromURL = getImageFromURL(urlPath);// 转换String byte2kb = bytes2kb(imageFromURL.length);return byte2kb;}/*** 根据图片地址获取图片信息** @param urlPath 网络图片地址* @return*/public static byte[] getImageFromURL(String urlPath) {// 字节数组byte[] data = null;// 输入流InputStream is = null;// Http连接对象HttpURLConnection conn = null;try {// Url对象URL url = new URL(urlPath);// 打开连接conn = (HttpURLConnection) url.openConnection();// 打开读取 写入是setDoOutput
// conn.setDoOutput(true);conn.setDoInput(true);// 设置请求方式conn.setRequestMethod("GET");// 设置超时时间conn.setConnectTimeout(6000);// 得到访问的数据流is = conn.getInputStream();// 验证访问状态是否是200 正常if (conn.getResponseCode() == 200) {data = readInputStream(is);} else {data = null;}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if (is != null) {// 关闭流is.close();}} catch (IOException e) {e.printStackTrace();}// 关闭连接conn.disconnect();}return data;}/*** 将流转换为字节** @param is* @return*/public static byte[] readInputStream(InputStream is) {/*** 捕获内存缓冲区的数据,转换成字节数组* ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。* 在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。*/ByteArrayOutputStream baos = new ByteArrayOutputStream();// 创建字节数组 1024 = 1Mbyte[] buffer = new byte[1024];// 防止无限循环int length = -1;try {// 循环写入数据到字节数组while ((length = is.read(buffer)) != -1) {baos.write(buffer, 0, length);}// 强制刷新,扫尾工作,主要是为了,让数据流在管道的传输工程中全部传输过去,防止丢失数据baos.flush();} catch (IOException e) {e.printStackTrace();}// 字节流转换字节数组byte[] data = baos.toByteArray();try {// 关闭读取流is.close();// 关闭写入流baos.close();} catch (IOException e) {e.printStackTrace();}return data;}/*** 获取本地图片的字节数** @param imgPath* @return*/public static String pathSize(String imgPath) {File file = new File(imgPath);FileInputStream fis;int fileLen = 0;try {fis = new FileInputStream(file);fileLen = fis.available();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return bytes2kb(fileLen);}/*** 将获取到的字节数转换为KB,MB模式** @param bytes* @return*/public static String bytes2kb(long bytes) {BigDecimal filesize = new BigDecimal(bytes);
// BigDecimal megabyte = new BigDecimal(1024 * 1024);
// float returnValue = filesize.divide(megabyte, 2, BigDecimal.ROUND_UP).floatValue();
// if (returnValue > 1)
// return (returnValue + "MB");
// BigDecimal kilobyte = new BigDecimal(1024);
// returnValue = filesize.divide(kilobyte, 2, BigDecimal.ROUND_UP).floatValue();
// return (returnValue + "KB");return filesize.toString();}public static String getImageFormat(String imagePath) throws IOException {// 字节数组byte[] data = null;String format = null;// 输入流InputStream is = null;// Http连接对象HttpURLConnection conn = null;ImageInputStream imageInputStream = null;try {// Url对象URL url = new URL(imagePath);// 打开连接conn = (HttpURLConnection) url.openConnection();// 打开读取 写入是setDoOutput
// conn.setDoOutput(true);conn.setDoInput(true);// 设置请求方式conn.setRequestMethod("GET");// 设置超时时间conn.setConnectTimeout(6000);// 得到访问的数据流is = conn.getInputStream();// 验证访问状态是否是200 正常if (conn.getResponseCode() == 200) {imageInputStream = ImageIO.createImageInputStream(is);ImageReader imageReader = ImageIO.getImageReaders(imageInputStream).next();format = imageReader.getFormatName();} else {format = null;}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if (is != null) {// 关闭流is.close();}if(imageInputStream != null){imageInputStream.close();}} catch (IOException e) {e.printStackTrace();}// 关闭连接conn.disconnect();}return format;}/*** 将inputStream转化为file* @param is* @param file 要输出的文件目录*/public static void inputStream2File(InputStream is, File file) throws IOException {OutputStream os = null;try {os = new FileOutputStream(file);int len = 0;byte[] buffer = new byte[8192];while ((len = is.read(buffer)) != -1) {os.write(buffer, 0, len);}} finally {os.close();is.close();}}/*** 获取视频详情* @param file* @return*/public static VideoInfoVO getVideoInfo(String file) {VideoInfoVO videoInfoVO = new VideoInfoVO();FFmpegFrameGrabber grabber = null;try {grabber = FFmpegFrameGrabber.createDefault(file);// 启动 FFmpeggrabber.start();// 读取视频帧数videoInfoVO.setLengthInFrames(grabber.getLengthInVideoFrames());// 读取视频帧率videoInfoVO.setFrameRate(grabber.getVideoFrameRate());// 读取视频秒数videoInfoVO.setDuration(grabber.getLengthInTime() / 1000000.00);// 读取视频宽度videoInfoVO.setWidth(grabber.getImageWidth());// 读取视频高度videoInfoVO.setHeight(grabber.getImageHeight());videoInfoVO.setAudioChannel(grabber.getAudioChannels());videoInfoVO.setVideoCode(grabber.getVideoCodecName());videoInfoVO.setAudioCode(grabber.getAudioCodecName());// String md5 = MD5Util.getMD5ByInputStream(new FileInputStream(file));videoInfoVO.setSampleRate(grabber.getSampleRate());return videoInfoVO;} catch (Exception e) {e.printStackTrace();return null;} finally {try {if (grabber != null) {// 此处代码非常重要,如果没有,可能造成 FFmpeg 无法关闭grabber.stop();grabber.release();}} catch (FFmpegFrameGrabber.Exception e) {e.printStackTrace();}}}/*** 截取视频获得指定帧的图片(截取视频帧封面)** @param video 源视频文件*/public void getVideoPic(InputStream video) {FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);try {ff.start();// 截取中间帧图片(具体依实际情况而定)int i = 0;int length = ff.getLengthInFrames();
// int middleFrame = length / 2;int middleFrame = 5;Frame frame = null;while (i < length) {frame = ff.grabFrame();if ((i > middleFrame) && (frame.image != null)) {break;}i++;}// 截取的帧图片Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage srcImage = converter.getBufferedImage(frame);int srcImageWidth = srcImage.getWidth();int srcImageHeight = srcImage.getHeight();BufferedImage image = new BufferedImage(srcImageWidth, srcImageHeight, BufferedImage.TYPE_INT_ARGB);Graphics2D g2d = image.createGraphics();g2d.setColor(Color.RED);g2d.fillRect(0, 0, srcImageWidth, srcImageHeight);g2d.setColor(Color.WHITE);g2d.drawString("Hello, World!", 50, 100);g2d.dispose();File file = new File("image.png");try {ImageIO.write(image, "png", file);} catch (IOException e) {e.printStackTrace();}ff.stop();} catch (java.lang.Exception e) {e.printStackTrace();System.out.println(e);}}/*** 获取文件大小* @param inputStream* @return*/public String getFileSize(InputStream inputStream){FileChannel fc = null;String size = "0";try {FileInputStream fis = convertToFileInputStream(inputStream);fc = fis.getChannel();BigDecimal fileSize = new BigDecimal(fc.size());size = String.valueOf(fileSize);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (null != fc) {try {fc.close();} catch (IOException e) {e.printStackTrace();}}}return size;}/*** inputStream转FileInputStream* @param inputStream* @return* @throws IOException*/public static FileInputStream convertToFileInputStream(InputStream inputStream) throws IOException {File tempFile = File.createTempFile("temp", ".tmp");tempFile.deleteOnExit();try (FileOutputStream outputStream = new FileOutputStream(tempFile)) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}return new FileInputStream(tempFile);}public void start(Stage primaryStage) {String videoPath = "C:\\Users\\DELL\\Desktop\\test.mp4";double position = 1200.0; // 播放位置(以秒为单位)// 创建媒体播放器Media media = new Media(new File(videoPath).toURI().toString());MediaPlayer mediaPlayer = new MediaPlayer(media);mediaPlayer.setOnReady(() -> {mediaPlayer.seek(mediaPlayer.getTotalDuration().multiply(position / mediaPlayer.getTotalDuration().toSeconds()));mediaPlayer.play();});mediaPlayer.setAutoPlay(true);// 创建媒体视图MediaView mediaView = new MediaView(mediaPlayer);// 创建控制按钮Button playButton = new Button("播放");Button pauseButton = new Button("暂停");Button stopButton = new Button("停止");// 播放按钮点击事件playButton.setOnAction(event -> mediaPlayer.play());// 暂停按钮点击事件pauseButton.setOnAction(event -> mediaPlayer.pause());// 停止按钮点击事件stopButton.setOnAction(event -> mediaPlayer.stop());// 创建音量调节滑块Slider volumeSlider = new Slider(0, 1, 0.5);volumeSlider.setPrefWidth(100);mediaPlayer.volumeProperty().bind(volumeSlider.valueProperty());// 创建按钮布局HBox buttonBox = new HBox(10);buttonBox.setAlignment(Pos.CENTER);buttonBox.getChildren().addAll(playButton, pauseButton, stopButton);// 创建根布局BorderPane root = new BorderPane();root.setCenter(mediaView);root.setBottom(volumeSlider);root.setTop(buttonBox);// 创建场景Scene scene = new Scene(root, 800, 600);// 设置舞台primaryStage.setScene(scene);primaryStage.setTitle("Video Player");primaryStage.show();}
}
实体VideoInfoVO类:
package com.example.mybatisdemo02.model;import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class VideoInfoVO {/*** 总帧数**/private int lengthInFrames;/*** 帧率**/private double frameRate;/*** 时长**/private double duration;/*** 视频编码*/private String videoCode;/*** 音频编码*/private String audioCode;private int width;private int height;private int audioChannel;private String md5;/*** 音频采样率*/private Integer sampleRate;private Double fileSize;public String toJson() {try {ObjectMapper objectMapper = new ObjectMapper();return objectMapper.writeValueAsString(this);} catch (Exception e) {return "";}}
}
调用:
public class Main {public static void main(String[] args) {VideoInfoVO videoInfoVO = FFmpegUtil.getVideoInfo("C:\\Users\\DELL\\Desktop\\test.mp4");int date = videoInfoVO.getLengthInFrames();double shichang = videoInfoVO.getDuration();System.out.println("帧数:"+date+"时长:"+shichang);}
}
结果如下图:

欢迎给个关注:

相关文章:
FFmpeg获取视频详情
话不多说,直接上代码: pom依赖: <!--视频多媒体工具包 包含 FFmpeg、OpenCV--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.3</versi…...
find: paths must precede expression
find: paths must precede expression 1. find: paths must precede expression2. 请在搜索字符串上添加单引号或者双引号References 1. find: paths must precede expression strongforeverstrong:~/ForeverStrong$ find /home/strong/ForeverStrong/image_results/ -name *.…...
RabbitMQ3.x之九_Docker中安装RabbitMQ
RabbitMQ3.x之_Docker中安装RabbitMQ 文章目录 RabbitMQ3.x之_Docker中安装RabbitMQ1. 官网2. 安装1 .拉取镜像2. 运行容器 3. 访问 1. 官网 rabbitmq - Official Image | Docker Hub 2. 安装 1 .拉取镜像 docker pull rabbitmq:3.13.0-management2. 运行容器 # latest Rabb…...
vue快速入门(四)v-html
注释很详细,直接上代码 上一篇 新增内容 使用v-html将文本以html的方式显示 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, …...
第19次修改了可删除可持久保存的前端html备忘录:换了一个特别的倒计时时钟
第19次修改了可删除可持久保存的前端html备忘录:换了一个特别的倒计时时钟 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><met…...
C++ 2024-4-1 作业
#include <iostream> using namespace std;class A { public:int a;A(int a):a(a){cout<<"A的有参构造"<<endl;} }; class B:virtual public A { public:int b;B(int a,int b):A(a),b(b){cout<<"B的有参构造"<<endl;} }; cl…...
【滑动窗口】Leetcode 串联所有单词的子串
题目解析 30. 串联所有单词的子串 本题的意思就是在目标串s中寻找能够找到的words字符串的全排列,返回起始位置 算法讲解 我们可以将这道题转化为寻找目标串的words字母的异位词,按照上一次讲解的【滑动窗口】Leetcode 找到字符串中所有字母异位词我们…...
golang channel实践代码及注意事项
在使用Go语言(Golang)的通道(Channel)时,有几个重要的注意点可以帮助开发者更安全、高效地使用它们进行并发编程。以下是一些关键的注意事项: 选择正确的通道类型:Go语言提供了两种类型的通道&…...
面试题:RabbitMQ 消息队列中间件
1. 确保消息不丢失 生产者确认机制 确保生产者的消息能到达队列,如果报错可以先记录到日志中,再去修复数据持久化功能 确保消息未消费前在队列中不会丢失,其中的交换机、队列、和消息都要做持久化消费者确认机制 由spring确认消息处理成功后…...
wpf中引用自定义字体
在WPF(Windows Presentation Foundation)中,FontFamily属性用于指定控件或文本元素使用的字体。它是一个非常基础且重要的属性,影响着用户界面的视觉呈现和可读性。以下是关于WPF中FontFamily属性的一些关键信息和使用方法&#x…...
高效准确!指甲剪盖片视觉检测技术解密
指甲剪的盖片是指指甲剪的一端,通常用来盖住另一端的刀刃部分。指甲剪盖片是指甲剪的重要部分,除了保护刀刃外,还起到美观和便捷的作用。正确使用和保养指甲剪盖片可以延长指甲剪的使用寿命。 本案是对指甲剪盖片最大尺寸长75mm*宽10mm*高3mm…...
分布式IO模块PLC扩展模拟量模块
BL200是一款结构紧凑、体积小的分布式IO耦合器,支持ModbusTCP协议,采用嵌入式硬件,主频380Mhz,基于LinuxOS,采用独特的MAC层数据交换技术的双网口技术实现级联,中间设备宕机不影响后面设备的数据传输,可支持高达32个AI、DI、DO、热电阻、热电偶、RS485等种类的IO板,广泛应用于工…...
Qt事件系统
第三章Qt事件系统 文章目录 第三章Qt事件系统1.事件系统事件是如何传递的事件类型事件处理发送事件 2.事件传播机制事件接受和忽略事件分发事件过滤 3.事件和信号的区别 1.事件系统 在Qt中,事件是派生抽象QEvent类的对象,它表示应用程序内发生的事情&am…...
C++STL--排序算法
sort 使用快速排序,平均性能好O(nlogn),但最差情况可能很差O(n^2)。不稳定。 sort(v.begin(),v.end());//对v容器进行排序,默认升序 sort(v.begin(),v.end(),greater<int>());//降序排序对于支持随机访问的迭代器的容器, 都可以利用sort算法直接对其进行排序…...
CEF的了解
(14 封私信 / 80 条消息) CEF和Electron的区别是什么? - 知乎 (zhihu.com) Electron面向的开发者:会用JavaScript,HTML,CSS,不会C CEF面向的开发者:会用JavaScript,HTML,CSS,会C (14 封私信 / 80 条消息) liulun - …...
基于OrangePi Zero2的智能家居项目(开发阶段)
智能家居项目的软件实现 紧接上文 基于OrangePi Zero2的智能家居项目(准备阶段)-CSDN博客 目录 一、项目整体设计 1.1项目整体设计 1.2具体划分 二、开发工作的前期准备 1、进行分类,并用Makefile文件进行管理 参考:自己创…...
数据结构记录
之前记录的数据结构笔记,不过图片显示不了了 数据结构与算法(C版) 1、绪论 1.1、数据结构的研究内容 一般应用步骤:分析问题,提取操作对象,分析操作对象之间的关系,建立数学模型。 1.2、基本概念和术语 数据&…...
从零到一:基于 K3s 快速搭建本地化 kubeflow AI 机器学习平台
背景 Kubeflow 是一种开源的 Kubernetes 原生框架,可用于开发、管理和运行机器学习工作负载,支持诸如 PyTorch、TensorFlow 等众多优秀的机器学习框架,本文介绍如何在 Mac 上搭建本地化的 kubeflow 机器学习平台。 注意:本文以 …...
kettle使用MD5加密增量获取接口数据
kettle使用MD5加密增量获取接口数据 场景介绍: 使用JavaScript组件进行MD5加密得到Http header,调用API接口增量获取接口数据,使用json input组件解析数据入库 案例适用范围: MD5加密可参考、增量过程可参考、调用API接口获取…...
PS入门|黑白色的图标怎么抠成透明背景
前言 抠图可以算是PS的入门必备操作,开始学习PS的小伙伴可以根据本帖子推荐一步步学习哦!但切勿心急~ 今天给小伙伴们带来:黑白色的图标抠图教程 抠图有很多种方法,但根据类型的不同,使用适当的方法很重…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
