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

java使用ws.schild.jave将视频转成mp4

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.tang</groupId><artifactId>media-converter</artifactId><version>1.0.0</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version></dependency><dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>2.7.3</version></dependency></dependencies><build><finalName>media-converter</finalName><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-clean-plugin</artifactId><version>2.5</version></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><appendAssemblyId>false</appendAssemblyId><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><mainClass>com.tang.MediaConverter</mainClass></manifest></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>assembly</goal></goals></execution></executions></plugin></plugins></build></project>

FileUtil

package com.tang;import lombok.extern.slf4j.Slf4j;import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 文件工具* @author tang*/
@Slf4j
public class FileUtil {public static boolean checkFileSize(File file, int size_MB) {long size = size_MB * 1024 * 1024;return file.length() > size ? false : true;}public static String resetPostfix(String sourcePath,String newPostfix) {String targetPath;int point_index = sourcePath.lastIndexOf(".");if (point_index != -1) {targetPath = sourcePath.substring(0, point_index) + "."+newPostfix;} else {targetPath = sourcePath + "."+newPostfix;}return targetPath;}public static String getFilePath(String absolutePath) {int lastIndexOf = absolutePath.lastIndexOf("/");if (lastIndexOf >= 0) {return absolutePath.substring(0, lastIndexOf + 1);}lastIndexOf = absolutePath.lastIndexOf("\\");if (lastIndexOf >= 0) {return absolutePath.substring(0, lastIndexOf + 1);}return absolutePath;}public static String getFilePostfix(File file) {String absolutePath = file.getAbsolutePath();int lastIndexOf = absolutePath.lastIndexOf(".");if (lastIndexOf >= 0) {return absolutePath.substring(lastIndexOf + 1);}return "";}public static String getFilePostfix(String path) {int lastIndexOf = path.lastIndexOf(".");if (lastIndexOf >= 0) {return path.substring(lastIndexOf + 1);}return "";}public static String getFileNameNotPostfix(File file) {String name = file.getName();int lastIndexOf = name.lastIndexOf(".");if (lastIndexOf >= 0) {return name.substring(0, lastIndexOf);}return "";}public static boolean exists(File file) {return file != null && file.exists();}public static boolean isCanWrite(File targetFile) {if (targetFile == null) {return false;}if (targetFile.isDirectory()) {return false;}if (!targetFile.exists()) {return true;}try (FileOutputStream fos = new FileOutputStream(targetFile, true)) {return true;} catch (Exception e) {return false;}}public static String readTextFile(File file) {return readTextFile(file, "UTF-8");}public static String readTextFile(File file, String code) {try {return new String(Files.readAllBytes(file.toPath()), code);} catch (Exception e) {log.error("error",e);}return null;}public static File createFile(String filePath) {File file = new File(filePath);if (file.exists()) {return file;}if (file.isDirectory()) {file.mkdirs();return file;}if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}try {file.createNewFile();} catch (Exception e) {log.error("error",e);}return file;}public static void saveTextFile(String filePath, String str) {saveTextFile(createFile(filePath), str);}public static void saveTextFile(File file, String str) {saveTextFile(file, str, "UTF-8");}public static void saveTextFile(File file, String str, String code) {try {Files.write(file.toPath(), str.getBytes(code), StandardOpenOption.CREATE);} catch (Exception e) {log.error("error",e);}}public static void deleteFile(File file) {if (!exists(file)) {return;}if (file.isDirectory()) {File[] listFiles = file.listFiles();for (int i = 0; i < listFiles.length; i++) {deleteFile(listFiles[i]);}// Files.delete(file.toPath());file.delete();} else {file.delete();}}public static void moveFile(File sourceFile, File targetFile) {if (!exists(sourceFile)) {return;}if (sourceFile.isDirectory()) {if (!targetFile.exists()) {targetFile.mkdirs();}File[] listFiles = sourceFile.listFiles();for (int i = 0; i < listFiles.length; i++) {File childTargetFile = new File(targetFile.getPath() + File.separator + listFiles[i].getName());moveFile(listFiles[i], childTargetFile);}sourceFile.delete();} else {try {if (!targetFile.getParentFile().exists()) {targetFile.getParentFile().mkdirs();}Files.move(sourceFile.toPath(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING);} catch (Exception e) {log.error("error",e);}}}public static void copyFile(File sourceFile, File targetFile) {if (!exists(sourceFile)) {return;}if (sourceFile.isDirectory()) {if (!targetFile.exists()) {targetFile.mkdirs();}File[] listFiles = sourceFile.listFiles();for (int i = 0; i < listFiles.length; i++) {File childTargetFile = new File(targetFile.getPath() + File.separator + listFiles[i].getName());copyFile(listFiles[i], childTargetFile);}} else {try {if (!targetFile.getParentFile().exists()) {targetFile.getParentFile().mkdirs();}Files.copy(sourceFile.toPath(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING);} catch (Exception e) {log.error("error",e);}}}public static Object copyOfDeep(Object obj) throws IOException, ClassNotFoundException{ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(obj);oos.close();ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);Object obj2 = ois.readObject();ois.close();return obj2;}public static byte[] readAllBytes(InputStream in, int initialSize) throws IOException {try (InputStream _in = in) {int capacity = initialSize;byte[] buf = new byte[capacity];int nread = 0;int rem = buf.length;for (int n = _in.read(buf, nread, rem); n > 0; n = _in.read(buf, nread, rem)) {nread += n;rem -= n;assert rem >= 0;if (rem == 0) {int newCapacity = capacity << 1;if (newCapacity < 0) {if (capacity == Integer.MAX_VALUE)throw new OutOfMemoryError("Required array size too large");newCapacity = Integer.MAX_VALUE;}rem = newCapacity - capacity;buf = Arrays.copyOf(buf, newCapacity);capacity = newCapacity;}}return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);} catch (IOException e) {throw e;}}public static String readAllString(InputStream in) throws IOException {return readAllString(in, Charset.forName("UTF-8"));}public static String readAllString(InputStream in, Charset code) throws IOException {if (code==null) {code=Charset.forName("UTF-8");}try (BufferedInputStream bis = new BufferedInputStream(in);InputStreamReader isr=new InputStreamReader(bis,code.newDecoder());BufferedReader reader = new BufferedReader (isr)) {StringBuffer sb = new StringBuffer();for (String line = reader.readLine();line != null;line = reader.readLine()) {sb.append(line);}return sb.toString();}}public static String readAllString(Reader r, int initialSize) throws IOException {try (BufferedReader br = new BufferedReader(r)) {StringBuffer sb = new StringBuffer();char[] b = new char[initialSize];for (int i = br.read(b); i > 0; i = br.read(b)) {sb.append(new String(b, 0, i));}return sb.toString();}}public static List<String> readAllLines(InputStream in, String code) throws IOException {try (Reader r = code == null ? new InputStreamReader(in) : new InputStreamReader(in, code)) {return readAllLines(r);}}public static List<String> readAllLines(Reader r) throws IOException {try (BufferedReader br = new BufferedReader(r)) {List<String> result = new ArrayList<>();for (String line = br.readLine(); line != null; line = br.readLine()) {result.add(line);}return result;}}
}

MediaUtil

package com.tang;import lombok.extern.slf4j.Slf4j;
import ws.schild.jave.*;import java.io.File;
/*** 视频转换工具* @author tang*/
@Slf4j
public class MediaUtil {public static MultimediaInfo getInfo(String sourcePath) {try {return new MultimediaObject(new File(sourcePath)).getInfo();} catch (Exception e) {log.error("获取多媒体信息报错:",e);return null;}}public static String saveOneImage(String sourcePath) {String imagePath = FileUtil.resetPostfix(sourcePath, "png");return saveOneImage(sourcePath, imagePath);}/*** 截取视频的一针作为封面图并保存到指定文件** @param sourcePath 视频文件路径* @param imagePath  截取图片保存路径*/public static String saveOneImage(String sourcePath, String imagePath) {try {MultimediaObject multimediaObject = new MultimediaObject(new File(sourcePath));VideoInfo videoInfo = multimediaObject.getInfo().getVideo();if (videoInfo != null) {// 第一个参数 视频源文件信息类// 第二个参数 截取的宽度// 第三个参数 截取的高度// 第四个参数 截取的是那一帧// 第五个参数是 截取的图片质量 1-31 数字越小质量越高new ScreenExtractor().renderOneImage(multimediaObject, videoInfo.getSize().getWidth(), videoInfo.getSize().getHeight(), 0, new File(imagePath), 31);log.info("获取视频封面图成功!");return "";} else {log.info("获取视频封面图失败:没有视频信息!");return "没有视频信息";}} catch (Exception e) {log.error("获取视频封面图失败:", e);return e.getMessage();}}public static String convertMediaToMp4(String sourcePath) {String targetPath = FileUtil.resetPostfix(sourcePath, "mp4");return convertMediaToMp4(sourcePath, targetPath);}public static String convertMediaToMp4(String sourcePath, String targetPath) {return convertMediaFormat(sourcePath, targetPath, "libmp3lame", "libx264", "mp4");}public static String convertMediaFormat(String sourcePath, String targetPath, String audioEncoder, String videoEncoder, String targetFormat) {try {File source = new File(sourcePath);File target = new File(targetPath);MultimediaObject multimediaObject = new MultimediaObject(source);MultimediaInfo info = multimediaObject.getInfo();logVideoInfo(info);VideoAttributes video = new VideoAttributes();video.setCodec(videoEncoder);video.setSize(info.getVideo().getSize());video.setBitRate(info.getVideo().getBitRate());video.setFrameRate((int) info.getVideo().getFrameRate());EncodingAttributes attrs = new EncodingAttributes();attrs.setFormat(targetFormat);attrs.setVideoAttributes(video);if(info.getAudio()!=null){AudioAttributes audio = new AudioAttributes();audio.setCodec(audioEncoder);audio.setChannels(info.getAudio().getChannels());audio.setBitRate(info.getAudio().getBitRate());audio.setSamplingRate(info.getAudio().getSamplingRate());attrs.setAudioAttributes(audio);}else{attrs.setAudioAttributes(null);}Encoder encoder = new Encoder();encoder.encode(multimediaObject, target, attrs);log.info("转换视频格式成功!");return "";} catch (Exception e) {log.error("转换视频格式发生错误:", e);return e.getMessage();}}private static void logVideoInfo(MultimediaInfo info) {log.info("原文件格式:" + info.getFormat());log.info("原播放时长:" + (info.getDuration() / 1000L / 60L) + "分钟");if(info.getAudio()!=null){log.info("原音频编码:" + info.getAudio().getDecoder());log.info("原音频频道:" + info.getAudio().getChannels());log.info("原音频比特率:" + (info.getAudio().getBitRate() / 1000) + "每秒");// 越大越清晰log.info("原音频帧率:" + info.getAudio().getSamplingRate());}else{log.info("无音频......");}log.info("原视频编码:" + info.getVideo().getDecoder());log.info("原视频宽高:" + info.getVideo().getSize().getWidth() + "," + info.getVideo().getSize().getHeight());log.info("原视频比特率:" + (info.getVideo().getBitRate() / 1000) + "每秒");// 越大越清晰log.info("原视频帧率:" + (info.getVideo().getFrameRate()));// 越高越连贯}public static void main(String[] args) {
//        convertMediaToMp4("D:\\desktop\\Video_2024-03-12_212432.wmv",true);saveOneImage("D:\\desktop\\Video_2024-03-12_212432.wmv");}
}

MediaConverter

package com.tang;import lombok.extern.slf4j.Slf4j;import javax.swing.*;
import java.awt.*;
import java.io.File;/*** 视频转换工具* @author tang*/
@Slf4j
public class MediaConverter  extends JFrame {JTextField sourcePathField;private MediaConverter() {setTitle("视频转换工具(by tzc)");setSize(600, 200);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JPanel root = new JPanel();setContentPane(root);root.setLayout(new BorderLayout());JPanel gridPanel = new JPanel();gridPanel.setLayout(new GridLayout(2,1));root.add(gridPanel, BorderLayout.CENTER);JPanel infoPanel1 = new JPanel();gridPanel.add(infoPanel1);infoPanel1.setLayout(new FlowLayout(FlowLayout.CENTER));infoPanel1.setBackground(Color.gray);infoPanel1.add(new JLabel("原视频:"));sourcePathField = new JTextField(40);sourcePathField.setText("");infoPanel1.add(sourcePathField);JButton selectFileBtn = new JButton("选择");selectFileBtn.addActionListener(e -> {JFileChooser fileChooser = new JFileChooser();int option = fileChooser.showDialog(MediaConverter.this, "选择要转换的视频文件");if(option==JFileChooser.APPROVE_OPTION){File file = fileChooser.getSelectedFile();String fileName = file.getAbsolutePath();sourcePathField.setText(fileName);}else{sourcePathField.setText("");}});infoPanel1.add(selectFileBtn);JPanel infoPanel2 = new JPanel();gridPanel.add(infoPanel2);infoPanel2.setLayout(new FlowLayout(FlowLayout.CENTER));infoPanel2.setBackground(Color.gray);JButton startBtn = new JButton("转换成MP4");startBtn.addActionListener(e -> {if(sourcePathField.getText().isEmpty()){JOptionPane.showMessageDialog(MediaConverter.this, "请选择视频文件!");return;}String err = MediaUtil.convertMediaToMp4(sourcePathField.getText());if(err.isEmpty()){JOptionPane.showMessageDialog(MediaConverter.this, "转换成功!");}else{JOptionPane.showMessageDialog(MediaConverter.this, "转换失败!");}});infoPanel2.add(startBtn);JButton cutImageBtn = new JButton("截取封面");cutImageBtn.addActionListener(e -> {if(sourcePathField.getText().isEmpty()){JOptionPane.showMessageDialog(MediaConverter.this, "请选择视频文件!");return;}String err = MediaUtil.saveOneImage(sourcePathField.getText());if(err.isEmpty()){JOptionPane.showMessageDialog(MediaConverter.this, "截取成功!");}else{JOptionPane.showMessageDialog(MediaConverter.this, "截取失败!");}});infoPanel2.add(cutImageBtn);}public static void main(String[] args) throws Exception {UIManager.setLookAndFeel(com.sun.java.swing.plaf.windows.WindowsLookAndFeel.class.getName());MediaConverter jFrame = new MediaConverter();jFrame.setVisible(true);}
}

相关文章:

java使用ws.schild.jave将视频转成mp4

<?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 http://…...

python map函数

python map函数 文章目录 python map函数 在Python中&#xff0c; map()函数用于将一个函数应用于可迭代对象&#xff08;如列表或元组&#xff09;中的每个元素&#xff0c;并返回一个包含结果的新的可迭代对象。 map()函数的语法如下&#xff1a; map(function, iterable)其…...

基于SSM的党务政务服务热线平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的党务政务服务热线平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spri…...

Unity3D 动态生成场景管理节点详解

前言 Unity3D 提供了丰富的功能和工具&#xff0c;可以帮助开发者快速高效地创建各种类型的游戏。在游戏开发过程中&#xff0c;有时候我们需要动态生成场景管理节点来管理游戏场景中的各种元素&#xff0c;比如角色、道具、敌人等。本文将详细介绍如何在Unity3D中动态生成场景…...

js--构造函数

创建对象的方式&#xff1a; 1、利用对象字面量{}创建 const arr {name: tom,age: 18 } 2、利用js内置构造&#xff08;Object&#xff0c;Array&#xff0c;String&#xff0c;Number&#xff09;函数 var obj new Object() //创建一个空的对象 obj.uname tom obj.age 2…...

Tomcat目录结构

文章目录 binconfliblogswebapp bin 存放tomcat的可执行程序 从上图可以看出bin中的文件主要是两种文件&#xff0c;一种是.bat一种是.sh .bat:主要用于windows .sh:主要用于linux .bat文件是Windows操作系统中的批处理文件。它是一种简单的文本文件&#xff0c;其中包含了一…...

读西游记第一回:西游记世界格局

天地之数&#xff1a; 元&#xff1a;十二万九千六百岁&#xff08;129600年&#xff09; 1元12会&#xff1a;子、丑、寅、卯、巳、午、未、申、酉、戌、亥。每会18000年。与12地支对应。 亥会期&#xff1a;前5400年混沌期&#xff0c;后5400年&#xff0c;盘古开天辟地&am…...

【Unity知识点详解】Button点击事件拓展,单击、双击、长按实现

Button拓展 今天来聊一下关于Button的事件拓展&#xff0c;这里只是拿Button来举例&#xff0c;Unity中其他的UI组件如Toggle、Slider等都也适用。 我们知道在Button中我们可以通过onClick的方式来添加点击事件&#xff0c;但在游戏开发过程中我们往往对Button有着更多的功能需…...

了解财富的本质才能知道自己几斤几两

生活在现代都市中&#xff0c;经历了经济的潮起潮落。在一望无际的楼宇下&#xff0c;是每天匆忙工作的一个个鲜活个体。有的在为了生存而工作&#xff0c;有的在享受着惬意的时光&#xff0c;有人行色匆匆&#xff0c;目光所及之处&#xff0c;尽是可遇不可求的机会。成为中产…...

机器学习模型—K最近邻(KNN)

机器学习模型—K最近邻(KNN) K最近邻 (KNN) 算法是一种用于解决分类和回归问题的监督机器学习方法。Evelyn Fix 和 Joseph Hodges 于 1951 年开发了该算法,随后 Thomas Cover 对其进行了扩展。本文探讨了 KNN 算法的基本原理、工作原理和实现。 虽然 k近邻算法 (KNN) 可以用…...

BUUCTF-----[CISCN 2019 初赛]Love Math

<?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (strlen($content) > 80) {die("太长了不会算");}$blacklist [ , \t, \r, \n…...

【前端】处理一次性十万条数据渲染方案(不考虑后端分页)

文章目录 一、定时渲染二、触底加载 一、定时渲染 思路&#xff1a;定时加载&#xff0c;分堆处理 1. 例如&#xff0c;前端请求到十五条数据以后&#xff0c;先不直接渲染&#xff0c;而是将这些数据分堆分批次渲染 2. 比如&#xff0c;一堆放10条数据&#xff0c;十万条数据…...

WPS 云文档保存在本地的地址如何从c盘更改为其他盘?

程序代码园发文地址&#xff1a;WPS 云文档保存在本地的地址如何从c盘更改为其他盘&#xff1f;-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,WPS 云文档保存在本地的地址如何从c盘更改为其他盘&#xff1f;http://www.byqws.com/blog/3146.html?…...

每日leetcode--接雨水

引言 接雨水问题是一个经典的算法问题&#xff0c;它要求我们计算给定一组不同高度的墙壁时&#xff0c;这些墙壁之间能够蓄积多少雨水。解决这个问题的方法有很多&#xff0c;其中一种常见的解法是通过辅助数组来记录每个位置的左右最大高度&#xff0c;并计算每个位置上方能…...

redis 性能优化一

目录 前言 尾延迟 前言 说到redis 性能优化&#xff0c;优化的目的是什么&#xff1f;提高响应&#xff0c;减少延迟。就要关注两点&#xff0c;一是尾延迟&#xff0c;二是Redis 的基线性能。只有指标&#xff0c;我们的优化&#xff0c;才有意义&#xff0c;才能做监控以及…...

柔性数组(变长数组)介绍

柔性数组简介 柔性数组&#xff0c;或称为可变长度数组&#xff0c;是一种在C语言结构体定义中使用的特殊数组&#xff0c;它允许结构体拥有一个可变大小的数组成员。柔性数组成员必须是结构体的最后一个成员&#xff0c;且它不占用结构体大小的计算&#xff0c;这使得可以动态…...

AMS、PMS和WMS学习链接

原文: Framework学习&#xff08;三&#xff09;之PMS、AMS、WMS_ams pms-CSDN博客 1:PackageMangerService&#xff08;PMS&#xff09;讲解博主 PMS系列我觉得csdn博主jeanboy讲的非常好&#xff0c;这里附上博主的博客链接jeanboy。这是一位资深级的博客专家。关于他PMS的讲…...

typedef 在枚举类型enum的使用方式

enum类型用途:为程序中的一组相关的常量取名字,以便以程序的可读性和维护性 方式一:typedef enum 变量名{E_XXXXX = 0,E_xxxx,E_XXXX_MAX }变量名_e; 方式二: typedef enum {E_xxxx = 0,E_xxxx,E_xxx_MAX}变量名_e;#include <stdio.h> typedef enum vii_vpp_mode {E_…...

DDD领域模型驱动

传统MVC架构 DDD架构: api层:api请求方式,透传【传递参数】,几个业务对应api 业务层:做编排,业务里要有哪些服务,执行顺序是什么,以及怎么做 领域层:负责领域内调用,然后领域怎么划分 Dao层:数据库操作【或者另外一个应用 数据源之类的】 遵守原则: ①允许跨层…...

基于pytest的证券清算系统功能测试工具开发

需求 1.造测试数据&#xff1a;根据测试需要&#xff0c;自动化构造各业务场景的中登清算数据与清算所需起来数据 2.测试清算系统功能&#xff1a; 自动化测试方案 工具设计 工具框架图 工具流程图 实现技术 python, pytest, allure, 多进程&#xff0c;mysql, 前端 效果 测…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...

Yii2项目自动向GitLab上报Bug

Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...