zlm startSendRtp,startSendRtpPassive,stopSendRtp api

This commit is contained in:
shikong 2023-08-20 17:44:12 +08:00
parent 9171976c6b
commit 26dcbd9b7c
10 changed files with 233 additions and 9 deletions

View File

@ -13,5 +13,8 @@ import lombok.NoArgsConstructor;
@Builder
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class CloseRtpServer {
/**
* 调用 openRtpServer 接口时提供的流ID
*/
private String streamId;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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的ptuint8_t,不传时默认为96
*/
private Integer pt;
/**
* 发送时rtp的负载类型为1时负载为ps为0时为es不传时默认为1
*/
private Integer usePs;
/**
* 当use_ps 为0时有效为1时发送音频为0时发送视频不传时默认为0
*/
private Integer onlyAudio;
}

View File

@ -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的ptuint8_t,不传时默认为96
*/
private Integer pt;
/**
* 发送时rtp的负载类型为1时负载为ps为0时为es不传时默认为1
*/
private Integer usePs;
/**
* 当use_ps 为0时有效为1时发送音频为0时发送视频不传时默认为0
*/
private Integer onlyAudio;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<List<RtpServer>> listRtpServer(@RequestParam String secret);
@GetMapping("/index/api/version")
ZlmResponse<VersionResp> version(@RequestParam String secret);
@ -49,4 +49,13 @@ public interface ZlmMediaHttpClient {
@PostMapping("/index/api/delStreamPusherProxy")
ZlmResponse<DelStreamPusherProxyResp> 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<Void> stopSendRtp(@RequestParam String secret, @RequestBody StopSendRtp params);
}

View File

@ -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<List<RtpServer>> listRtpServer(){
return exchange.listRtpServer(secret);
}
/**
* 功能获取版本信息如分支commit id, 编译时间
*/
@ -85,5 +91,32 @@ public class ZlmMediaService {
public ZlmResponse<DelStreamPusherProxyResp> delStreamPusherProxy(@RequestParam String key) {
return exchange.delStreamPusherProxy(secret, key);
}
/**
* <p>功能作为GB28181客户端启动ps-rtp推流支持rtp/udp方式该接口支持rtsp/rtmp等协议转ps-rtp推流</p>
* 第一次推流失败会直接返回错误成功一次后后续失败也将无限重试
*/
StartSendRtpResp startSendRtp(StartSendRtp params){
return exchange.startSendRtp(secret, params);
}
/**
* <p>功能作为GB28181 Passive TCP服务器该接口支持rtsp/rtmp等协议转ps-rtp被动推流</p>
* <p>调用该接口zlm会启动tcp服务器等待连接请求连接建立后zlm会关闭tcp服务器然后源源不断的往客户端推流</p>
* <p>第一次推流失败会直接返回错误成功一次后后续失败也将无限重试(不停地建立tcp监听超时后再关闭)</p>
*/
StartSendRtpResp startSendRtpPassive(StartSendRtpPassive params){
return exchange.startSendRtpPassive(secret, params);
}
/**
* 功能停止GB28181 ps-rtp推流
*/
ZlmResponse<Void> stopSendRtp(StopSendRtp params){
return exchange.stopSendRtp(secret, params);
}
}

View File

@ -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<List<RtpServer>> 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<DelStreamPusherProxyResp> delStreamPusherProxyRespZlmResponse = zlmMediaService.delStreamPusherProxy(key);
log.info("{}",delStreamPusherProxyRespZlmResponse);
}
@Test
void simpleTest(){
StartSendRtp startSendRtp = new StartSendRtp();
startSendRtp.setUdp(true);
log.info("{}",JsonUtils.toJson(startSendRtp));
}
}