From ba1e219d97e123b91657dc424f13a2fdeaa85d21 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: Mon, 21 Aug 2023 13:37:01 +0800
Subject: [PATCH] 修改兴趣点列表井号模糊查询

---
 ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java |  193 +++++++++++++++++++++++++++--------------------
 1 files changed, 111 insertions(+), 82 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
index 31a8fe7..5e61e05 100644
--- a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
+++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
@@ -6,6 +6,7 @@
 import com.ruoyi.media.service.IMediaService;
 import com.ruoyi.utils.forest.MediaClient;
 import com.ruoyi.utils.tools.ArdTool;
+import com.ruoyi.utils.tools.CmdUtils;
 import com.sun.jna.Platform;
 import io.minio.messages.Item;
 import lombok.extern.slf4j.Slf4j;
@@ -14,12 +15,15 @@
 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;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -32,58 +36,55 @@
  * @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 (Platform.isWindows()) {
-            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";
-            // 构建启动命令,使用cmd /c start命令来启动可执行程序并显示命令提示符窗口
-//                String[] cmd = {"cmd", "/c", "start", exePath,ymlPath};
-//                ProcessBuilder processBuilder = new ProcessBuilder(cmd);
-//                processBuilder.redirectErrorStream(true); // 将错误输出重定向到标准输出
-//                Process process = processBuilder.start();
-            // 如果你想等待程序完成
-            //  int exitCode = process.waitFor();
-            List<String> cmd = new ArrayList<>();
-            cmd.add(exePath);
-            cmd.add(ymlPath);
-            commandStart(cmd);
+        if (mediamtxEnabled) {
+            if (Platform.isWindows()) {
+                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";
 
+                List<String> cmd = new ArrayList<>();
+                cmd.add(exePath);
+                cmd.add(ymlPath);
+                if (CmdUtils.isProcessRunning(processName)) {
+                    // 进程已经在运行,结束该进程
+                    CmdUtils.stopProcess(processName);
+                }
+                // 启动后台进程
+                CmdUtils.commandStart(processName, cmd, null);
+                // 启动cmd窗口
+//            String[] command = {"cmd","/c","start",exePath,ymlPath};
+//            CmdUtils.commandStart(command);
+            }
         }
     }
-    public static void commandStart(List<String> command) {
-        command.forEach(v -> System.out.print(v + " "));
-        System.out.println();
-        System.out.println();
-        ProcessBuilder builder = new ProcessBuilder();
-        //正常信息和错误信息合并输出
-        builder.redirectErrorStream(true);
-        builder.command(command);
-        //开始执行命令
-        Process process = null;
-        try {
-            process = builder.start();
-            //如果你想获取到执行完后的信息,那么下面的代码也是需要的
-//            String line = "";
-//            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
-//            while ((line = br.readLine()) != null) {
-//                System.out.println(line);
-//            }
-        } catch (IOException e) {
-            e.printStackTrace();
+
+    @PreDestroy
+    public void destroyMediaMtx() {
+        if (mediamtxEnabled) {
+            log.info("销毁mediaMtx");
+            if (CmdUtils.isProcessRunning(processName)) {
+                // 进程已经在运行,结束该进程
+                CmdUtils.stopProcess(processName);
+            }
         }
     }
+
     @Override
-    public String addPath(String name, String rtspPath, String mode) {
-        String rtspUrl = "rtsp://" + mediamtxHost + ":7554/";
+    public String addPath(String name, String rtspPath, String mode, String isCode) {
+        String rtspUrl = "rtsp://" + mediamtxHost + ":7554/" + name;
         Conf mediaInfo = new Conf();
         //-vcodec libx264 //指定视频编码器为 libx264,使用 H.264 编码格式进行视频压缩
         //-preset ultrafast  //--preset的参数主要调节编码速度和质量的平衡,有ultrafast(转码速度最快,视频往往也最模糊)、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢
@@ -96,16 +97,20 @@
         String cmd = "ffmpeg -rtsp_transport tcp -i \"" + rtspPath + "\" -vcodec libx264 -preset:v ultrafast -r 25 -threads 4  -b:v 4096k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
         //GPU硬解码编码 -hwaccel cuvid -c:v h264_cuvid  使用cuda解码   -c:v h264_nvenc 使用cuda编码
         //String cmd = "ffmpeg -hwaccel cuvid -c:v h264_cuvid  -rtsp_transport udp  -i \"" + rtspPath + "\" -c:v h264_nvenc  -r 25 -threads 4  -b:v 4096k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
-
-        if (mode.equals("1")) {
-            mediaInfo.setRunondemand(cmd);
-            mediaInfo.setRunondemandrestart(true);
+        if (isCode.equals("1")) {
+            if (mode.equals("1")) {
+                mediaInfo.setRunondemand(cmd);
+                mediaInfo.setRunondemandrestart(true);
+            } else {
+                mediaInfo.setRunoninit(cmd);
+                mediaInfo.setRunoninitrestart(true);
+            }
         } else {
-            mediaInfo.setRunoninit(cmd);
-            mediaInfo.setRunoninitrestart(true);
+            mediaInfo.setSource(rtspPath);
         }
+        mediaInfo.setSourceprotocol("udp");
         mediaClient.addPath(name, mediaInfo);
-        return rtspUrl + name;
+        return rtspUrl;
     }
 
     @Override
@@ -129,6 +134,12 @@
         Matcher matcher = pattern.matcher(runoninit);
         if (matcher.find()) {
             info.setRtspSource(matcher.group());
+            info.setIsCode("1");
+        }
+        else
+        {
+            info.setRtspSource(item.getConf().getSource());
+            info.setIsCode("0");
         }
         return info;
     }
@@ -142,7 +153,6 @@
 
     @Override
     public List<StreamInfo> paths() {
-
         String list = mediaClient.paths();
         JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
         List<Items> items = jsonsRoot.getItems();
@@ -167,6 +177,10 @@
             Matcher matcher = pattern.matcher(runoninit);
             if (matcher.find()) {
                 info.setRtspSource(matcher.group());
+                info.setIsCode("1");
+            } else {
+                info.setRtspSource(item.getConf().getSource());
+                info.setIsCode("0");
             }
             //传输协议
             regex = "-rtsp_transport\\s+(\\w+)";
@@ -250,22 +264,30 @@
             String rtspUrl = "rtsp://" + mediamtxHost + ":7554/" + name;
             info.setRtspUrl(rtspUrl);
             Source source = item.getSource();
-            if (source == null) {
-                continue;
+            if (source==null||source.getId().equals("")) {
+                //会话ID
+                info.setId("0");
+                //上行流量
+                long bytesReceived = item.getBytesReceived();
+                String formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
+                info.setUpTraffic(formatReceivedSize);
+            } else {
+                RtspSession rtspSession = getRtspSessionById(source.getId());
+                //会话ID
+                info.setId(rtspSession.getId());
+                //开始推流时间
+                info.setBeginTime(rtspSession.getCreated());
+                //上行流量
+                long bytesReceived = rtspSession.getBytesReceived();
+                String formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
+                info.setUpTraffic(formatReceivedSize);
+                //下行流量
+                long bytesSent = rtspSession.getBytesSent();
+                String formatSentSize = ArdTool.formatFileSize(bytesSent);
+                info.setDownTraffic(formatSentSize);
+                //推流服务器
+                info.setRemoteAddr(rtspSession.getRemoteAddr());
             }
-            RtspSession rtspSession = getRtspSessionById(source.getId());
-            //会话ID
-            info.setId(rtspSession.getId());
-            //开始推流时间
-            info.setBeginTime(rtspSession.getCreated());
-            //上行流量
-            long bytesReceived = rtspSession.getBytesReceived();
-            String formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
-            info.setUpTraffic(formatReceivedSize);
-            //下行流量
-            long bytesSent = rtspSession.getBytesSent();
-            String formatSentSize = ArdTool.formatFileSize(bytesSent);
-            info.setDownTraffic(formatSentSize);
             //RTSP源地址
             String runondemand = item.getConf().getRunondemand();
             String runoninit;
@@ -280,18 +302,22 @@
             if (matcher.find()) {
                 info.setRtspSource(matcher.group());
             }
-            //传输协议
-            regex = "-rtsp_transport\\s+(\\w+)";
-            pattern = Pattern.compile(regex);
-            matcher = pattern.matcher(runoninit);
-            if (matcher.find()) {
-                info.setProtocol(matcher.group(1));
+            else
+            {
+                info.setRtspSource(item.getConf().getSource());
             }
+            //传输协议
+//            regex = "-rtsp_transport\\s+(\\w+)";
+//            pattern = Pattern.compile(regex);
+//            matcher = pattern.matcher(runoninit);
+//            if (matcher.find()) {
+//                info.setProtocol(matcher.group(1));
+//            }
+            info.setProtocol(item.getConf().getSourceprotocol());
             //拉流数量
             List<Readers> readers = item.getReaders();
             info.setNum(readers.size());
-            //推流服务器
-            info.setRemoteAddr(rtspSession.getRemoteAddr());
+
 
             PushStreamInfoList.add(info);
         }
@@ -305,15 +331,15 @@
         JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
         List<Items> items = jsonsRoot.getItems();
         for (Items item : items) {
-            StreamInfo info = new StreamInfo();
-            //ID
-            String name = item.getName();
-            info.setName(name);
-            //RTSP播放地址
-            String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name;
-            info.setRtspUrl(rtspUrl);
             List<Readers> readers = item.getReaders();
             for (Readers reader : readers) {
+                StreamInfo info = new StreamInfo();
+                //ID
+                String name = item.getName();
+                info.setName(name);
+                //RTSP播放地址
+                String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name;
+                info.setRtspUrl(rtspUrl);
                 RtspSession rtspSession = getRtspSessionById(reader.getId());
                 //会话ID
                 info.setId(rtspSession.getId());
@@ -329,18 +355,21 @@
                 info.setDownTraffic(formatSentSize);
 
                 //传输协议
-                String runoninit = item.getConf().getRunondemand();
-                String regex = "-rtsp_transport\\s+(\\w+)";
-                Pattern pattern = Pattern.compile(regex);
-                Matcher matcher = pattern.matcher(runoninit);
-                if (matcher.find()) {
-                    info.setProtocol(matcher.group(1));
-                }
+//                String runoninit = item.getConf().getRunondemand();
+//                String regex = "-rtsp_transport\\s+(\\w+)";
+//                Pattern pattern = Pattern.compile(regex);
+//                Matcher matcher = pattern.matcher(runoninit);
+//                if (matcher.find()) {
+//                    info.setProtocol(matcher.group(1));
+//                }
+                info.setProtocol(item.getConf().getSourceprotocol());
                 //拉流服务器
                 info.setRemoteAddr(rtspSession.getRemoteAddr());
                 PullStreamInfoList.add(info);
             }
         }
+        Comparator<StreamInfo> comparator = Comparator.comparing(streamInfo ->streamInfo.getBeginTime() ); // 使用Collections.sort方法进行排序 Collections.sort(personList, comparator);
+        Collections.sort(PullStreamInfoList, comparator.reversed());
         return PullStreamInfoList;
     }
 

--
Gitblit v1.9.3