From dab37ef8c41decd4a26468ebd9fe77093051b996 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期二, 29 八月 2023 17:12:29 +0800
Subject: [PATCH] 更新流媒体mediaMTX版本V1.0.0
---
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java | 251 +++++++++++++++++++++++++++++++------------------
1 files changed, 159 insertions(+), 92 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 9852e1d..c9bc8b8 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
@@ -2,25 +2,22 @@
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.media.domain.*;
+import com.ruoyi.media.mapper.VtduMapper;
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.ruoyi.utils.process.CmdUtils;
import com.sun.jna.Platform;
-import io.minio.messages.Item;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Async;
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;
@@ -38,13 +35,16 @@
@Service
@Slf4j(topic = "cmd")
public class MediaService implements IMediaService {
-
+ @Resource
+ VtduMapper vtduMapper;
@Resource
MediaClient mediaClient;
@Value("${mediamtx.host}")
String mediamtxHost;
@Value("${mediamtx.enabled}")
Boolean mediamtxEnabled;
+ @Value("${mediamtx.software_decoding}")
+ Boolean softwareDecoding;
String processName = "mediamtx.exe";
@@ -69,6 +69,15 @@
// CmdUtils.commandStart(command);
}
}
+ List<StreamInfo> paths = paths();
+ for(StreamInfo path:paths)
+ {
+ mediaClient.removePath(path.getName());
+ }
+ List<Vtdu> vtduList = vtduMapper.selectVtduList(new Vtdu());
+ for (Vtdu v : vtduList) {
+ addPath(v.getName(), v.getRtspUrl(), v.getCodeType(), v.getIsCode());
+ }
}
@PreDestroy
@@ -86,18 +95,24 @@
public String addPath(String name, String rtspPath, String mode, String isCode) {
String rtspUrl = "rtsp://" + mediamtxHost + ":7554/" + name;
Conf mediaInfo = new Conf();
+ String rootPath = System.getProperty("user.dir").replaceAll("\\\\", "/");
//-vcodec libx264 //鎸囧畾瑙嗛缂栫爜鍣ㄤ负 libx264锛屼娇鐢� H.264 缂栫爜鏍煎紡杩涜瑙嗛鍘嬬缉
//-preset ultrafast //--preset鐨勫弬鏁颁富瑕佽皟鑺傜紪鐮侀�熷害鍜岃川閲忕殑骞宠 锛屾湁ultrafast锛堣浆鐮侀�熷害鏈�蹇紝瑙嗛寰�寰�涔熸渶妯$硦锛夈�乻uperfast銆乿eryfast銆乫aster銆乫ast銆乵edium銆乻low銆乻lower銆乿eryslow銆乸lacebo杩�10涓�夐」锛屼粠蹇埌鎱�
//-r 25 //璁剧疆杈撳嚭瑙嗛鐨勫抚鐜囦负 25 甯�/绉�
//-rtsp_transport tcp //杩欎釜閫夐」鍛婅瘔 FFmpeg 浣跨敤 TCP 浣滀负 RTSP 鐨勪紶杈撳崗璁�
//-threads 4: 鎸囧畾瑕佷娇鐢ㄧ殑绾跨▼鏁颁负 4銆�//杩欏厑璁� FFmpeg 鍦ㄥ鏍稿鐞嗗櫒涓婁娇鐢ㄥ涓嚎绋嬫潵杩涜瑙嗛缂栫爜锛屼互鍔犲揩閫熷害銆�
// -i //鐢ㄤ簬鎸囧畾杈撳叆濯掍綋鏂囦欢鎴栬緭鍏ユ祦鐨勫湴鍧�
+ // -bf 0 绂佺敤B甯э紝鍥犱负webrtc鍦ㄧ綉椤佃皟鐢ㄦ椂鎺у埗鍙颁竴鐩磋緭鍑� WebRTC doesn鈥檛 support H264 streams with B-frames
//-f rtsp //杩欎釜閫夐」鍛婅瘔 FFmpeg 杈撳嚭涓� RTSP 鏍煎紡銆�
//CPU杞В鐮佺紪鐮�
- 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";
+ //String cmd = rootPath + "/lib/mediamtx/" +"ffmpeg -rtsp_transport tcp -i " + rtspPath + " -vcodec libx264 -preset:v ultrafast -r 25 -threads 4 -b:v 2048k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
//GPU纭В鐮佺紪鐮� -hwaccel cuvid -c:v h264_cuvid 浣跨敤cuda瑙g爜 -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";
+ //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 + "/lib/mediamtx/" + "ffmpeg -rtsp_transport tcp -i " + rtspPath + " -vcodec libx264 -preset:v ultrafast -r 25 -threads 4 -b:v 2048k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH";
+ if (!softwareDecoding) {
+ 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 (mode.equals("1")) {
mediaInfo.setRunondemand(cmd);
mediaInfo.setRunondemandrestart(true);
@@ -135,9 +150,7 @@
if (matcher.find()) {
info.setRtspSource(matcher.group());
info.setIsCode("1");
- }
- else
- {
+ } else {
info.setRtspSource(item.getConf().getSource());
info.setIsCode("0");
}
@@ -169,7 +182,7 @@
info.setMode("1");
} else {
runoninit = item.getConf().getRunoninit();
- info.setMode("2");
+ info.setMode("0");
}
//RTSP婧愬湴鍧�
String regex = "rtsp://[^\\s\"]+";
@@ -195,19 +208,6 @@
return pathInfoList;
}
- @Override
- public List<Items> rtspconns() {
- String list = mediaClient.rtspconns();
- JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
- return jsonsRoot.getItems();
- }
-
- @Override
- public List<Items> rtspsessions() {
- String list = mediaClient.rtspsessions();
- JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
- return jsonsRoot.getItems();
- }
@Override
public RtspSession getRtspSessionById(String sessionId) {
@@ -217,38 +217,24 @@
}
@Override
- public List<RtspSession> getPushStreams() {
- List<RtspSession> rtspSessions = new ArrayList<>();
-
- String list = mediaClient.paths();
- JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
- List<Items> items = jsonsRoot.getItems();
- for (Items item : items) {
- Source source = item.getSource();
- RtspSession rtspSession = getRtspSessionById(source.getId());
- rtspSession.setName(item.getName());
- rtspSessions.add(rtspSession);
- }
- return rtspSessions;
+ public WebrtcSession getWebrtcSessionById(String sessionId) {
+ String list = mediaClient.getWebrtcsessionById(sessionId);
+ WebrtcSession webrtcSession = JSONObject.parseObject(list, WebrtcSession.class);
+ return webrtcSession;
}
@Override
- public List<RtspSession> getPullStreams() {
- List<RtspSession> rtspSessions = new ArrayList<>();
- String list = mediaClient.paths();
- JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
- List<Items> items = jsonsRoot.getItems();
- for (Items item : items) {
- List<Readers> readers = item.getReaders();
- for (Readers reader : readers) {
- RtspSession rtspSession = getRtspSessionById(reader.getId());
- rtspSession.setName(item.getName());
- rtspSessions.add(rtspSession);
- }
- }
- return rtspSessions;
+ public RtmpSession getRtmpSessionById(String sessionId) {
+ String list = mediaClient.getRtmpsessionById(sessionId);
+ RtmpSession rtmpSession = JSONObject.parseObject(list, RtmpSession.class);
+ return rtmpSession;
}
+ /**
+ * 鑾峰彇鎺ㄦ祦鍒楄〃
+ * 鍒樿嫃涔�
+ * 2023/8/29 9:37:05
+ */
@Override
public List<StreamInfo> getPushStreamList() {
List<StreamInfo> PushStreamInfoList = new ArrayList<>();
@@ -260,11 +246,17 @@
//ID
String name = item.getName();
info.setName(name);
+ //RTMP鎾斁鍦板潃
+ String rtmpUrl = "rtmp://" + mediamtxHost + ":1935/" + name;
+ info.setRtmpUrl(rtmpUrl);
//RTSP鎾斁鍦板潃
String rtspUrl = "rtsp://" + mediamtxHost + ":7554/" + name;
info.setRtspUrl(rtspUrl);
+ //WEBRTC鎾斁鍦板潃
+ String webrtcUrl = "http://" + mediamtxHost + ":8889/" + name;
+ info.setWebrtcUrl(webrtcUrl);
Source source = item.getSource();
- if (source.getId().equals("")) {
+ if (source == null || source.getId().equals("")) {
//浼氳瘽ID
info.setId("0");
//涓婅娴侀噺
@@ -301,18 +293,10 @@
Matcher matcher = pattern.matcher(runoninit);
if (matcher.find()) {
info.setRtspSource(matcher.group());
- }
- else
- {
+ } 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();
@@ -324,6 +308,11 @@
return PushStreamInfoList;
}
+ /**
+ * 鑾峰彇鎷夋祦鍒楄〃
+ * 鍒樿嫃涔�
+ * 2023/8/29 9:37:05
+ */
@Override
public List<StreamInfo> getPullStreamList() {
List<StreamInfo> PullStreamInfoList = new ArrayList<>();
@@ -337,46 +326,124 @@
//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());
- //寮�濮嬫媺娴佹椂闂�
- 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);
-
//浼犺緭鍗忚
-// 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);
+
+ String type = reader.getType();
+ switch (type) {
+ case "rtmpConn":
+ info.setSessionType("rtmp");
+ //webrtc鎾斁鍦板潃
+ String url = "rtmp://" + mediamtxHost + ":1935/" + name;
+ info.setRtspUrl(url);
+ RtmpSession rtmpSession = getRtmpSessionById(reader.getId());
+ //浼氳瘽ID
+ info.setId(rtmpSession.getId());
+ //寮�濮嬫媺娴佹椂闂�
+ info.setBeginTime(rtmpSession.getCreated());
+ //涓婅娴侀噺
+ long bytesReceived = rtmpSession.getBytesReceived();
+ String formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
+ info.setUpTraffic(formatReceivedSize);
+ //涓嬭娴侀噺
+ long bytesSent = rtmpSession.getBytesSent();
+ String formatSentSize = ArdTool.formatFileSize(bytesSent);
+ info.setDownTraffic(formatSentSize);
+ //鎷夋祦鏈嶅姟鍣�
+ info.setRemoteAddr(rtmpSession.getRemoteAddr());
+ PullStreamInfoList.add(info);
+ break;
+ case "webRTCSession":
+ info.setSessionType("webrtc");
+ //webrtc鎾斁鍦板潃
+ url = "http://" + mediamtxHost + ":8889/" + name;
+ info.setRtspUrl(url);
+ WebrtcSession webrtcSession = getWebrtcSessionById(reader.getId());
+ //浼氳瘽ID
+ info.setId(webrtcSession.getId());
+ //寮�濮嬫媺娴佹椂闂�
+ info.setBeginTime(webrtcSession.getCreated());
+ //涓婅娴侀噺
+ bytesReceived = webrtcSession.getBytesReceived();
+ formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
+ info.setUpTraffic(formatReceivedSize);
+ //涓嬭娴侀噺
+ bytesSent = webrtcSession.getBytesSent();
+ formatSentSize = ArdTool.formatFileSize(bytesSent);
+ info.setDownTraffic(formatSentSize);
+ //鎷夋祦鏈嶅姟鍣�
+ info.setRemoteAddr(webrtcSession.getRemoteAddr());
+ PullStreamInfoList.add(info);
+ break;
+ case "rtspSession":
+ info.setSessionType("rtsp");
+ //RTSP鎾斁鍦板潃
+ String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name;
+ info.setRtspUrl(rtspUrl);
+ RtspSession rtspSession = getRtspSessionById(reader.getId());
+ //浼氳瘽ID
+ info.setId(rtspSession.getId());
+ //寮�濮嬫媺娴佹椂闂�
+ info.setBeginTime(rtspSession.getCreated());
+ //涓婅娴侀噺
+ bytesReceived = rtspSession.getBytesReceived();
+ formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
+ info.setUpTraffic(formatReceivedSize);
+ //涓嬭娴侀噺
+ bytesSent = rtspSession.getBytesSent();
+ formatSentSize = ArdTool.formatFileSize(bytesSent);
+ info.setDownTraffic(formatSentSize);
+ //鎷夋祦鏈嶅姟鍣�
+ info.setRemoteAddr(rtspSession.getRemoteAddr());
+ PullStreamInfoList.add(info);
+ break;
+ }
}
}
- Comparator<StreamInfo> comparator = Comparator.comparing(streamInfo ->streamInfo.getBeginTime() ); // 浣跨敤Collections.sort鏂规硶杩涜鎺掑簭 Collections.sort(personList, comparator);
+ Comparator<StreamInfo> comparator = Comparator.comparing(streamInfo -> streamInfo.getBeginTime()); // 浣跨敤Collections.sort鏂规硶杩涜鎺掑簭 Collections.sort(personList, comparator);
Collections.sort(PullStreamInfoList, comparator.reversed());
return PullStreamInfoList;
}
+ /**
+ * 韪㈠嚭rtsp浼氳瘽
+ * 鍒樿嫃涔�
+ * 2023/8/29 9:37:05
+ */
@Override
public Boolean kickRtspSession(String sessionId) {
try {
- mediaClient.kick(sessionId);
+ mediaClient.kickRtspSessions(sessionId);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
+ }
+
+ /**
+ * 韪㈠嚭rtmp浼氳瘽
+ * 鍒樿嫃涔�
+ * 2023/8/29 9:37:05
+ */
+ @Override
+ public Boolean kickRtmpSession(String sessionId) {
+ try {
+ mediaClient.kickRtmpSessions(sessionId);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
+ }
+
+ /**
+ * 韪㈠嚭webrtc浼氳瘽
+ * 鍒樿嫃涔�
+ * 2023/8/29 9:37:05
+ */
+ @Override
+ public Boolean kickWebrtcSession(String sessionId) {
+ try {
+ mediaClient.kickWebrtcSessions(sessionId);
return true;
} catch (Exception ex) {
return false;
--
Gitblit v1.9.3