From ac2662b8eda13d146e0bc18095a72af1dcdb1582 Mon Sep 17 00:00:00 2001 From: shikong <919411476@qq.com> Date: Sun, 20 Aug 2023 22:28:19 +0800 Subject: [PATCH] zlm addStreamProxy,delStreamProxy api --- .../media/dto/proxy/AddStreamProxy.java | 125 ++++++++++++++++++ .../media/dto/proxy/AddStreamProxyResp.java | 11 ++ .../dto/proxy/AddStreamPusherProxyResp.java | 3 + .../media/dto/proxy/DelStreamProxyResp.java | 8 ++ .../media/proxy/ZlmMediaHttpClient.java | 10 +- .../gb28181/media/proxy/ZlmMediaService.java | 18 ++- .../gb28181/test/MediaServiceTest.java | 21 ++- 7 files changed, 187 insertions(+), 9 deletions(-) create mode 100644 zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamProxy.java create mode 100644 zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamProxyResp.java create mode 100644 zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/DelStreamProxyResp.java diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamProxy.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamProxy.java new file mode 100644 index 0000000..38dd8e9 --- /dev/null +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamProxy.java @@ -0,0 +1,125 @@ +package cn.skcks.docking.gb28181.media.dto.proxy; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public class AddStreamProxy { + /** + * 添加的流的虚拟主机,例如__defaultVhost__ + */ + @Builder.Default + private String vhost = "__defaultVhost__"; + /** + * 添加的流的应用名,例如live + */ + private String app; + /** + * 添加的流的id名 + */ + private String stream; + /** + * 拉流地址 + */ + private String url; + /** + * 转推失败重试次数,-1 无限重试 + */ + private Integer retryCount; + /** + * rtsp拉流时,拉流方式,0:tcp,1:udp,2:组播 + */ + private Integer rtpType; + /** + * 拉流超时时间,单位秒,float类型 + */ + private Double timeoutSec; + /** + * 是否转换成hls-mpegts协议 + */ + private Boolean enableHls; + /** + * 是否转换成hls-fmp4协议 + */ + private Boolean enableHlsFmp4; + /** + * 是否允许mp4录制 + */ + private Boolean enableMp4; + /** + * 是否转rtsp协议 + */ + private Boolean enableRtsp; + /** + * 是否转rtmp/flv协议 + */ + private Boolean enableRtmp; + /** + * 是否转http-ts/ws-ts协议 + */ + private Boolean enableTs; + /** + * 是否转http-fmp4/ws-fmp4协议 + */ + private Boolean enableFmp4; + /** + * 该协议是否有人观看才生成 + */ + private Boolean hlsDemand; + /** + * 该协议是否有人观看才生成 + */ + private Boolean rtspDemand; + /** + * 该协议是否有人观看才生成 + */ + private Boolean rtmpDemand; + /** + * 该协议是否有人观看才生成 + */ + private Boolean tsDemand; + /** + * 该协议是否有人观看才生成 + */ + private Boolean fmp4Demand; + /** + * 转协议时是否开启音频 + */ + private Boolean enableAudio; + /** + * 转协议时,无音频是否添加静音aac音频 + */ + private Boolean addMuteAudio; + /** + * mp4录制文件保存根目录,置空使用默认 + */ + private String mp4SavePath; + /** + * mp4录制切片大小,单位秒 + */ + private Integer mp4MaxSecond; + /** + * MP4录制是否当作观看者参与播放人数计数 + */ + private Boolean mp4AsPlayer; + /** + * hls文件保存保存根目录,置空使用默认 + */ + private Boolean hlsSavePath; + /** + * 该流是否开启时间戳覆盖(0:绝对时间戳/1:系统时间戳/2:相对时间戳) + */ + private Integer modifyStamp; + /** + * 无人观看是否自动关闭流(不触发无人观看hook) + */ + private Boolean autoClose; +} diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamProxyResp.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamProxyResp.java new file mode 100644 index 0000000..d24d310 --- /dev/null +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamProxyResp.java @@ -0,0 +1,11 @@ +package cn.skcks.docking.gb28181.media.dto.proxy; + +import lombok.Data; + +@Data +public class AddStreamProxyResp { + /** + * 流的唯一标识 + */ + private String key; +} diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamPusherProxyResp.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamPusherProxyResp.java index f689fb9..136a7c7 100644 --- a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamPusherProxyResp.java +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/AddStreamPusherProxyResp.java @@ -4,5 +4,8 @@ import lombok.Data; @Data public class AddStreamPusherProxyResp { + /** + * 流的唯一标识 + */ private String key; } diff --git a/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/DelStreamProxyResp.java b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/DelStreamProxyResp.java new file mode 100644 index 0000000..63ae3bd --- /dev/null +++ b/zlmediakit-service/src/main/java/cn/skcks/docking/gb28181/media/dto/proxy/DelStreamProxyResp.java @@ -0,0 +1,8 @@ +package cn.skcks.docking.gb28181.media.dto.proxy; + +import lombok.Data; + +@Data +public class DelStreamProxyResp { + private Boolean flag; +} 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 0187a3f..66112ba 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 @@ -1,9 +1,7 @@ package cn.skcks.docking.gb28181.media.proxy; import cn.skcks.docking.gb28181.media.dto.config.ServerConfig; -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.proxy.*; import cn.skcks.docking.gb28181.media.dto.response.ZlmResponse; import cn.skcks.docking.gb28181.media.dto.rtp.*; import cn.skcks.docking.gb28181.media.dto.snap.Snap; @@ -65,4 +63,10 @@ public interface ZlmMediaHttpClient { @GetMapping("/index/api/restartServer") ZlmResponse restartServer(@RequestParam String secret); + + @PostMapping("/index/api/addStreamProxy") + ZlmResponse addStreamProxy(@RequestParam String secret, @RequestBody AddStreamProxy params); + + @GetMapping("/index/api/delStreamProxy") + ZlmResponse delStreamProxy(@RequestParam String secret, @RequestParam String key); } 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 3b506d9..b0f0f88 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 @@ -1,9 +1,7 @@ package cn.skcks.docking.gb28181.media.proxy; import cn.skcks.docking.gb28181.media.dto.config.ServerConfig; -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.proxy.*; import cn.skcks.docking.gb28181.media.dto.response.ZlmResponse; import cn.skcks.docking.gb28181.media.dto.rtp.*; import cn.skcks.docking.gb28181.media.dto.snap.Snap; @@ -132,5 +130,19 @@ public class ZlmMediaService { public ZlmResponse restartServer(){ return exchange.restartServer(secret); } + + /** + * 功能:动态添加rtsp/rtmp/hls/http-ts/http-flv拉流代理(只支持H264/H265/aac/G711/opus负载) + */ + public ZlmResponse addStreamProxy(AddStreamProxy params){ + return exchange.addStreamProxy(secret, params); + } + + /** + * 功能:关闭拉流代理 + */ + public ZlmResponse delStreamProxy(String key){ + return exchange.delStreamProxy(secret, key); + } } 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 e952245..18f6920 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 @@ -10,9 +10,7 @@ import cn.skcks.docking.gb28181.media.config.ZlmMediaConfig; import cn.skcks.docking.gb28181.media.dto.config.FFMpegConfig; 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; -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.proxy.*; 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; @@ -186,4 +184,21 @@ public class MediaServiceTest { startSendRtp.setUdp(true); log.info("{}",JsonUtils.toJson(startSendRtp)); } + + @Test + void streamProxyTest(){ + AddStreamProxy addStreamProxy = AddStreamProxy.builder() + .app("proxy") + .stream("test") + .url("rtmp://127.0.0.1:1935/live/test") + .build(); + + ZlmResponse addedStreamProxy = zlmMediaService.addStreamProxy(addStreamProxy); + log.info("{}", addedStreamProxy); + String key = Optional.ofNullable(addedStreamProxy.getData()).orElse(new AddStreamProxyResp()).getKey(); + log.info("{}", key); + + ZlmResponse delStreamProxyRespZlmResponse = zlmMediaService.delStreamProxy(key); + log.info("{}", delStreamProxyRespZlmResponse); + } }