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中, map()函数用于将一个函数应用于可迭代对象(如列表或元组)中的每个元素,并返回一个包含结果的新的可迭代对象。 map()函数的语法如下: map(function, iterable)其…...

基于SSM的党务政务服务热线平台(有报告)。Javaee项目。ssm项目。
演示视频: 基于SSM的党务政务服务热线平台(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spri…...
Unity3D 动态生成场景管理节点详解
前言 Unity3D 提供了丰富的功能和工具,可以帮助开发者快速高效地创建各种类型的游戏。在游戏开发过程中,有时候我们需要动态生成场景管理节点来管理游戏场景中的各种元素,比如角色、道具、敌人等。本文将详细介绍如何在Unity3D中动态生成场景…...
js--构造函数
创建对象的方式: 1、利用对象字面量{}创建 const arr {name: tom,age: 18 } 2、利用js内置构造(Object,Array,String,Number)函数 var obj new Object() //创建一个空的对象 obj.uname tom obj.age 2…...

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

读西游记第一回:西游记世界格局
天地之数: 元:十二万九千六百岁(129600年) 1元12会:子、丑、寅、卯、巳、午、未、申、酉、戌、亥。每会18000年。与12地支对应。 亥会期:前5400年混沌期,后5400年,盘古开天辟地&am…...
【Unity知识点详解】Button点击事件拓展,单击、双击、长按实现
Button拓展 今天来聊一下关于Button的事件拓展,这里只是拿Button来举例,Unity中其他的UI组件如Toggle、Slider等都也适用。 我们知道在Button中我们可以通过onClick的方式来添加点击事件,但在游戏开发过程中我们往往对Button有着更多的功能需…...
了解财富的本质才能知道自己几斤几两
生活在现代都市中,经历了经济的潮起潮落。在一望无际的楼宇下,是每天匆忙工作的一个个鲜活个体。有的在为了生存而工作,有的在享受着惬意的时光,有人行色匆匆,目光所及之处,尽是可遇不可求的机会。成为中产…...

机器学习模型—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); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (strlen($content) > 80) {die("太长了不会算");}$blacklist [ , \t, \r, \n…...
【前端】处理一次性十万条数据渲染方案(不考虑后端分页)
文章目录 一、定时渲染二、触底加载 一、定时渲染 思路:定时加载,分堆处理 1. 例如,前端请求到十五条数据以后,先不直接渲染,而是将这些数据分堆分批次渲染 2. 比如,一堆放10条数据,十万条数据…...

WPS 云文档保存在本地的地址如何从c盘更改为其他盘?
程序代码园发文地址:WPS 云文档保存在本地的地址如何从c盘更改为其他盘?-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,WPS 云文档保存在本地的地址如何从c盘更改为其他盘?http://www.byqws.com/blog/3146.html?…...
每日leetcode--接雨水
引言 接雨水问题是一个经典的算法问题,它要求我们计算给定一组不同高度的墙壁时,这些墙壁之间能够蓄积多少雨水。解决这个问题的方法有很多,其中一种常见的解法是通过辅助数组来记录每个位置的左右最大高度,并计算每个位置上方能…...

redis 性能优化一
目录 前言 尾延迟 前言 说到redis 性能优化,优化的目的是什么?提高响应,减少延迟。就要关注两点,一是尾延迟,二是Redis 的基线性能。只有指标,我们的优化,才有意义,才能做监控以及…...
柔性数组(变长数组)介绍
柔性数组简介 柔性数组,或称为可变长度数组,是一种在C语言结构体定义中使用的特殊数组,它允许结构体拥有一个可变大小的数组成员。柔性数组成员必须是结构体的最后一个成员,且它不占用结构体大小的计算,这使得可以动态…...
AMS、PMS和WMS学习链接
原文: Framework学习(三)之PMS、AMS、WMS_ams pms-CSDN博客 1:PackageMangerService(PMS)讲解博主 PMS系列我觉得csdn博主jeanboy讲的非常好,这里附上博主的博客链接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.造测试数据:根据测试需要,自动化构造各业务场景的中登清算数据与清算所需起来数据 2.测试清算系统功能: 自动化测试方案 工具设计 工具框架图 工具流程图 实现技术 python, pytest, allure, 多进程,mysql, 前端 效果 测…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...