diff --git a/spring-boot-javacv/javacv-spring-boot-autoconfigure/src/main/java/in/hocg/boot/javacv/autoconfiguration/support/FeatureHelper.java b/spring-boot-javacv/javacv-spring-boot-autoconfigure/src/main/java/in/hocg/boot/javacv/autoconfiguration/support/FeatureHelper.java index faf2c63f..5fa8a1e2 100644 --- a/spring-boot-javacv/javacv-spring-boot-autoconfigure/src/main/java/in/hocg/boot/javacv/autoconfiguration/support/FeatureHelper.java +++ b/spring-boot-javacv/javacv-spring-boot-autoconfigure/src/main/java/in/hocg/boot/javacv/autoconfiguration/support/FeatureHelper.java @@ -4,8 +4,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.img.gif.AnimatedGifEncoder; import cn.hutool.core.io.FileUtil; +import in.hocg.boot.utils.function.ConsumerThrow; +import lombok.Cleanup; import lombok.SneakyThrows; import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; import org.bytedeco.ffmpeg.avcodec.AVPacket; import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.ffmpeg.global.avutil; @@ -14,25 +17,33 @@ import org.bytedeco.javacv.*; import org.bytedeco.opencv.global.opencv_core; import org.bytedeco.opencv.global.opencv_objdetect; -import org.bytedeco.opencv.opencv_core.IplImage; +import org.bytedeco.opencv.opencv_core.*; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.nio.Buffer; import java.nio.file.Path; import java.util.List; import java.util.Objects; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.BiFunction; +import static org.bytedeco.opencv.global.opencv_imgproc.INTER_CUBIC; +import static org.bytedeco.opencv.global.opencv_imgproc.resize; import static org.bytedeco.opencv.helper.opencv_imgcodecs.cvLoadImage; /** * Created by hocgin on 2022/3/29 * email: hocgin@gmail.com + * https://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html#resize * * @author hocgin */ +@Slf4j @UtilityClass public class FeatureHelper { @@ -98,7 +109,7 @@ public File mergeVideo(List files, File output, long passStart, long passE FFmpegFrameGrabber firstGrabber = new FFmpegFrameGrabber(firstFile); firstGrabber.start(); if (passStart > 0) { - firstGrabber.setTimestamp(passStart); + firstGrabber.setTimestamp(passStart, true); } FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(tempFile.toString(), firstGrabber.getImageWidth(), firstGrabber.getImageHeight(), firstGrabber.getAudioChannels()); @@ -114,36 +125,213 @@ public File mergeVideo(List files, File output, long passStart, long passE recorder.setVideoBitrate(bitrate); recorder.start(); - Frame frame; - long endTimestamp = firstGrabber.getLengthInTime() - passEnd; - while ((frame = firstGrabber.grabFrame()) != null) { - if (firstGrabber.getTimestamp() > endTimestamp) { - break; + AtomicLong timestamp = new AtomicLong(); + ConsumerThrow appendRecord = (FFmpegFrameGrabber grabber) -> { + long endTimestamp = grabber.getLengthInTime() - passEnd; + Frame frame; + if (passStart > 0) { + grabber.setTimestamp(passStart); } - recorder.record(frame); - } - firstGrabber.close(); + while ((frame = grabber.grabFrame()) != null) { + long grabberTimestamp = grabber.getTimestamp(); + if (grabberTimestamp > endTimestamp) { + grabber.setTimestamp(grabber.getLengthInTime(), true); + break; + } + recorder.setTimestamp(timestamp.get() + grabberTimestamp); + recorder.record(frame); + } + timestamp.addAndGet(endTimestamp); + grabber.close(); + }; + appendRecord.accept(firstGrabber); FFmpegFrameGrabber frameGrabber; for (File file : CollUtil.sub(files, 1, files.size())) { frameGrabber = new FFmpegFrameGrabber(file); frameGrabber.start(); - if (passStart > 0) { - frameGrabber.setTimestamp(passStart); - } - endTimestamp = frameGrabber.getLengthInTime() - passEnd; - while ((frame = frameGrabber.grabFrame()) != null) { - if (frameGrabber.getTimestamp() > endTimestamp) { - break; + appendRecord.accept(frameGrabber); + } + recorder.close(); + return output; + } + + @SneakyThrows + public File mergeVideoStyle2(List files, File output, long passStart, long passEnd) { + if (CollUtil.isEmpty(files)) { + return null; + } + Path tempFile = output.toPath(); + File firstFile = files.get(0); + + FFmpegFrameGrabber firstGrabber = new FFmpegFrameGrabber(firstFile); + firstGrabber.start(); + + int imageHeight = firstGrabber.getImageHeight(); + int imageWidth = firstGrabber.getImageWidth(); + BufferedImage bufferedImage = ImageUtils.getBlackBufferedImage(imageWidth, imageHeight); + + FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(tempFile.toString(), + imageWidth, imageHeight, firstGrabber.getAudioChannels()); + recorder.setVideoCodec(firstGrabber.getVideoCodec()); + recorder.setFormat("mp4"); + recorder.setFrameRate(firstGrabber.getFrameRate()); + recorder.setAudioCodec(firstGrabber.getAudioCodec()); + recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); + int bitrate = firstGrabber.getVideoBitrate(); + if (bitrate == 0) { + bitrate = firstGrabber.getAudioBitrate(); + } + recorder.setVideoBitrate(bitrate); + recorder.start(); + + Frame fillFrame = Java2DFrameUtils.toFrame(bufferedImage); + Buffer[] bgImage = fillFrame.image; + + ConsumerThrow appendRecord = (FFmpegFrameGrabber grabber) -> { + long lengthInTime = grabber.getLengthInTime(); + long endTimestamp = lengthInTime - passEnd; + Frame frame; + while ((frame = grabber.grab()) != null) { + long grabberTimestamp = grabber.getTimestamp(); + if (Objects.nonNull(frame.image)) { + if ((grabberTimestamp < passStart || grabberTimestamp > endTimestamp)) { + frame.image = bgImage; + frame.imageDepth = fillFrame.imageDepth; + frame.imageStride = fillFrame.imageStride; + frame.imageChannels = fillFrame.imageChannels; + } + recorder.recordImage(frame.imageWidth, frame.imageHeight, frame.imageDepth, frame.imageChannels, + frame.imageStride, grabber.getPixelFormat(), frame.image); + } + + if (Objects.nonNull(frame.samples)) { + recorder.recordSamples(frame.samples); } - recorder.record(frame); } - frameGrabber.close(); + grabber.close(); + }; + + appendRecord.accept(firstGrabber); + + FFmpegFrameGrabber frameGrabber; + for (File file : CollUtil.sub(files, 1, files.size())) { + log.debug("正在处理文件: {}", file.getName()); + frameGrabber = new FFmpegFrameGrabber(file); + frameGrabber.start(); + appendRecord.accept(frameGrabber); } recorder.close(); return output; } + /** + * 裁剪视频 + * + * @param tempFile + * @param scale 宽高比 + * @param output + * @return + */ + @SneakyThrows + public File trimVideo(File tempFile, double scale, File output) { + @Cleanup + FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(tempFile); + grabber.start(); + + + int imageHeight = grabber.getImageHeight(); + int imageWidth = grabber.getImageWidth(); + int width = imageWidth; + int height = imageHeight; + if (height > Convert.toInt(width / (scale))) { + height = Convert.toInt(width / (scale)); + } else if (width > Convert.toInt(height * (scale))) { + width = Convert.toInt(height * (scale)); + } + + int x = (imageWidth - width) / 2; + int y = (imageHeight - height) / 2; + + @Cleanup + FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, width, height, grabber.getAudioChannels()); + recorder.setVideoCodec(grabber.getVideoCodec()); + recorder.setFormat("mp4"); + recorder.setFrameRate(grabber.getFrameRate()); + recorder.setAudioCodec(grabber.getAudioCodec()); + recorder.setAudioBitrate(grabber.getAudioBitrate()); + recorder.setVideoBitrate(grabber.getVideoBitrate()); + recorder.setSampleRate(grabber.getSampleRate()); + recorder.start(); + + Frame frame; + while ((frame = grabber.grabFrame()) != null) { + if (frame.image != null) { + frame = Java2DFrameUtils.toFrame(Java2DFrameUtils.toMat(frame).apply(new Rect(x, y, width, height))); + } + recorder.record(frame); + } + return output; + } + + /** + * 自动填充最大边 + * + * @param tempFile + * @param maxWidth + * @param maxHeight + * @param output + * @return + */ + @SneakyThrows + public File fillVideo(File tempFile, int maxWidth, int maxHeight, File output) { + @Cleanup + FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(tempFile); + grabber.start(); + + int imageHeight = grabber.getImageHeight(); + int imageWidth = grabber.getImageWidth(); + double scale = new BigDecimal(imageHeight).divide(new BigDecimal(imageWidth), 2, RoundingMode.HALF_UP).doubleValue(); + Integer scaleHeight = Convert.toInt(maxWidth * scale); + Integer scaleWidth = Convert.toInt(maxHeight / scale); + + int diffWidth = Math.abs(maxWidth - scaleWidth); + int diffHeight = Math.abs(maxHeight - scaleHeight); + + int width = imageWidth; + int height = imageHeight; + if (diffWidth > diffHeight) { + width = maxWidth; + height = scaleHeight; + } else if (diffWidth < diffHeight) { + height = maxHeight; + width = scaleWidth; + } + + @Cleanup + FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, width, height, grabber.getAudioChannels()); + recorder.setVideoCodec(grabber.getVideoCodec()); + recorder.setFormat("mp4"); + recorder.setFrameRate(grabber.getFrameRate()); + recorder.setAudioCodec(grabber.getAudioCodec()); + recorder.setAudioBitrate(grabber.getAudioBitrate()); + recorder.setVideoBitrate(grabber.getVideoBitrate()); + recorder.setSampleRate(grabber.getSampleRate()); + recorder.start(); + + Frame frame; + while ((frame = grabber.grabFrame()) != null) { + if (frame.image != null) { + Mat mat = Java2DFrameUtils.toMat(frame); + Mat resizeMat = new Mat(); + resize(mat, resizeMat, new Size(width, height), 0, 0, INTER_CUBIC); + frame = Java2DFrameUtils.toFrame(resizeMat); + } + recorder.record(frame); + } + return output; + } + public File mergeVideo(File dir, File output) { return mergeVideo(List.of(FileUtil.ls(dir.getAbsolutePath())), output); } @@ -169,17 +357,25 @@ public File mergeAudio(List files, File output) { recorder.setFrameRate(firstGrabber.getFrameRate()); recorder.start(); - Frame frame; - while ((frame = firstGrabber.grabFrame()) != null) { - recorder.record(frame); - } + + AtomicLong timestamp = new AtomicLong(); + ConsumerThrow appendRecord = (FFmpegFrameGrabber grabber) -> { + long lengthInTime = grabber.getLengthInTime(); + Frame frame; + long grabberTimestamp = grabber.getTimestamp(); + while ((frame = grabber.grabFrame()) != null) { + recorder.setTimestamp(timestamp.get() + grabberTimestamp); + recorder.record(frame); + } + timestamp.addAndGet(lengthInTime); + grabber.close(); + }; + + appendRecord.accept(firstGrabber); for (File file : CollUtil.sub(files, 1, files.size())) { FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(file); frameGrabber.start(); - while ((frame = frameGrabber.grabFrame()) != null) { - recorder.record(frame); - } - frameGrabber.close(); + appendRecord.accept(frameGrabber); } recorder.close(); firstGrabber.close(); @@ -346,7 +542,8 @@ public void videoToRtmp(List videoFiles, String rtmpUrl) { public File subVideo(String video, long start, long end, File output) { FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(video); grabber.setOption("rtsp_transport", "tcp"); - grabber.setTimestamp(start); + grabber.setVideoTimestamp(start); + grabber.setAudioTimestamp(start); grabber.start(); FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, grabber.getImageWidth(), grabber.getImageHeight(), @@ -390,7 +587,8 @@ public File subVideo(File videoFile, long start, long end, File output) { public File snapshot(File videoFile, long timestamp, File output) { FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(videoFile); grabber.start(); - grabber.setTimestamp(timestamp); + grabber.setVideoTimestamp(timestamp); + grabber.setAudioTimestamp(timestamp); Frame frame = grabber.grabImage(); Java2DFrameConverter converter = new Java2DFrameConverter(); BufferedImage bufferedImage = converter.getBufferedImage(frame); @@ -528,7 +726,8 @@ public File toAudio(File video, File output) { public File toGif(File video, long start, long end, File output) { FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(video); - grabber.setTimestamp(start); + grabber.setVideoTimestamp(start); + grabber.setAudioTimestamp(start); grabber.start(); AnimatedGifEncoder en = new AnimatedGifEncoder(); @@ -551,4 +750,9 @@ public File toGif(File video, long start, long end, File output) { return output; } + public static void main(String[] args) { + + + } + } diff --git a/spring-boot-javacv/javacv-spring-boot-autoconfigure/src/main/java/in/hocg/boot/javacv/autoconfiguration/support/ImageUtils.java b/spring-boot-javacv/javacv-spring-boot-autoconfigure/src/main/java/in/hocg/boot/javacv/autoconfiguration/support/ImageUtils.java new file mode 100644 index 00000000..ffd2ea35 --- /dev/null +++ b/spring-boot-javacv/javacv-spring-boot-autoconfigure/src/main/java/in/hocg/boot/javacv/autoconfiguration/support/ImageUtils.java @@ -0,0 +1,63 @@ +package in.hocg.boot.javacv.autoconfiguration.support; + +import lombok.SneakyThrows; +import lombok.experimental.UtilityClass; + +import java.awt.*; +import java.awt.image.BufferedImage; + +/** + * Created by hocgin on 2022/4/11 + * email: hocgin@gmail.com + * + * @author hocgin + */ +@UtilityClass +public class ImageUtils { + + @SneakyThrows + public BufferedImage getBlackBufferedImage(int width, int height) { + String text = "未完待续"; + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + Graphics2D graphics = image.createGraphics(); + graphics.setBackground(Color.BLACK); + graphics.setColor(Color.BLACK); + graphics.fillRect(0, 0, width, height); + + Font font = new Font("Default", Font.BOLD, 35); + FontMetrics metrics = graphics.getFontMetrics(font); + graphics.drawRect(0, 0, width, height); + + int x = (width - metrics.stringWidth(text)) / 2; + int y = ((height - metrics.getHeight()) / 2) + metrics.getAscent(); + + graphics.setFont(font); + graphics.setColor(Color.WHITE); + graphics.drawString(text, x, y); + graphics.dispose(); + return image; + } + + @SneakyThrows + public BufferedImage getBlackBufferedImage(BufferedImage image) { + String text = "未完待续"; + int width = image.getWidth(); + int height = image.getHeight(); + Graphics2D graphics = image.createGraphics(); + graphics.setBackground(Color.BLACK); + graphics.setColor(Color.BLACK); + graphics.fillRect(0, 0, width, height); + + Font font = new Font("Default", Font.BOLD, 35); + FontMetrics metrics = graphics.getFontMetrics(font); + graphics.drawRect(0, 0, width, height); + + int x = (width - metrics.stringWidth(text)) / 2; + int y = ((height - metrics.getHeight()) / 2) + metrics.getAscent(); + + graphics.setFont(font); + graphics.setColor(Color.WHITE); + graphics.drawString(text, x, y); + return image; + } +} diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/ChangeLogMpe.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/ChangeLogMpe.java index 42aed457..6c50f62b 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/ChangeLogMpe.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/ChangeLogMpe.java @@ -1,6 +1,6 @@ package in.hocg.boot.mybatis.plus.extensions.changelog; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; /** * Created by hocgin on 2022/3/24 @@ -9,6 +9,6 @@ * @author hocgin */ public class ChangeLogMpe { - public static final String PACKAGE = GlobalConstants.PACKAGE_PREFIX + ".changelog"; + public static final String PACKAGE = MyBatisPlusExtensionsConstants.PACKAGE_PREFIX + ".changelog"; public static final String MAPPER_PACKAGE = ChangeLogMpe.PACKAGE + ".mapper"; } diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/entity/Change.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/entity/Change.java index d41b4a71..717eaf95 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/entity/Change.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/entity/Change.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import in.hocg.boot.mybatis.plus.autoconfiguration.core.struct.basic.enhance.CommonEntity; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -19,7 +19,7 @@ @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) public class Change extends CommonEntity { - public static final String TABLE_NAME = GlobalConstants.TABLE_PREFIX + "change"; + public static final String TABLE_NAME = MyBatisPlusExtensionsConstants.TABLE_PREFIX + "change"; @TableField("log_sn") private String logSn; diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/entity/ChangeField.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/entity/ChangeField.java index b7b019cb..f57c9a35 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/entity/ChangeField.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-change-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/changelog/entity/ChangeField.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import in.hocg.boot.mybatis.plus.autoconfiguration.core.struct.basic.enhance.CommonEntity; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -19,7 +19,7 @@ @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) public class ChangeField extends CommonEntity { - public static final String TABLE_NAME = GlobalConstants.TABLE_PREFIX + "change_field"; + public static final String TABLE_NAME = MyBatisPlusExtensionsConstants.TABLE_PREFIX + "change_field"; @TableField("change_id") private Long changeId; diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/ConfigMpe.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/ConfigMpe.java index 85ce352c..b007d5f7 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/ConfigMpe.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/ConfigMpe.java @@ -1,6 +1,6 @@ package in.hocg.boot.mybatis.plus.extensions.config; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; /** * Created by hocgin on 2022/3/24 @@ -9,7 +9,7 @@ * @author hocgin */ public class ConfigMpe { - public static final String PACKAGE = GlobalConstants.PACKAGE_PREFIX + ".config"; + public static final String PACKAGE = MyBatisPlusExtensionsConstants.PACKAGE_PREFIX + ".config"; public static final String MAPPER_PACKAGE = ConfigMpe.PACKAGE + ".mapper"; } diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigItem.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigItem.java index 8a8ebb20..ca931bd7 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigItem.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigItem.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import in.hocg.boot.mybatis.plus.autoconfiguration.core.struct.basic.enhance.CommonEntity; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -22,7 +22,7 @@ @Accessors(chain = true) @TableName(ConfigItem.TABLE_NAME) public class ConfigItem extends CommonEntity { - public static final String TABLE_NAME = GlobalConstants.TABLE_PREFIX + "config_item"; + public static final String TABLE_NAME = MyBatisPlusExtensionsConstants.TABLE_PREFIX + "config_item"; @ApiModelProperty @TableField("scope_id") diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigScope.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigScope.java index ad2bf91d..79fd1239 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigScope.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigScope.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import in.hocg.boot.mybatis.plus.autoconfiguration.core.struct.basic.enhance.CommonEntity; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -22,7 +22,7 @@ @Accessors(chain = true) @TableName(ConfigScope.TABLE_NAME) public class ConfigScope extends CommonEntity { - public static final String TABLE_NAME = GlobalConstants.TABLE_PREFIX + "config_scope"; + public static final String TABLE_NAME = MyBatisPlusExtensionsConstants.TABLE_PREFIX + "config_scope"; @ApiModelProperty @TableField("scope") diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigValue.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigValue.java index ee8e3d2b..8b9638f8 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigValue.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-config-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/config/entity/ConfigValue.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import in.hocg.boot.mybatis.plus.autoconfiguration.core.struct.basic.enhance.CommonEntity; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -22,7 +22,7 @@ @Accessors(chain = true) @TableName(ConfigValue.TABLE_NAME) public class ConfigValue extends CommonEntity { - public static final String TABLE_NAME = GlobalConstants.TABLE_PREFIX + "config_value"; + public static final String TABLE_NAME = MyBatisPlusExtensionsConstants.TABLE_PREFIX + "config_value"; @ApiModelProperty @TableField("item_id") diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-context/src/main/java/in/hocg/boot/mybatis/plus/extensions/context/constants/GlobalConstants.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-context/src/main/java/in/hocg/boot/mybatis/plus/extensions/context/constants/MyBatisPlusExtensionsConstants.java similarity index 56% rename from spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-context/src/main/java/in/hocg/boot/mybatis/plus/extensions/context/constants/GlobalConstants.java rename to spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-context/src/main/java/in/hocg/boot/mybatis/plus/extensions/context/constants/MyBatisPlusExtensionsConstants.java index 783622f2..841c05b4 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-context/src/main/java/in/hocg/boot/mybatis/plus/extensions/context/constants/GlobalConstants.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-context/src/main/java/in/hocg/boot/mybatis/plus/extensions/context/constants/MyBatisPlusExtensionsConstants.java @@ -6,8 +6,17 @@ * * @author hocgin */ -public class GlobalConstants { +public class MyBatisPlusExtensionsConstants { + /** + * 包前缀 + */ public static final String PACKAGE_PREFIX = "in.hocg.boot.mybatis.plus.extensions"; + /** + * 表前缀 + */ public static final String TABLE_PREFIX = "boot_"; - public static final String PROP_PREFIX = "boot.mybatis-plus.extensions"; + /** + * 配置前缀 + */ + public static final String PROPERTIES_PREFIX = "boot.mybatis-plus.extensions"; } diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/HttpLogMpe.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/HttpLogMpe.java index 8dab07cd..32086d0f 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/HttpLogMpe.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/HttpLogMpe.java @@ -1,6 +1,6 @@ package in.hocg.boot.mybatis.plus.extensions.httplog; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; /** * Created by hocgin on 2022/3/24 @@ -9,6 +9,6 @@ * @author hocgin */ public class HttpLogMpe { - public static final String PACKAGE = GlobalConstants.PACKAGE_PREFIX + ".httplog"; + public static final String PACKAGE = MyBatisPlusExtensionsConstants.PACKAGE_PREFIX + ".httplog"; public static final String MAPPER_PACKAGE = HttpLogMpe.PACKAGE + ".mapper"; } diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/entity/HttpLog.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/entity/HttpLog.java index 8dd1b276..5083cbde 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/entity/HttpLog.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/entity/HttpLog.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import in.hocg.boot.mybatis.plus.autoconfiguration.core.struct.basic.enhance.CommonEntity; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -21,7 +21,7 @@ @Accessors(chain = true) @TableName(HttpLog.TABLE_NAME) public class HttpLog extends CommonEntity { - public static final String TABLE_NAME = GlobalConstants.TABLE_PREFIX + "http_log"; + public static final String TABLE_NAME = MyBatisPlusExtensionsConstants.TABLE_PREFIX + "http_log"; @TableField("uri") private String uri; diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/pojo/ro/CreateLogRo.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/pojo/ro/CreateLogRo.java index 8a1199d3..fcf373fc 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/pojo/ro/CreateLogRo.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/pojo/ro/CreateLogRo.java @@ -30,4 +30,5 @@ public class CreateLogRo extends DoneLogRo { private LocalDateTime createdAt; private Long creator; + } diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/support/HttpLogUtils.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/support/HttpLogUtils.java index 7567c57e..4609342b 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/support/HttpLogUtils.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-http-log-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/httplog/support/HttpLogUtils.java @@ -28,6 +28,7 @@ import java.time.LocalDateTime; import java.util.Collections; import java.util.Map; +import java.util.Objects; import java.util.concurrent.Future; /** @@ -45,6 +46,10 @@ public HttpLogMpeService getHttpLogMpeService() { } public ThreeConsumerThrow getDefaultComplete() { + return getDefaultComplete(null); + } + + public ThreeConsumerThrow getDefaultComplete(ThreeConsumerThrow complete) { return (Serializable id, LogUtils.LogStatus status, T result) -> { if (LogUtils.LogStatus.Fail.equals(status)) { getHttpLogMpeService().asyncFail(id, result); @@ -55,6 +60,13 @@ public ThreeConsumerThrow getDefaultCom else { getHttpLogMpeService().asyncDone(id, status, StrUtil.toString(result)); } + if (Objects.nonNull(complete)) { + try { + complete.accept(id, status, result); + } catch (Exception e) { + log.error("执行补充操作失败", e); + } + } }; } @@ -120,7 +132,6 @@ public DoneLogRo response(HttpResponse response) { return result; } - public static void main(String[] args) { HttpRequest request = HttpUtil.createRequest(null, ""); HttpResponse result = LogUtils.logSync(request::execute, diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/TaskMpe.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/TaskMpe.java index 810fdd1c..8c496076 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/TaskMpe.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/TaskMpe.java @@ -1,6 +1,6 @@ package in.hocg.boot.mybatis.plus.extensions.task; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; /** * Created by hocgin on 2022/3/24 @@ -9,6 +9,6 @@ * @author hocgin */ public class TaskMpe { - public static final String PACKAGE = GlobalConstants.PACKAGE_PREFIX + ".task"; + public static final String PACKAGE = MyBatisPlusExtensionsConstants.PACKAGE_PREFIX + ".task"; public static final String MAPPER_PACKAGE = TaskMpe.PACKAGE + ".mapper"; } diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/autoconfiguration/TaskProperties.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/autoconfiguration/TaskProperties.java index 06b1413e..b7f433f7 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/autoconfiguration/TaskProperties.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/autoconfiguration/TaskProperties.java @@ -1,6 +1,6 @@ package in.hocg.boot.mybatis.plus.extensions.task.autoconfiguration; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; import lombok.Data; import lombok.experimental.Accessors; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -14,7 +14,7 @@ @Data @ConfigurationProperties(TaskProperties.PREFIX) public class TaskProperties { - public static final String PREFIX = GlobalConstants.PROP_PREFIX + ".task"; + public static final String PREFIX = MyBatisPlusExtensionsConstants.PROPERTIES_PREFIX + ".task"; /** * 执行器配置 diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskInfo.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskInfo.java index 298f7865..ae9fe1d8 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskInfo.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskInfo.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import in.hocg.boot.mybatis.plus.autoconfiguration.core.struct.basic.enhance.CommonEntity; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -19,7 +19,7 @@ @Accessors(chain = true) @TableName(TaskInfo.TABLE_NAME) public class TaskInfo extends CommonEntity { - public static final String TABLE_NAME = GlobalConstants.TABLE_PREFIX + "task_info"; + public static final String TABLE_NAME = MyBatisPlusExtensionsConstants.TABLE_PREFIX + "task_info"; @TableField("task_sn") private String taskSn; diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskItem.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskItem.java index d4df44fe..737db46c 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskItem.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskItem.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import in.hocg.boot.mybatis.plus.autoconfiguration.core.struct.basic.enhance.CommonEntity; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; import in.hocg.boot.utils.enums.ICode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -24,7 +24,7 @@ @Accessors(chain = true) @TableName(TaskItem.TABLE_NAME) public class TaskItem extends CommonEntity { - public static final String TABLE_NAME = GlobalConstants.TABLE_PREFIX + "task_item"; + public static final String TABLE_NAME = MyBatisPlusExtensionsConstants.TABLE_PREFIX + "task_item"; @TableField("task_id") private Long taskId; diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskItemLog.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskItemLog.java index 588e29f5..79419b68 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskItemLog.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-task-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/task/entity/TaskItemLog.java @@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import in.hocg.boot.mybatis.plus.autoconfiguration.core.struct.basic.enhance.CommonEntity; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -19,7 +19,7 @@ @Accessors(chain = true) @TableName(TaskItemLog.TABLE_NAME) public class TaskItemLog extends CommonEntity { - public static final String TABLE_NAME = GlobalConstants.TABLE_PREFIX + "task_item_log"; + public static final String TABLE_NAME = MyBatisPlusExtensionsConstants.TABLE_PREFIX + "task_item_log"; @TableField("task_item_id") private Long taskItemId; diff --git a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-tpl-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/tpl/TplMpe.java b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-tpl-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/tpl/TplMpe.java index 6c969b22..c5c437cb 100644 --- a/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-tpl-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/tpl/TplMpe.java +++ b/spring-boot-mybatis-plus/mybatis-plus-extensions/mybatis-plus-extensions-tpl-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/extensions/tpl/TplMpe.java @@ -1,6 +1,6 @@ package in.hocg.boot.mybatis.plus.extensions.tpl; -import in.hocg.boot.mybatis.plus.extensions.context.constants.GlobalConstants; +import in.hocg.boot.mybatis.plus.extensions.context.constants.MyBatisPlusExtensionsConstants; /** * Created by hocgin on 2022/3/24 @@ -9,6 +9,6 @@ * @author hocgin */ public class TplMpe { - public static final String PACKAGE = GlobalConstants.PACKAGE_PREFIX + ".tpl"; + public static final String PACKAGE = MyBatisPlusExtensionsConstants.PACKAGE_PREFIX + ".tpl"; public static final String MAPPER_PACKAGE = TplMpe.PACKAGE + ".mapper"; } diff --git a/spring-boot-samples/javacv-spring-boot-sample/src/test/java/in/hocg/boot/javacv/FeaturesTests.java b/spring-boot-samples/javacv-spring-boot-sample/src/test/java/in/hocg/boot/javacv/FeaturesTests.java index 25f7863d..997dd4f3 100644 --- a/spring-boot-samples/javacv-spring-boot-sample/src/test/java/in/hocg/boot/javacv/FeaturesTests.java +++ b/spring-boot-samples/javacv-spring-boot-sample/src/test/java/in/hocg/boot/javacv/FeaturesTests.java @@ -1,23 +1,31 @@ package in.hocg.boot.javacv; +import cn.hutool.core.convert.Convert; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.resource.ResourceUtil; import com.google.common.collect.Lists; import in.hocg.boot.javacv.autoconfiguration.support.FeatureHelper; +import in.hocg.boot.javacv.autoconfiguration.support.ImageUtils; import lombok.extern.slf4j.Slf4j; +import org.bytedeco.javacv.Frame; +import org.bytedeco.javacv.Java2DFrameUtils; import org.junit.Test; +import javax.imageio.ImageIO; import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * Created by hocgin on 2022/3/28 @@ -28,6 +36,11 @@ @Slf4j public class FeaturesTests { + @Test + public void test() throws IOException { + BufferedImage filePair = ImageUtils.getBlackBufferedImage(300, 300); + } + @Test public void png2Video() throws IOException { URL dir = ResourceUtil.getResource("image2video"); @@ -54,11 +67,51 @@ public void mergeVideo2() throws IOException { log.info("转换完成,路径:{}", path); } + @Test + public void mergeVideoStyle2() throws IOException { + Path dir = Paths.get("/Users/hocgin/Downloads/test"); + Path path = new File(dir.toString(), "mergeVideoStyle2.test.mp4").toPath(); + + List files = Lists.newArrayList(FileUtil.ls(dir.toString())).stream() + .filter(file -> file.getName().endsWith(".mp4")) + .filter(file -> !file.getName().contains("test.mp4")).collect(Collectors.toList()); + + FeatureHelper.mergeVideoStyle2(files, path.toFile(), 0, Convert.toLong(10 * 1000 * 1000)); + log.info("转换完成,路径:{}", path); + } + + @Test + public void trimVideo() throws IOException { + File file = new File("/Users/hocgin/Downloads/test/trim_7049587948383260000.mp4"); + FeatureHelper.trimVideo(new File("/Users/hocgin/Downloads/test/7049587948383260000.mp4"), 16.0 / 16, file); + log.info("转换完成,路径:{}", file.toPath()); + } + + @Test + public void fillVideo() throws IOException { + File file = new File("/Users/hocgin/Downloads/test/trim_7049587948383260000.mp4"); + FeatureHelper.fillVideo(new File("/Users/hocgin/Downloads/test/7049587948383260000.mp4"), 1920, 1080, file); + log.info("转换完成,路径:{}", file.toPath()); + } + + @Test + public void mergeVideo4() throws IOException { + Path dir = Paths.get("/Users/hocgin/Downloads/test"); + Path path = new File(dir.toString(), "mergeVideo4.test.mp4").toPath(); + + List files = Lists.newArrayList(FileUtil.ls(dir.toString())).stream() + .filter(file -> file.getName().endsWith(".mp4")) + .filter(file -> !file.getName().contains("test.mp4")).collect(Collectors.toList()); + + FeatureHelper.mergeVideo(files, path.toFile(), 0, Convert.toLong(10 * 1000 * 1000)); + log.info("转换完成,路径:{}", path); + } + @Test public void mergeAudio() throws IOException { URL dir = ResourceUtil.getResource("mergeAudio"); File firstFile = new File(dir.getPath()); - String suffix = FileUtil.getSuffix(firstFile); + String suffix = "mp3"; Path path = Files.createTempFile("test", "." + suffix); FeatureHelper.mergeAudio(firstFile, path.toFile()); log.info("转换完成,路径:{}", path); @@ -164,4 +217,11 @@ public void toGif() throws IOException { log.info("转换完成,路径:{}", path); } + public static void main(String[] args) throws IOException { + BufferedImage bf = ImageUtils.getBlackBufferedImage(400, 400); + Frame bgFrame = Java2DFrameUtils.toFrame(bf); + BufferedImage bufferedImage = Java2DFrameUtils.toBufferedImage(bgFrame); + ImageIO.write(bufferedImage, "png", new File("/Users/hocgin/Downloads/test.png")); + } + } diff --git a/spring-boot-utils/utils-base/src/main/java/in/hocg/boot/utils/function/ConsumerThrow.java b/spring-boot-utils/utils-base/src/main/java/in/hocg/boot/utils/function/ConsumerThrow.java new file mode 100644 index 00000000..8bfbab51 --- /dev/null +++ b/spring-boot-utils/utils-base/src/main/java/in/hocg/boot/utils/function/ConsumerThrow.java @@ -0,0 +1,18 @@ +package in.hocg.boot.utils.function; + +/** + * Created by hocgin on 2022/4/12 + * email: hocgin@gmail.com + * + * @author hocgin + */ +@FunctionalInterface +public interface ConsumerThrow { + + /** + * Performs this operation on the given argument. + * + * @param t the input argument + */ + void accept(T t) throws Exception; +}