From 26dcbd9b7cb5afe307ce5a3f038dff3614ce4b3a Mon Sep 17 00:00:00 2001 From: shikong <919411476@qq.com> Date: Sun, 20 Aug 2023 17:44:12 +0800 Subject: [PATCH] zlm startSendRtp,startSendRtpPassive,stopSendRtp api --- .../gb28181/media/dto/rtp/CloseRtpServer.java | 3 + .../gb28181/media/dto/rtp/OpenRtpServer.java | 9 +++ .../gb28181/media/dto/rtp/RtpServer.java | 18 ++++++ .../gb28181/media/dto/rtp/StartSendRtp.java | 57 +++++++++++++++++++ .../media/dto/rtp/StartSendRtpPassive.java | 43 ++++++++++++++ .../media/dto/rtp/StartSendRtpResp.java | 13 +++++ .../gb28181/media/dto/rtp/StopSendRtp.java | 26 +++++++++ .../media/proxy/ZlmMediaHttpClient.java | 17 ++++-- .../gb28181/media/proxy/ZlmMediaService.java | 41 +++++++++++-- .../gb28181/test/MediaServiceTest.java | 15 ++++- 10 files changed, 233 insertions(+), 9 deletions(-) create mode 100644 zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/RtpServer.java create mode 100644 zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtp.java create mode 100644 zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtpPassive.java create mode 100644 zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtpResp.java create mode 100644 zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StopSendRtp.java diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/CloseRtpServer.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/CloseRtpServer.java index 5aaa00a..37a1f18 100644 --- a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/CloseRtpServer.java +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/CloseRtpServer.java @@ -13,5 +13,8 @@ import lombok.NoArgsConstructor; @Builder @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class CloseRtpServer { + /** + * 调用 openRtpServer 接口时提供的流ID + */ private String streamId; } diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/OpenRtpServer.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/OpenRtpServer.java index 036279f..9832e1b 100644 --- a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/OpenRtpServer.java +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/OpenRtpServer.java @@ -11,9 +11,18 @@ import lombok.*; @Builder @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class OpenRtpServer { + /** + * 接收端口,0则为随机端口 + */ private int port; + /** + * 0 udp 模式,1 tcp 被动模式, 2 tcp 主动模式。 (兼容enable_tcp 为0/1) + */ private int tcpMode; + /** + * 该端口绑定的流ID,该端口只能创建这一个流(而不是根据ssrc创建多个) + */ private String streamId; } diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/RtpServer.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/RtpServer.java new file mode 100644 index 0000000..0685df1 --- /dev/null +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/RtpServer.java @@ -0,0 +1,18 @@ +package cn.skcks.docking.gb28181.media.dto.rtp; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.Data; + +@Data +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public class RtpServer { + /** + * 绑定的端口号 + */ + private int port; + /** + * 绑定的流ID + */ + private String streamId; +} diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtp.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtp.java new file mode 100644 index 0000000..9d806a5 --- /dev/null +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtp.java @@ -0,0 +1,57 @@ +package cn.skcks.docking.gb28181.media.dto.rtp; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.Data; + +@Data +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public class StartSendRtp { + /** + * 添加的流的虚拟主机,例如__defaultVhost__ + */ + private String vhost = "__defaultVhost__"; + /** + * 应用名 + */ + private String app; + /** + * 流id + */ + private String stream; + /** + * 推流的rtp的ssrc,指定不同的ssrc可以同时推流到多个服务器 + */ + private String ssrc; + /** + * 目标ip或域名 + */ + private String dstUrl; + /** + * 目标端口 + */ + private int dstPort; + + /** + * 是否为udp模式,否则为tcp模式 + */ + @JsonProperty("is_udp") + private boolean isUdp; + /** + * 使用的本机端口,为0或不传时默认为随机端口 + */ + private Integer srcPort; + /** + * 发送时,rtp的pt(uint8_t),不传时默认为96 + */ + private Integer pt; + /** + * 发送时,rtp的负载类型。为1时,负载为ps;为0时,为es;不传时默认为1 + */ + private Integer usePs; + /** + * 当use_ps 为0时,有效。为1时,发送音频;为0时,发送视频;不传时默认为0 + */ + private Integer onlyAudio; +} diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtpPassive.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtpPassive.java new file mode 100644 index 0000000..cd3a1bb --- /dev/null +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtpPassive.java @@ -0,0 +1,43 @@ +package cn.skcks.docking.gb28181.media.dto.rtp; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.Data; + +@Data +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public class StartSendRtpPassive { + /** + * 添加的流的虚拟主机,例如__defaultVhost__ + */ + private String vhost = "__defaultVhost__"; + /** + * 应用名 + */ + private String app; + /** + * 流id + */ + private String stream; + /** + * 推流的rtp的ssrc,指定不同的ssrc可以同时推流到多个服务器 + */ + private String ssrc; + /** + * 使用的本机端口,为0或不传时默认为随机端口 + */ + private Integer srcPort; + /** + * 发送时,rtp的pt(uint8_t),不传时默认为96 + */ + private Integer pt; + /** + * 发送时,rtp的负载类型。为1时,负载为ps;为0时,为es;不传时默认为1 + */ + private Integer usePs; + /** + * 当use_ps 为0时,有效。为1时,发送音频;为0时,发送视频;不传时默认为0 + */ + private Integer onlyAudio; +} diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtpResp.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtpResp.java new file mode 100644 index 0000000..b25ee72 --- /dev/null +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StartSendRtpResp.java @@ -0,0 +1,13 @@ +package cn.skcks.docking.gb28181.media.dto.rtp; + +import cn.skcks.docking.gb28181.media.dto.status.ResponseStatus; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.Data; + +@Data +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public class StartSendRtpResp { + private ResponseStatus code; + private Integer localPort; +} diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StopSendRtp.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StopSendRtp.java new file mode 100644 index 0000000..88ecaf1 --- /dev/null +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/rtp/StopSendRtp.java @@ -0,0 +1,26 @@ +package cn.skcks.docking.gb28181.media.dto.rtp; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.Data; + +@Data +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public class StopSendRtp { + /** + * 添加的流的虚拟主机,例如__defaultVhost__ + */ + private String vhost = "__defaultVhost__"; + /** + * 应用名 + */ + private String app; + /** + * 流id + */ + private String stream; + /** + * 推流的rtp的ssrc,指定不同的ssrc可以同时推流到多个服务器 + */ + private String ssrc; +} diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/proxy/ZlmMediaHttpClient.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/proxy/ZlmMediaHttpClient.java index bb1f050..7c989c4 100644 --- a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/proxy/ZlmMediaHttpClient.java +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/proxy/ZlmMediaHttpClient.java @@ -5,10 +5,7 @@ import cn.skcks.docking.gb28181.media.dto.proxy.AddStreamPusherProxy; import cn.skcks.docking.gb28181.media.dto.proxy.AddStreamPusherProxyResp; import cn.skcks.docking.gb28181.media.dto.proxy.DelStreamPusherProxyResp; import cn.skcks.docking.gb28181.media.dto.response.ZlmResponse; -import cn.skcks.docking.gb28181.media.dto.rtp.CloseRtpServer; -import cn.skcks.docking.gb28181.media.dto.rtp.CloseRtpServerResp; -import cn.skcks.docking.gb28181.media.dto.rtp.OpenRtpServer; -import cn.skcks.docking.gb28181.media.dto.rtp.OpenRtpServerResp; +import cn.skcks.docking.gb28181.media.dto.rtp.*; import cn.skcks.docking.gb28181.media.dto.version.VersionResp; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.ResponseEntity; @@ -41,6 +38,9 @@ public interface ZlmMediaHttpClient { @PostMapping("/index/api/closeRtpServer") CloseRtpServerResp closeRtpServer(@RequestParam String secret, @RequestBody CloseRtpServer params); + @GetMapping("/index/api/listRtpServer") + ZlmResponse> listRtpServer(@RequestParam String secret); + @GetMapping("/index/api/version") ZlmResponse version(@RequestParam String secret); @@ -49,4 +49,13 @@ public interface ZlmMediaHttpClient { @PostMapping("/index/api/delStreamPusherProxy") ZlmResponse delStreamPusherProxy(@RequestParam String secret, @RequestParam String key); + + @PostMapping("/index/api/startSendRtp") + StartSendRtpResp startSendRtp(@RequestParam String secret, @RequestBody StartSendRtp params); + + @PostMapping("/index/api/startSendRtpPassive") + StartSendRtpResp startSendRtpPassive(@RequestParam String secret, @RequestBody StartSendRtpPassive params); + + @PostMapping("/index/api/stopSendRtp") + ZlmResponse stopSendRtp(@RequestParam String secret, @RequestBody StopSendRtp params); } diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/proxy/ZlmMediaService.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/proxy/ZlmMediaService.java index 74e0af0..752a7c2 100644 --- a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/proxy/ZlmMediaService.java +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/proxy/ZlmMediaService.java @@ -5,13 +5,12 @@ import cn.skcks.docking.gb28181.media.dto.proxy.AddStreamPusherProxy; import cn.skcks.docking.gb28181.media.dto.proxy.AddStreamPusherProxyResp; import cn.skcks.docking.gb28181.media.dto.proxy.DelStreamPusherProxyResp; import cn.skcks.docking.gb28181.media.dto.response.ZlmResponse; -import cn.skcks.docking.gb28181.media.dto.rtp.CloseRtpServer; -import cn.skcks.docking.gb28181.media.dto.rtp.CloseRtpServerResp; -import cn.skcks.docking.gb28181.media.dto.rtp.OpenRtpServer; -import cn.skcks.docking.gb28181.media.dto.rtp.OpenRtpServerResp; +import cn.skcks.docking.gb28181.media.dto.rtp.*; import cn.skcks.docking.gb28181.media.dto.version.VersionResp; import lombok.Builder; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @@ -62,6 +61,13 @@ public class ZlmMediaService { return exchange.closeRtpServer(secret, params); } + /** + * 获取openRtpServer接口创建的所有RTP服务器 + */ + public ZlmResponse> listRtpServer(){ + return exchange.listRtpServer(secret); + } + /** * 功能:获取版本信息,如分支,commit id, 编译时间 */ @@ -85,5 +91,32 @@ public class ZlmMediaService { public ZlmResponse delStreamPusherProxy(@RequestParam String key) { return exchange.delStreamPusherProxy(secret, key); } + + + /** + *

功能:作为GB28181客户端,启动ps-rtp推流,支持rtp/udp方式;该接口支持rtsp/rtmp等协议转ps-rtp推流。

+ * 第一次推流失败会直接返回错误,成功一次后,后续失败也将无限重试。 + */ + StartSendRtpResp startSendRtp(StartSendRtp params){ + return exchange.startSendRtp(secret, params); + } + + + /** + *

功能:作为GB28181 Passive TCP服务器;该接口支持rtsp/rtmp等协议转ps-rtp被动推流。

+ *

调用该接口,zlm会启动tcp服务器等待连接请求,连接建立后,zlm会关闭tcp服务器,然后源源不断的往客户端推流。

+ *

第一次推流失败会直接返回错误,成功一次后,后续失败也将无限重试(不停地建立tcp监听,超时后再关闭)。

+ */ + StartSendRtpResp startSendRtpPassive(StartSendRtpPassive params){ + return exchange.startSendRtpPassive(secret, params); + } + + + /** + * 功能:停止GB28181 ps-rtp推流 + */ + ZlmResponse stopSendRtp(StopSendRtp params){ + return exchange.stopSendRtp(secret, params); + } } diff --git a/zlmediakit-service/src/test/java/cn/skcks/docking/gb28181/test/MediaServiceTest.java b/zlmediakit-service/src/test/java/cn/skcks/docking/gb28181/test/MediaServiceTest.java index 6b5cef2..534469c 100644 --- a/zlmediakit-service/src/test/java/cn/skcks/docking/gb28181/test/MediaServiceTest.java +++ b/zlmediakit-service/src/test/java/cn/skcks/docking/gb28181/test/MediaServiceTest.java @@ -2,6 +2,7 @@ package cn.skcks.docking.gb28181.test; import cn.hutool.core.date.LocalDateTimeUtil; import cn.skcks.docking.gb28181.common.json.JsonResponse; +import cn.skcks.docking.gb28181.common.json.JsonUtils; import cn.skcks.docking.gb28181.media.dto.config.HookConfig; import cn.skcks.docking.gb28181.media.dto.config.ServerConfig; import cn.skcks.docking.gb28181.media.dto.proxy.AddStreamPusherProxy; @@ -11,6 +12,8 @@ import cn.skcks.docking.gb28181.media.dto.response.ZlmResponse; import cn.skcks.docking.gb28181.media.dto.response.ZlmResponseConvertor; import cn.skcks.docking.gb28181.media.dto.rtp.CloseRtpServer; import cn.skcks.docking.gb28181.media.dto.rtp.OpenRtpServer; +import cn.skcks.docking.gb28181.media.dto.rtp.RtpServer; +import cn.skcks.docking.gb28181.media.dto.rtp.StartSendRtp; import cn.skcks.docking.gb28181.media.dto.version.VersionResp; import cn.skcks.docking.gb28181.media.proxy.ZlmMediaService; import lombok.SneakyThrows; @@ -73,7 +76,10 @@ public class MediaServiceTest { String streamId = "testStream"; OpenRtpServer openRtpServer = new OpenRtpServer(port,0,streamId); log.info("{}", zlmMediaService.openRtpServer(openRtpServer)); - Thread.sleep(500); + + ZlmResponse> listRtpServer = zlmMediaService.listRtpServer(); + log.info("{}", listRtpServer.getData()); + CloseRtpServer closeRtpServer = new CloseRtpServer(streamId); log.info("{}", zlmMediaService.closeRtpServer(closeRtpServer)); } @@ -137,4 +143,11 @@ public class MediaServiceTest { ZlmResponse delStreamPusherProxyRespZlmResponse = zlmMediaService.delStreamPusherProxy(key); log.info("{}",delStreamPusherProxyRespZlmResponse); } + + @Test + void simpleTest(){ + StartSendRtp startSendRtp = new StartSendRtp(); + startSendRtp.setUdp(true); + log.info("{}",JsonUtils.toJson(startSendRtp)); + } }