优化minio工具类
集成webrtc-streamer部署启动
集成minio部署启动
集成mediaMtx部署启动
已添加2个文件
已修改6个文件
193 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/device/hiksdk/util/minio/MinioUtils.java 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/impl/MinioService.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/pagehelper/JpaPageHelper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/pagehelper/JpaPageInfo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/tools/CmdUtils.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/minio/minio.exe 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/util/minio/MinioUtils.java
@@ -1,5 +1,6 @@
package com.ruoyi.device.hiksdk.util.minio;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.device.hiksdk.config.MinioClientSingleton;
import io.minio.*;
@@ -32,6 +33,10 @@
    public static boolean exitsBucket(String bucketName) {
        boolean found = false;
        try {
            if(StringUtils.isEmpty(bucketName))
            {
                return false;
            }
            BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(bucketName).build();
            found = MinioClientSingleton.getMinioClient().bucketExists(bucketExistsArgs);
        } catch (Exception ex) {
@@ -45,6 +50,10 @@
     */
    public static boolean createBucket(String bucketName) {
        try {
            if(StringUtils.isEmpty(bucketName))
            {
                return false;
            }
            /*创建桶*/
            MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build();
            MinioClientSingleton.getMinioClient().makeBucket(makeBucketArgs);
@@ -133,6 +142,10 @@
                log.error("minio生成失效url异常", ex.getMessage());
            }
        }
        else
        {
            createBucket(bucketName);
        }
        return url;
    }
@@ -145,6 +158,10 @@
     * @修改人和其它信息
     */
    public static String putObjectAndGetUrl(String bucketName, MultipartFile file) {
         if(!exitsBucket(bucketName))
        {
            createBucket(bucketName);
        }
        //判断文件是否为空
        if (null == file || 0 == file.getSize()) {
            log.error("上传minio文件服务器错误,上传文件为空");
@@ -197,6 +214,10 @@
     * @修改人和其它信息
     */
    public static String putObjectAndGetUrl(String bucketName, String folder, MultipartFile file) {
        if(!exitsBucket(bucketName))
        {
            createBucket(bucketName);
        }
        //判断文件是否为空
        if (null == file || 0 == file.getSize()) {
            log.error("上传minio文件服务器错误,上传文件为空");
@@ -351,6 +372,10 @@
     */
    public static boolean uploadObject(String bucketName, String objectName, InputStream stream, long size, String contextType) {
        try {
            if(!exitsBucket(bucketName))
            {
                createBucket(bucketName);
            }
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
@@ -375,6 +400,10 @@
     */
    public static boolean uploadObject(String bucketName, String objectName, File file, String contextType) {
        try {
            if(!exitsBucket(bucketName))
            {
                createBucket(bucketName);
            }
            FileInputStream fileInputStream = new FileInputStream(file);
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(bucketName)
@@ -400,13 +429,9 @@
     */
    public static boolean uploadObject(String bucketName, String objectName, MultipartFile multipartFile, String contextType) {
        try {
            if (bucketName.isEmpty()) {
                log.error("bucket名称为空");
                return false;
            }
            if (objectName.isEmpty()) {
                log.error("对象名称为空");
                return false;
            if(!exitsBucket(bucketName))
            {
                createBucket(bucketName);
            }
            InputStream inputStream = multipartFile.getInputStream();
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
@@ -433,6 +458,10 @@
     */
    public static boolean uploadObject(String bucketName, MultipartFile multipartFile, String contextType) {
        try {
            if(!exitsBucket(bucketName))
            {
                createBucket(bucketName);
            }
            if (multipartFile == null) {
                log.error("上传文件为空");
                return false;
@@ -461,11 +490,11 @@
     * @param localFilePathName
     * @return
     */
    public static boolean uploadObject(String bulkName, String objectName, String localFilePathName, String contextType) {
    public static boolean uploadObject(String bucketName, String objectName, String localFilePathName, String contextType) {
        try {
            if (!exitsBucket(bulkName)) {
                log.debug(bulkName + "不存在");
                return false;
            if(!exitsBucket(bucketName))
            {
                createBucket(bucketName);
            }
            File file = new File(localFilePathName);
            if (!file.exists()) {
@@ -473,7 +502,7 @@
                return false;
            }
            UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder()
                    .bucket(bulkName)
                    .bucket(bucketName)
                    .object(objectName)
                    .filename(localFilePathName)
                    .contentType(contextType)
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
@@ -15,6 +15,7 @@
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.File;
@@ -33,18 +34,22 @@
 * @Version: 1.0
 **/
@Service
@Slf4j
@Slf4j(topic = "cmd")
public class MediaService implements IMediaService {
    @Resource
    MediaClient mediaClient;
    @Value("${mediamtx.host}")
    String mediamtxHost;
    @Value("${mediamtx.enabled}")
    Boolean mediamtxEnabled;
    String processName = "mediamtx.exe";
    @PostConstruct
    public void initMediaMtx() {
        if (mediamtxEnabled) {
        if (Platform.isWindows()) {
            String processName="mediamtx.exe";
            String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "mediamtx" + File.separator + "mediamtx.exe";
            String ymlPath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "mediamtx" + File.separator + "mediamtx.yml";
@@ -56,12 +61,22 @@
                CmdUtils.stopProcess(processName);
            }
            // å¯åŠ¨åŽå°è¿›ç¨‹
             CmdUtils.commandStart(processName,cmd);
                CmdUtils.commandStart(processName, cmd, null);
            // å¯åЍcmd窗口
//            String[] command = {"cmd","/c","start",exePath,ymlPath};
//            CmdUtils.commandStart(command);
        }
    }
    }
    @PreDestroy
    public void destroyMediaMtx() {
        log.info("销毁mediaMtx");
        if (CmdUtils.isProcessRunning(processName)) {
            // è¿›ç¨‹å·²ç»åœ¨è¿è¡Œï¼Œç»“束该进程
            CmdUtils.stopProcess(processName);
        }
    }
    @Override
    public String addPath(String name, String rtspPath, String mode) {
ard-work/src/main/java/com/ruoyi/media/service/impl/MinioService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.ruoyi.media.service.impl;
import com.ruoyi.utils.tools.CmdUtils;
import com.sun.jna.Platform;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @Description:
 * @ClassName: MinioService
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´08月04日10:32:40
 * @Version: 1.0
 **/
@Component
@Slf4j(topic = "cmd")
public class MinioService {
    String processName = "minio.exe";
    @Value("${minio.path}")
    String minioPath;
    @Value("${minio.accessKey}")
    String accessKey;
    @Value("${minio.secretKey}")
    String secretKey;
    @Value("${minio.enabled}")
    Boolean minioEnabled;
    @PostConstruct
    public void init() {
        if (minioEnabled) {
            if (Platform.isWindows()) {
                String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "minio" + File.separator + processName;
                List<String> cmd = new ArrayList<>();
                cmd.add(exePath);
                cmd.add("server");
                cmd.add(minioPath);
                if (CmdUtils.isProcessRunning(processName)) {
                    // è¿›ç¨‹å·²ç»åœ¨è¿è¡Œï¼Œç»“束该进程
                    CmdUtils.stopProcess(processName);
                }
                // å¯åŠ¨åŽå°è¿›ç¨‹
                Map<String, String> envMap = new HashMap<>();
                envMap.put("MINIO_ROOT_USER", accessKey);
                envMap.put("MINIO_ROOT_PASSWORD", secretKey);
                CmdUtils.commandStart(processName, cmd, envMap);
                // å¯åЍcmd窗口
//            String[] command = {"cmd", "/c", "start", exePath, "-H127.0.0.1:8000", "-o"};
//            CmdUtils.commandStart(command);
            }
        }
    }
    @PreDestroy
    public void destroyMediaMtx() {
        log.info("销毁minio");
        if (CmdUtils.isProcessRunning(processName)) {
            // è¿›ç¨‹å·²ç»åœ¨è¿è¡Œï¼Œç»“束该进程
            CmdUtils.stopProcess(processName);
        }
    }
}
ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java
@@ -2,9 +2,12 @@
import com.ruoyi.utils.tools.CmdUtils;
import com.sun.jna.Platform;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
@@ -20,25 +23,42 @@
 * @Version: 1.0
 **/
@Component
@Slf4j(topic = "cmd")
public class WebrtcService {
    String processName = "webrtc-streamer.exe";
    @Value("${webrtc.host}")
    String webrtcHost;
    @Value("${webrtc.enabled}")
    Boolean webrtcEnabled;
    @PostConstruct
    public void init() {
        if (webrtcEnabled) {
        if (Platform.isWindows()) {
            String processName = "webrtc-streamer.exe"; // æ›¿æ¢ä¸ºå®žé™…çš„exe程序名称
            String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "webrtc" + File.separator + processName;
            List<String> cmd = new ArrayList<>();
            cmd.add(exePath);
            cmd.add("-H127.0.0.1:8000");
                cmd.add("-H" + webrtcHost);
            cmd.add("-o");
            if (CmdUtils.isProcessRunning(processName)) {
                // è¿›ç¨‹å·²ç»åœ¨è¿è¡Œï¼Œç»“束该进程
                CmdUtils.stopProcess(processName);
            }
            // å¯åŠ¨åŽå°è¿›ç¨‹
             CmdUtils.commandStart(processName,cmd);
                CmdUtils.commandStart(processName, cmd, null);
            // å¯åЍcmd窗口
//            String[] command = {"cmd", "/c", "start", exePath, "-H127.0.0.1:8000", "-o"};
//            CmdUtils.commandStart(command);
        }
    }
}
    @PreDestroy
    public void destroyMediaMtx() {
        log.info("销毁webrtc-streamer");
        if (CmdUtils.isProcessRunning(processName)) {
            // è¿›ç¨‹å·²ç»åœ¨è¿è¡Œï¼Œç»“束该进程
            CmdUtils.stopProcess(processName);
        }
    }
}
ard-work/src/main/java/com/ruoyi/utils/pagehelper/JpaPageHelper.java
@@ -1,7 +1,7 @@
package com.ruoyi.utils.pagehelper;
/**
 * @Description:
 * @Description: åˆ†é¡µå¸®åŠ©ç±»
 * @ClassName: JpaPageHelper
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´07月31日10:42:16
ard-work/src/main/java/com/ruoyi/utils/pagehelper/JpaPageInfo.java
@@ -2,7 +2,7 @@
import java.util.List;
/**
 * @Description:
 * @Description: åˆ†é¡µä¿¡æ¯ç±»
 * @ClassName: JpaPageInfo
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´07月31日10:42:40
ard-work/src/main/java/com/ruoyi/utils/tools/CmdUtils.java
@@ -7,6 +7,7 @@
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
/**
 * @Description: cmd命令工具类
@@ -18,10 +19,20 @@
@Slf4j(topic = "cmd")
public class CmdUtils {
    //启动命令1
    public static void commandStart(String processName, List<String> command) {
        log.debug("启动外部程序:" + processName);
        command.forEach(v -> log.debug(v + " "));
    public static void commandStart(String processName, List<String> command, Map<String, String> env) {
        log.debug("启动外部程序:【" + processName+"】");
//        command.forEach(v -> log.debug(v + " "));
        log.debug(String.join(" ", command));
        ProcessBuilder builder = new ProcessBuilder();
        // èŽ·å–å­è¿›ç¨‹çš„çŽ¯å¢ƒå˜é‡æ˜ å°„
        if (env != null) {
            env.entrySet().forEach(entry -> {
                log.debug(entry.getKey() + ":" + entry.getValue());
            });
            Map<String, String> envMap = builder.environment();
            envMap.putAll(env);
        }
        //正常信息和错误信息合并输出
        builder.redirectErrorStream(true);
        builder.command(command);
@@ -36,7 +47,7 @@
//                System.out.println(line);
//            }
        } catch (IOException e) {
            e.printStackTrace();
            log.error("cmd异常:" + e.getMessage());
        }
    }
lib/minio/minio.exe
Binary files differ