‘liusuyi’
2023-07-14 653471f1df709ade123006b662d81fc33d84ea9c
优化流媒体编解码业务
已修改7个文件
120 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/domain/Items.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/domain/JsonsRoot.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/domain/MediaInfo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java 34 ●●●● 补丁 | 查看 | 原始文档 | 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);
}