ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ard-work/src/main/java/com/ruoyi/media/domain/Items.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ard-work/src/main/java/com/ruoyi/media/domain/JsonsRoot.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ard-work/src/main/java/com/ruoyi/media/domain/MediaInfo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java
@@ -32,19 +32,29 @@ @PostMapping("/add") @ApiOperation("增加转码") public AjaxResult addPath(@RequestBody MediaInfo mediaInfo) { String rtsp = mediaService.addPath(mediaInfo.getName(), mediaInfo.getRtspPath()); String rtsp = mediaService.addPath(mediaInfo.getCameraId(), mediaInfo.getRtspPath()); return AjaxResult.success(rtsp); } @PostMapping("/remove") @ApiOperation("移除转码") @ApiOperationSupport(includeParameters={"mediaInfo.name"}) @ApiOperationSupport(includeParameters={"mediaInfo.cameraId"}) public AjaxResult removePath(@RequestBody MediaInfo mediaInfo) { mediaService.removePath(mediaInfo.getName()); mediaService.removePath(mediaInfo.getCameraId()); return AjaxResult.success(); } @GetMapping("/getList") @GetMapping("/getPaths") @ApiOperation("获取当前转码列表") public AjaxResult getList() { return AjaxResult.success(mediaService.list()); public AjaxResult getPaths() { return AjaxResult.success(mediaService.paths()); } @GetMapping("/getRtspSessions") @ApiOperation("获取rtsp会话列表") public AjaxResult getRtspSessions() { return AjaxResult.success(mediaService.rtspsessions()); } @GetMapping("/getRtspConns") @ApiOperation("获取rtsp连接列表") public AjaxResult getRtspConns() { return AjaxResult.success(mediaService.rtspconns()); } } ard-work/src/main/java/com/ruoyi/media/domain/Items.java
@@ -1,8 +1,10 @@ package com.ruoyi.media.domain; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.util.Date; import java.util.List; /** @@ -13,11 +15,21 @@ * @Version: 1.0 **/ @Data @JsonInclude(value = JsonInclude.Include.NON_NULL) public class Items { private String name; private String confname; private String confName; private Conf conf; private Source source; private boolean sourceready; private boolean sourceReady; private List<String> tracks; private String id; private Date created; private String remoteAddr; private String state; private long bytesReceived; private long bytesSent; } ard-work/src/main/java/com/ruoyi/media/domain/JsonsRoot.java
@@ -1,5 +1,6 @@ package com.ruoyi.media.domain; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.util.List; @@ -14,9 +15,9 @@ @Data public class JsonsRoot { private int itemcount; private int itemCount; private int pagecount; private int pageCount; private List<Items> items; ard-work/src/main/java/com/ruoyi/media/domain/MediaInfo.java
@@ -3,7 +3,7 @@ import lombok.Data; /** * @Description: * @Description: 流媒体信息实体 * @ClassName: MediaInfo * @Author: 刘苏义 * @Date: 2023年07月13日10:11 @@ -11,6 +11,6 @@ **/ @Data public class MediaInfo { String name; String cameraId; String rtspPath; } ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java
@@ -1,10 +1,13 @@ package com.ruoyi.media.service; import com.ruoyi.media.domain.Items; import java.util.List; public interface IMediaService { public String addPath(String name, String rtspPath); public void removePath(String name); public List<Items>list(); public List<Items>paths(); public List<Items> rtspconns(); public List<Items> rtspsessions(); } ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
@@ -1,9 +1,7 @@ package com.ruoyi.media.service.impl; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.media.domain.Conf; import com.ruoyi.media.domain.Items; import com.ruoyi.media.domain.JsonsRoot; import com.ruoyi.media.domain.*; import com.ruoyi.media.service.IMediaService; import com.ruoyi.utils.forest.MediaClient; import org.springframework.beans.factory.annotation.Value; @@ -41,25 +39,41 @@ // -i //用于指定输入媒体文件或输入流的地址 //-f rtsp //这个选项告诉 FFmpeg 输出为 RTSP 格式。 //CPU软解码编码 //String cmd = "ffmpeg -rtsp_transport udp -i \"" + rtspPath + "\" -vcodec libx264 -preset:v veryfast -r 25 -threads 4 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; //GPU硬解码编码 String cmd = "ffmpeg -hwaccel cuvid -c:v h264_cuvid -rtsp_transport udp -i \"" + rtspPath + "\" -c:v h264_nvenc -r 25 -threads 4 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; 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 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; mediaInfo.setRunoninit(cmd); mediaInfo.setRunoninitrestart(true); mediaClient.add(apiUrl, name, mediaInfo); mediaClient.addPath(apiUrl, name, mediaInfo); return rtspUrl + name; } @Override public void removePath(String name) { String apiUrl="http://"+mediamtxHost+":9997/v2"; mediaClient.remove(apiUrl, name); mediaClient.removePath(apiUrl, name); } @Override public List<Items> list() { public List<Items> paths() { String apiUrl="http://"+mediamtxHost+":9997/v2"; String list = mediaClient.list(apiUrl); String list = mediaClient.paths(apiUrl); JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); return jsonsRoot.getItems(); } @Override public List<Items> rtspconns() { String apiUrl="http://"+mediamtxHost+":9997/v2"; String list = mediaClient.rtspconns(apiUrl); JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); return jsonsRoot.getItems(); } @Override public List<Items> rtspsessions() { String apiUrl="http://"+mediamtxHost+":9997/v2"; String list = mediaClient.rtspsessions(apiUrl); JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); return jsonsRoot.getItems(); } ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java
@@ -14,13 +14,39 @@ * @Version: 1.0 **/ public interface MediaClient { /** * 增加路径 */ @Post("{apiUrl}/config/paths/add/{name}") String add(@Var("apiUrl") String apiUrl,@Var("name") String name, @JSONBody Conf body); String addPath(@Var("apiUrl") String apiUrl, @Var("name") String name, @JSONBody Conf body); /** * 移除路径 */ @Post("{apiUrl}/config/paths/remove/{name}") String remove(@Var("apiUrl") String apiUrl,@Var("name") String name); String removePath(@Var("apiUrl") String apiUrl, @Var("name") String name); /** * 查询所有路径 */ @Get("{apiUrl}/paths/list") String list(@Var("apiUrl") String apiUrl); String paths(@Var("apiUrl") String apiUrl); /** * 查询所有rtsp会话 */ @Get("{apiUrl}/rtspsessions/list") String rtspsessions(@Var("apiUrl") String apiUrl); /** * 查询所有rtsp连接 */ @Get("{apiUrl}/rtspconns/list") String rtspconns(@Var("apiUrl") String apiUrl); /** * 按id查询rtsp会话 */ @Get("{apiUrl}/rtspsessions/get/{id}") String rtspsessionsById(@Var("apiUrl") String apiUrl, @Var("id") String id); }