‘liusuyi’
2023-09-09 71dbac60afa54d2642c3471c080686da56579ca0
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java
@@ -1,6 +1,8 @@
package com.ruoyi.media.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.media.domain.*;
import com.ruoyi.media.mapper.VtduMapper;
@@ -20,10 +22,7 @@
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -61,8 +60,13 @@
                mediaClient.removePath(path.getName());
            }
            List<Vtdu> vtduList = vtduMapper.selectVtduList(new Vtdu());
            for (Vtdu v : vtduList) {
                addPath(v.getName(), v.getRtspUrl(), v.getCodeType(), v.getIsCode());
            for (Vtdu vtdu : vtduList) {
                Map<String, String> map = addPath(vtdu.getName(), vtdu.getSourceUrl(), vtdu.getCodeType(), vtdu.getIsCode());
                vtdu.setRtspUrl(map.get("rtspUrl"));
                vtdu.setRtmpUrl(map.get("rtmpUrl"));
                vtdu.setWebrtcUrl(map.get("webrtcUrl"));
                vtdu.setUpdateTime(DateUtils.getNowDate());
                vtduMapper.updateVtdu(vtdu);
            }
        } catch (Exception ex) {
            log.error("加载流媒体列表异常:" + ex.getMessage());
@@ -105,8 +109,11 @@
    }
    @Override
    public String addPath(String name, String rtspPath, String mode, String isCode) {
    public Map<String,String> addPath(String name, String sourceUrl, String mode, String isCode) {
        String rtspUrl = "rtsp://" + mediamtxHost + ":7554/" + name;
        String rtmpUrl = "rtmp://" + mediamtxHost + ":1935/" + name;
        String webrtcUrl = "http://" + mediamtxHost + ":8889/" + name;
        Conf mediaInfo = new Conf();
        String rootPath = System.getProperty("user.dir").replaceAll("\\\\", "/") + "/lib/mediamtx/";
        //-vcodec libx264 //指定视频编码器为 libx264,使用 H.264 编码格式进行视频压缩
@@ -124,9 +131,9 @@
        //GPU硬解码编码 -hwaccel cuvid -c:v h264_cuvid  使用cuda解码   -c:v h264_nvenc 使用cuda编码
        //String cmd = rootPath  + "/lib/mediamtx/" + "ffmpeg -hwaccel cuvid -c:v h264_cuvid  -rtsp_transport udp  -i " + rtspPath + " -c:v h264_nvenc  -r 25 -threads 4  -b:v 2048k -bf 0 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
        if (isCode.equals("1")) {
            String cmd = rootPath + "ffmpeg -rtsp_transport tcp -i " + rtspPath + " -vcodec libx264 -preset:v ultrafast -r 25 -keyint_min 20 -g 20 -sc_threshold 0 -threads 6  -b:v 2048k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
            String cmd = rootPath + "ffmpeg -rtsp_transport tcp -i " + sourceUrl + " -vcodec libx264 -preset:v ultrafast -r 25 -keyint_min 25 -g 25 -sc_threshold 0 -threads 6  -b:v 4096k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
            if (!softwareDecoding) {
                cmd = rootPath + "ffmpeg -hwaccel cuvid -c:v h264_cuvid  -rtsp_transport tcp  -i " + rtspPath + " -c:v h264_nvenc  -r 25 -g 60 -threads 6  -b:v 2048k -bf 0 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
                cmd = rootPath + "ffmpeg -hwaccel cuvid -c:v h264_cuvid  -rtsp_transport tcp  -i " + sourceUrl + " -c:v h264_nvenc  -r 25 -g 60 -threads 6  -b:v 4096k -bf 0 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
            }
            if (mode.equals("0")) {
                mediaInfo.setRunondemand(cmd);
@@ -134,13 +141,20 @@
            } else {
                mediaInfo.setRunoninit(cmd);
                mediaInfo.setRunoninitrestart(true);
                //mediaInfo.setRunonready(cmd);
                //mediaInfo.setRunonreadyrestart(true);
            }
        } else {
            mediaInfo.setSource(rtspPath);
            mediaInfo.setSource(sourceUrl);
        }
        mediaInfo.setMaxReaders(100);
        mediaInfo.setSourceprotocol("tcp");
        mediaClient.addPath(name, mediaInfo);
        return rtspUrl;
        Map<String,String> map=new HashMap<>();
        map.put("rtspUrl",rtspUrl);
        map.put("rtmpUrl",rtmpUrl);
        map.put("webrtcUrl",webrtcUrl);
        return map;
    }
    @Override
@@ -149,19 +163,17 @@
        StreamInfo info = new StreamInfo();
        //ID
        info.setName(name);
        String runoninit;
        String runondemand = item.getConf().getRunondemand();
        if (StringUtils.isNotEmpty(runondemand)) {
            runoninit = item.getConf().getRunondemand();
        String runOn;
        if (StringUtils.isNotEmpty(item.getConf().getRunondemand())) {
            runOn = item.getConf().getRunondemand();
            info.setMode("0");
        } else {
            runoninit = item.getConf().getRunoninit();
            //runOn = item.getConf().getRunonready();
            runOn = item.getConf().getRunoninit();
            info.setMode("1");
        }
        //RTSP源地址
        String regex = "rtsp://[^\\s\"]+";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(runoninit);
        Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn);
        if (matcher.find()) {
            info.setRtspSource(matcher.group());
            info.setIsCode("1");
@@ -190,19 +202,17 @@
            //ID
            String name = item.getName();
            info.setName(name);
            String runoninit;
            String runondemand = item.getConf().getRunondemand();
            if (StringUtils.isNotEmpty(runondemand)) {
                runoninit = item.getConf().getRunondemand();
            String runOn;
            if (StringUtils.isNotEmpty(item.getConf().getRunondemand())) {
                runOn = item.getConf().getRunondemand();
                info.setMode("0");
            } else {
                runoninit = item.getConf().getRunoninit();
                runOn = item.getConf().getRunoninit();
                //runOn = item.getConf().getRunonready();
                info.setMode("1");
            }
            //RTSP源地址
            String regex = "rtsp://[^\\s\"]+";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(runoninit);
            Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn);
            if (matcher.find()) {
                info.setRtspSource(matcher.group());
                info.setIsCode("1");
@@ -211,9 +221,7 @@
                info.setIsCode("0");
            }
            //传输协议
            regex = "-rtsp_transport\\s+(\\w+)";
            pattern = Pattern.compile(regex);
            matcher = pattern.matcher(runoninit);
            matcher = Pattern.compile("-rtsp_transport\\s+(\\w+)").matcher(runOn);
            if (matcher.find()) {
                info.setProtocol(matcher.group(1));
            }
@@ -296,16 +304,14 @@
                info.setRemoteAddr(rtspSession.getRemoteAddr());
            }
            //RTSP源地址
            String runondemand = item.getConf().getRunondemand();
            String runoninit;
            if (StringUtils.isNotEmpty(runondemand)) {
                runoninit = item.getConf().getRunondemand();
            String runOn;
            if (StringUtils.isNotEmpty(item.getConf().getRunondemand())) {
                runOn = item.getConf().getRunondemand();
            } else {
                runoninit = item.getConf().getRunoninit();
                runOn = item.getConf().getRunoninit();
                //runOn = item.getConf().getRunonready();
            }
            String regex = "rtsp://[^\\s\"]+";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(runoninit);
            Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn);
            if (matcher.find()) {
                info.setRtspSource(matcher.group());
            } else {
@@ -316,7 +322,6 @@
            //拉流数量
            List<Readers> readers = item.getReaders();
            info.setNum(readers.size());
            PushStreamInfoList.add(info);
        }