From f652169cc5d6501511eece5df57b7b396fd7a7ab Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Tue, 02 Jun 2026 09:51:34 +0800
Subject: [PATCH] 优化

---
 ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/controller/ZlmController.java            |   67 ++++++++++++++++++++++
 ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/IMediaServerService.java         |   15 +++++
 ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/impl/MediaServerServiceImpl.java |   59 +++++++++++++++++++
 3 files changed, 141 insertions(+), 0 deletions(-)

diff --git a/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/controller/ZlmController.java b/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/controller/ZlmController.java
index 54a3f88..edcc66e 100644
--- a/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/controller/ZlmController.java
+++ b/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/controller/ZlmController.java
@@ -921,4 +921,71 @@
         return AjaxResult.success(json);
     }
 
+    /**
+     * 拉流代理(通过通道ID,简化传参)
+     *
+     * @param request   HttpServletRequest
+     * @param channelId 通道ID
+     * @return
+     */
+    @Operation(summary = "拉流代理(通过通道ID,简化传参)")
+    @PostMapping("/streamPullPlayByChannelId/{channelId}")
+    public DeferredResult<R<StreamContent>> streamPullPlayByChannelId(
+            HttpServletRequest request,
+            @PathVariable String channelId
+    ) {
+        log.info("[拉流代理-通道ID] channelId:{}", channelId);
+        Assert.hasText(channelId, "通道ID不可为空");
+
+        DeferredResult<R<StreamContent>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
+
+        ErrorCallback<StreamInfo> callback = (code, msg, streamInfo) -> {
+            if (code == InviteErrorCode.SUCCESS.getCode()) {
+                R<StreamContent> r = R.ok();
+                if (streamInfo != null) {
+                    if (userSetting.getUseSourceIpAsStreamIp()) {
+                        streamInfo = streamInfo.clone();
+                        String host;
+                        try {
+                            URL url = new URL(request.getRequestURL().toString());
+                            host = url.getHost();
+                        } catch (MalformedURLException e) {
+                            host = request.getLocalAddr();
+                        }
+                        streamInfo.changeStreamIp(host);
+                    }
+                    if (!ObjectUtils.isEmpty(streamInfo.getMediaServer().getTranscodeSuffix())
+                            && !"null".equalsIgnoreCase(streamInfo.getMediaServer().getTranscodeSuffix())) {
+                        streamInfo.setStream(streamInfo.getStream() + "_" + streamInfo.getMediaServer().getTranscodeSuffix());
+                    }
+                    r.setData(new StreamContent(streamInfo));
+                } else {
+                    r.setCode(code);
+                    r.setMsg(msg);
+                }
+                result.setResult(r);
+            } else {
+                result.setResult(R.fail(code, msg));
+            }
+        };
+
+        mediaServerService.streamPullPlayByChannelId(channelId, callback);
+        return result;
+    }
+
+    /**
+     * 停止拉流代理(通过通道ID)
+     *
+     * @param channelId 通道ID
+     * @return
+     */
+    @Operation(summary = "停止拉流代理(通过通道ID)")
+    @PostMapping("/stopStreamPullPlayByChannelId/{channelId}")
+    public AjaxResult stopStreamPullPlayByChannelId(@PathVariable String channelId) {
+        log.info("[停止拉流代理-通道ID] channelId:{}", channelId);
+        Assert.hasText(channelId, "通道ID不可为空");
+        mediaServerService.stopStreamPullPlayByChannelId(channelId);
+        return AjaxResult.success();
+    }
+
 }
diff --git a/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/IMediaServerService.java b/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/IMediaServerService.java
index ad8048f..06e10b4 100644
--- a/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/IMediaServerService.java
+++ b/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/IMediaServerService.java
@@ -372,4 +372,19 @@
      * gb28181 停止点播(基于GbChannel,不依赖QS)
      */
     void stopGb28181PlayByGbChannel(InviteSessionType type, StreamChannel streamChannel, Device device, String stream);
+
+    /**
+     * 通过通道ID拉流代理(简化传参,自动根据通道类型确定app/url等参数)
+     *
+     * @param channelId 通道ID
+     * @param callback  回调
+     */
+    void streamPullPlayByChannelId(String channelId, ErrorCallback<StreamInfo> callback);
+
+    /**
+     * 通过通道ID停止拉流代理
+     *
+     * @param channelId 通道ID
+     */
+    void stopStreamPullPlayByChannelId(String channelId);
 }
diff --git a/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/impl/MediaServerServiceImpl.java b/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/impl/MediaServerServiceImpl.java
index 61b5487..0956186 100644
--- a/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/impl/MediaServerServiceImpl.java
+++ b/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/impl/MediaServerServiceImpl.java
@@ -1904,6 +1904,65 @@
         }
     }
 
+    /**
+     * 通过通道ID拉流代理(简化传参,自动根据通道类型确定app/url等参数)
+     *
+     * @param channelId 通道ID
+     * @param callback  回调
+     */
+    @Override
+    public void streamPullPlayByChannelId(String channelId, ErrorCallback<StreamInfo> callback) {
+        R<ArdChannel> channelR = remoteChannelService.getInfo(channelId, SecurityConstants.INNER);
+        if (channelR.getCode() != Constants.SUCCESS) {
+            callback.run(InviteErrorCode.FAIL.getCode(), "获取通道信息失败 channelId:" + channelId, null);
+            return;
+        }
+        if (channelR.getData() == null) {
+            callback.run(InviteErrorCode.FAIL.getCode(), "通道不存在 channelId:" + channelId, null);
+            return;
+        }
+
+        ArdChannel ardChannel = channelR.getData();
+        StreamPullPlay streamPullPlay = buildStreamPullPlay(ardChannel);
+        streamPullPlay(streamPullPlay, callback);
+    }
+
+    /**
+     * 通过通道ID停止拉流代理
+     *
+     * @param channelId 通道ID
+     */
+    @Override
+    public void stopStreamPullPlayByChannelId(String channelId) {
+        R<ArdChannel> channelR = remoteChannelService.getInfo(channelId, SecurityConstants.INNER);
+        if (channelR.getCode() != Constants.SUCCESS) {
+            throw new RuntimeException("获取通道信息失败 channelId:" + channelId);
+        }
+        if (channelR.getData() == null) {
+            throw new RuntimeException("通道不存在 channelId:" + channelId);
+        }
+
+        ArdChannel ardChannel = channelR.getData();
+        StreamPullPlay streamPullPlay = new StreamPullPlay();
+        streamPullPlay.setChannelId(channelId);
+        streamPullPlay.setMediaServerId(ardChannel.getMediaServerId());
+        streamPullPlay.setStreamKey(ardChannel.getStreamKey());
+        stopStreamPullPlay(streamPullPlay);
+    }
+
+    private StreamPullPlay buildStreamPullPlay(ArdChannel ardChannel) {
+        StreamPullPlay streamPullPlay = new StreamPullPlay();
+        streamPullPlay.setChannelId(ardChannel.getId());
+        streamPullPlay.setStream(ardChannel.getId());
+        streamPullPlay.setUrl(ardChannel.getLiveAddress());
+        streamPullPlay.setApp("ard");
+        streamPullPlay.setEnable_mp4(false);
+        streamPullPlay.setEnable_audio(true);
+        streamPullPlay.setRtp_type("1");
+        streamPullPlay.setTimeOut(10);
+        return streamPullPlay;
+    }
+
 
     /**
      * 开启国标28181播放

--
Gitblit v1.9.3