|  |  |  | 
|---|
|  |  |  | package com.ruoyi.media.service.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.alibaba.fastjson2.JSONObject; | 
|---|
|  |  |  | import com.dtflys.forest.Forest; | 
|---|
|  |  |  | import com.dtflys.forest.exceptions.ForestNetworkException; | 
|---|
|  |  |  | import com.dtflys.forest.exceptions.ForestRuntimeException; | 
|---|
|  |  |  | import com.dtflys.forest.http.ForestRequest; | 
|---|
|  |  |  | import com.ruoyi.common.utils.StringUtils; | 
|---|
|  |  |  | import com.ruoyi.media.domain.*; | 
|---|
|  |  |  | import com.ruoyi.media.service.IMediaService; | 
|---|
|  |  |  | import com.ruoyi.utils.forest.MediaClient; | 
|---|
|  |  |  | import com.ruoyi.utils.tools.ArdTool; | 
|---|
|  |  |  | import io.swagger.models.auth.In; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Value; | 
|---|
|  |  |  | import org.springframework.boot.ApplicationArguments; | 
|---|
|  |  |  | 
|---|
|  |  |  | import org.springframework.core.annotation.Order; | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.annotation.PostConstruct; | 
|---|
|  |  |  | import javax.annotation.Resource; | 
|---|
|  |  |  | import javax.xml.soap.SOAPEnvelope; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | import java.util.regex.Matcher; | 
|---|
|  |  |  | import java.util.regex.Pattern; | 
|---|
|  |  |  | 
|---|
|  |  |  | @Service | 
|---|
|  |  |  | @Slf4j(topic = "vtdu") | 
|---|
|  |  |  | @Order(2) | 
|---|
|  |  |  | public class MediaServiceImpl implements IMediaService, ApplicationRunner { | 
|---|
|  |  |  | public static List<String> mediaNameList = new ArrayList<>(); | 
|---|
|  |  |  | public class MediaServiceImpl implements IMediaService { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | MediaClient mediaClient; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Value("${mediamtx.host}") | 
|---|
|  |  |  | String mediamtxHost; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void run(ApplicationArguments args) throws Exception { | 
|---|
|  |  |  | mediaNameList = getNameList(); | 
|---|
|  |  |  | if (mediaNameList.size() > 0) { | 
|---|
|  |  |  | removePath(mediaNameList.toArray(new String[0])); | 
|---|
|  |  |  | mediaNameList.clear(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 添加流媒体 | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!checkNameExist(name)) { | 
|---|
|  |  |  | mediaClient.addPath(name, conf); | 
|---|
|  |  |  | mediaNameList.add(name); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | mediaClient.editPath(name, conf); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | map.put("rtspUrl", rtspUrl); | 
|---|
|  |  |  | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(conf.getRunOnDemand())) { | 
|---|
|  |  |  | runOn = conf.getRunOnDemand(); | 
|---|
|  |  |  | info.setMode("0"); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | info.setMode("1"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //RTSP源地址 | 
|---|
|  |  |  | Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn); | 
|---|
|  |  |  | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | if (checkNameExist(name)) { | 
|---|
|  |  |  | mediaClient.removePath(name); | 
|---|
|  |  |  | mediaNameList.remove(name); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (ForestRuntimeException ex) { | 
|---|
|  |  |  | log.error("移除流媒体异常:" + ex.getMessage()); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<StreamInfo> paths() { | 
|---|
|  |  |  | String list = mediaClient.paths(); | 
|---|
|  |  |  | JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); | 
|---|
|  |  |  | List<Items> items = jsonsRoot.getItems(); | 
|---|
|  |  |  | public List<StreamInfo> paths(Integer pageNum, Integer pageSize) { | 
|---|
|  |  |  | Paths paths = mediaClient.paths(pageNum - 1, pageSize); | 
|---|
|  |  |  | List<Items> items = paths.getItems(); | 
|---|
|  |  |  | List<StreamInfo> pathInfoList = new ArrayList<>(); | 
|---|
|  |  |  | for (Items item : items) { | 
|---|
|  |  |  | StreamInfo info = new StreamInfo(); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public RtspSession getRtspSessionById(String sessionId) { | 
|---|
|  |  |  | String list = mediaClient.getRtspsessionById(sessionId); | 
|---|
|  |  |  | RtspSession rtspSession = JSONObject.parseObject(list, RtspSession.class); | 
|---|
|  |  |  | return rtspSession; | 
|---|
|  |  |  | return mediaClient.getRtspsessionById(sessionId); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public WebrtcSession getWebrtcSessionById(String sessionId) { | 
|---|
|  |  |  | String list = mediaClient.getWebrtcsessionById(sessionId); | 
|---|
|  |  |  | WebrtcSession webrtcSession = JSONObject.parseObject(list, WebrtcSession.class); | 
|---|
|  |  |  | return webrtcSession; | 
|---|
|  |  |  | return mediaClient.getWebrtcsessionById(sessionId); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public RtmpSession getRtmpSessionById(String sessionId) { | 
|---|
|  |  |  | String list = mediaClient.getRtmpsessionById(sessionId); | 
|---|
|  |  |  | RtmpSession rtmpSession = JSONObject.parseObject(list, RtmpSession.class); | 
|---|
|  |  |  | return rtmpSession; | 
|---|
|  |  |  | return mediaClient.getRtmpsessionById(sessionId); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | * 2023/8/29 9:37:05 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<StreamInfo> getPushStreamList() { | 
|---|
|  |  |  | public List<StreamInfo> getPushStreamList(Integer pageNum, Integer pageSize) { | 
|---|
|  |  |  | List<StreamInfo> PushStreamInfoList = new ArrayList<>(); | 
|---|
|  |  |  | String list = mediaClient.paths(); | 
|---|
|  |  |  | JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); | 
|---|
|  |  |  | List<Items> items = jsonsRoot.getItems(); | 
|---|
|  |  |  | Paths paths = mediaClient.paths(pageNum - 1, pageSize); | 
|---|
|  |  |  | List<Items> items = paths.getItems(); | 
|---|
|  |  |  | for (Items item : items) { | 
|---|
|  |  |  | StreamInfo info = new StreamInfo(); | 
|---|
|  |  |  | //ID | 
|---|
|  |  |  | 
|---|
|  |  |  | long bytesReceived = item.getBytesReceived(); | 
|---|
|  |  |  | String formatReceivedSize = ArdTool.formatFileSize(bytesReceived); | 
|---|
|  |  |  | info.setUpTraffic(formatReceivedSize); | 
|---|
|  |  |  | info.setBeginTime(item.getReadyTime()); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | RtspSession rtspSession = getRtspSessionById(source.getId()); | 
|---|
|  |  |  | //会话ID | 
|---|
|  |  |  | 
|---|
|  |  |  | * 2023/8/29 9:37:05 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<StreamInfo> getPullStreamList() { | 
|---|
|  |  |  | public List<StreamInfo> getPullStreamList(Integer pageNum, Integer pageSize) { | 
|---|
|  |  |  | List<StreamInfo> PullStreamInfoList = new ArrayList<>(); | 
|---|
|  |  |  | String list = mediaClient.paths(); | 
|---|
|  |  |  | JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); | 
|---|
|  |  |  | List<Items> items = jsonsRoot.getItems(); | 
|---|
|  |  |  | Paths paths = mediaClient.paths(pageNum - 1, pageSize); | 
|---|
|  |  |  | List<Items> items = paths.getItems(); | 
|---|
|  |  |  | for (Items item : items) { | 
|---|
|  |  |  | List<Readers> readers = item.getReaders(); | 
|---|
|  |  |  | for (Readers reader : readers) { | 
|---|
|  |  |  | 
|---|
|  |  |  | PullStreamInfoList.add(info); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "webRTCSession": | 
|---|
|  |  |  | case "webrtcSession": | 
|---|
|  |  |  | info.setSessionType("webrtc"); | 
|---|
|  |  |  | //webrtc播放地址 | 
|---|
|  |  |  | url = "http://" + mediamtxHost + ":8889/" + name; | 
|---|
|  |  |  | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<String> getNameList() { | 
|---|
|  |  |  | List<String> nameList = new ArrayList<>(); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | String paths = mediaClient.paths(); | 
|---|
|  |  |  | JsonsRoot jsonsRoot = JSONObject.parseObject(paths, JsonsRoot.class); | 
|---|
|  |  |  | List<Items> items = jsonsRoot.getItems(); | 
|---|
|  |  |  | Paths paths = mediaClient.paths(0, 1000); | 
|---|
|  |  |  | List<Items> items = paths.getItems(); | 
|---|
|  |  |  | for (Items item : items) { | 
|---|
|  |  |  | mediaNameList.add(item.getName()); | 
|---|
|  |  |  | nameList.add(item.getName()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (ForestNetworkException ex) { | 
|---|
|  |  |  | log.error("获取流媒体name列表异常:" + ex.getMessage()); | 
|---|
|  |  |  | } catch (ForestRuntimeException ex) { | 
|---|
|  |  |  | } catch (Exception ex) { | 
|---|
|  |  |  | log.error("获取流媒体name列表异常:" + ex.getMessage()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return mediaNameList; | 
|---|
|  |  |  | return nameList; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 检查名称是否存在 | 
|---|
|  |  |  | * 检查name是否存在 | 
|---|
|  |  |  | * 刘苏义 | 
|---|
|  |  |  | * 2023/10/19 15:18:45 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public boolean checkNameExist(String name) { | 
|---|
|  |  |  | boolean result = false; | 
|---|
|  |  |  | if (mediaNameList.contains(name)) { | 
|---|
|  |  |  | List<String> nameList = getNameList(); | 
|---|
|  |  |  | if (nameList.contains(name)) { | 
|---|
|  |  |  | result = true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return result; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 配置流媒体参数 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String setConfig(Config config) { | 
|---|
|  |  |  | return mediaClient.setConfig(config); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|