liusuyi
2025-11-27 9e1c6de09a1c078e02d267c980d0ee49003016ee
流媒体增加rtsp/rtmp/webrtc端口自定义
4 files modified
75 ■■■■■ changed files
ard-device/src/main/java/com/ard/device/channel/service/impl/ArdChannelServiceImpl.java 27 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java 20 ●●●●● patch | view | raw | blame | history
ard-vtdu/src/main/java/com/ard/vtdu/config/MediamtxConfig.java 3 ●●●●● patch | view | raw | blame | history
ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java 25 ●●●●● patch | view | raw | blame | history
ard-device/src/main/java/com/ard/device/channel/service/impl/ArdChannelServiceImpl.java
@@ -13,6 +13,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
@@ -34,6 +35,7 @@
    private IArdVtduService ardVtduService;
    @Resource
    private MediamtxConfig mediamtxConfig;
    /**
     * 查询通道管理
     *
@@ -105,12 +107,13 @@
     * 清空通道
     *
     * @author 刘苏义
     * @date   2024/8/10 11:18
     * @date 2024/8/10 11:18
     */
    @Override
    public int clearArdChannel(){
    public int clearArdChannel() {
        return ardChannelMapper.clearArdChannel();
    }
    /**
     * 删除通道管理信息
     *
@@ -121,6 +124,7 @@
    public int deleteArdChannelByDeviceId(String deviceId) {
        return ardChannelMapper.deleteArdChannelByDeviceId(deviceId);
    }
    /**
     * 校验相机通道是否唯一
     *
@@ -130,8 +134,7 @@
    @Override
    public boolean checkArdChannelUnique(ArdChannel channel) {
        ArdChannel info = ardChannelMapper.checkArdChannelUnique(channel);
        if (info != null && !Objects.equals(info.getId(), channel.getId()))
        {
        if (info != null && !Objects.equals(info.getId(), channel.getId())) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
@@ -143,7 +146,7 @@
        log.debug("定时同步Vtdu任务");
        List<ArdChannel> channels = this.selectArdChannelList(new ArdChannel());
        if (channels == null || channels.isEmpty()) {
           // log.warn("没有获取到通道数据,退出同步");
            // log.warn("没有获取到通道数据,退出同步");
            return;
        }
        List<ArdVtdu> ardVtduList = ardVtduService.selectArdVtduList(new ArdVtdu());
@@ -156,10 +159,16 @@
            String name = channel.getDeviceId() + "_" + channel.getChanNo();  // 生成媒体表的 name
            String cameraId = channel.getDeviceId();  // cameraId 就是通道的 deviceId
            String rtspSourceUrl = getRtspSource(channel);
            String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554" + "/" + name;  // 拼接 webrtcUrl
            String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935" + "/" + name;  // 拼接 webrtcUrl
            String rtspUrl =
                    "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + name;  //
            // 拼接 webrtcUrl
            String rtmpUrl =
                    "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + name;  // 拼接
            // webrtcUrl
            String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
            String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889" + "/" + name;  // 拼接 webrtcUrl
            String webrtcUrl =
                    protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + name;
            // 拼接 webrtcUrl
            // 先检查媒体表是否已有此记录
            Optional<ArdVtdu> existingMedia = ardVtduList.stream()
@@ -212,7 +221,7 @@
    // 根据通道信息获取rtsp源地址
    private String getRtspSource(ArdChannel channel) {
        String rtspSource = "";
        ArdCamera ardCamera =ardCameraService.selectArdCameraById(channel.getDeviceId());
        ArdCamera ardCamera = ardCameraService.selectArdCameraById(channel.getDeviceId());
        if (ardCamera != null) {
            switch (ardCamera.getFactory()) {
                case "1":
ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java
@@ -81,7 +81,7 @@
    @Override
    public void saveLiveCapacity(LiveCapacityReceiver liveCapacityReceiver, Long timestamp) {
        // Solve timing problems
        if(liveCapacityReceiver==null){
        if (liveCapacityReceiver == null) {
            //2025-10-28 zwy,这里有个空指针异常问题,如果liveCapacityReceiver为空,则不应该执行下面的代码。
            //机场设备在刚开机时,发送的state状态时,直播能力前三次发送的是空,可能是由于刚开机,等待各设备开机,第四次为正常数据。
            return;
@@ -100,7 +100,8 @@
    @Override
    public ResponseResult liveStart(LiveTypeDTO liveParam) {
        String rtmpPublishUrl = "rtmp://" + mediamtxConfig.getApiHost() + ":1935/" + liveParam.getVideoId();
        String rtmpPublishUrl =
                "rtmp://" + mediamtxConfig.getApiHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + liveParam.getVideoId();
        liveParam.setUrl(rtmpPublishUrl);
        // Check if this lens is available live.
        ResponseResult responseResult = this.checkBeforeLive(liveParam.getVideoId());
@@ -125,13 +126,20 @@
            case RTMP:
                String name = liveParam.getVideoId();
                // 拼接地址
                String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554" + "/" + name;  // 拼接 webrtcUrl
                String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935" + "/" + name;  // 拼接 webrtcUrl
                String rtspUrl =
                        "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + name;  //
                // 拼接 webrtcUrl
                String rtmpUrl =
                        "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + name;  //
                // 拼接 webrtcUrl
                String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
                String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889" + "/" + name;  // 拼接 webrtcUrl
                String webrtcUrl =
                        protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + name;  // 拼接
                // webrtcUrl
                // 如果没有,插入新的记录
                ArdVtdu vtdu = ArdVtdu.builder().name(name).rtspSource("publisher").rtspUrl(rtspUrl).rtmpUrl(rtmpUrl).webrtcUrl(webrtcUrl).build();
                ArdVtdu vtdu =
                        ArdVtdu.builder().name(name).rtspSource("publisher").rtspUrl(rtspUrl).rtmpUrl(rtmpUrl).webrtcUrl(webrtcUrl).build();
                int i = ardVtduService.insertArdVtdu(vtdu);  // 保存到媒体表
                if (i > 0) {
                    live.setRtmpUrl(rtmpUrl);
ard-vtdu/src/main/java/com/ard/vtdu/config/MediamtxConfig.java
@@ -17,4 +17,7 @@
    private String apiHost;
    private String playHost;
    private boolean isHttps;
    private Integer rtmpPort;
    private Integer rtspPort;
    private Integer webrtcPort;
}
ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java
@@ -51,10 +51,13 @@
    @Override
    public ArdVtdu addPath(ArdVtdu ardVtdu) {
        try {
            String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554/" + ardVtdu.getName();
            String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935/" + ardVtdu.getName();
            String rtspUrl =
                    "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + ardVtdu.getName();
            String rtmpUrl =
                    "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + ardVtdu.getName();
            String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
            String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889/" + ardVtdu.getName();
            String webrtcUrl =
                    protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + ardVtdu.getName();
            Conf conf = new Conf();
            conf.setSource(ardVtdu.getRtspSource());
@@ -82,10 +85,13 @@
    @Override
    public ArdVtdu editPath(ArdVtdu ardVtdu) {
        try {
            String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554/" + ardVtdu.getName();
            String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935/" + ardVtdu.getName();
            String rtspUrl =
                    "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + ardVtdu.getName();
            String rtmpUrl =
                    "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + ardVtdu.getName();
            String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
            String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889/" + ardVtdu.getName();
            String webrtcUrl =
                    protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + ardVtdu.getName();
            Conf conf = new Conf();
            conf.setSource(ardVtdu.getRtspSource());
@@ -199,14 +205,15 @@
            //源
            info.setRtspSource(conf.getSource());
            //RTMP播放地址
            String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935/" + name;
            String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + name;
            info.setRtmpUrl(rtmpUrl);
            //RTSP播放地址
            String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554/" + name;
            String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + name;
            info.setRtspUrl(rtspUrl);
            //WEBRTC播放地址
            String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
            String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889/" + name;
            String webrtcUrl =
                    protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + name;
            info.setWebrtcUrl(webrtcUrl);
            //上行流量