diff --git a/pom.xml b/pom.xml
index 1a30a3b..e638c9f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,8 +16,9 @@
8
8
- 2.7.10
+ 2.7.18
2.5.2
+ 5.2.1
lunasaw
${project.name}
1.0-SNAPSHOT
@@ -44,6 +45,16 @@
+
+ io.github.lunasaw
+ luna-common
+ ${luna-common.version}
+
+
+ org.apache.httpcomponents.client5
+ httpclient5
+ ${httpclient5.version}
+
org.springframework.boot
spring-boot-dependencies
@@ -51,20 +62,10 @@
pom
import
-
- io.github.lunasaw
- luna-common
- ${luna-common.version}
-
-
- org.springframework.boot
- spring-boot-starter-test
-
-
org.springframework.boot
spring-boot-starter
diff --git a/src/main/java/io/github/lunasaw/zlm/api/ZlmRestService.java b/src/main/java/io/github/lunasaw/zlm/api/ZlmRestService.java
index bae0f76..2c2915d 100644
--- a/src/main/java/io/github/lunasaw/zlm/api/ZlmRestService.java
+++ b/src/main/java/io/github/lunasaw/zlm/api/ZlmRestService.java
@@ -1,14 +1,20 @@
package io.github.lunasaw.zlm.api;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.TypeReference;
import com.luna.common.check.Assert;
import com.luna.common.net.HttpUtils;
import io.github.lunasaw.zlm.config.ZlmProperties;
-import io.github.lunasaw.zlm.constant.Constant;
+import io.github.lunasaw.zlm.constant.ApiConstants;
+import io.github.lunasaw.zlm.entity.ServerNodeConfig;
+import io.github.lunasaw.zlm.entity.ServerResponse;
+import io.github.lunasaw.zlm.entity.Version;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -16,23 +22,508 @@
* @author luna
* @version 1.0
* @date 2023/12/2
- * @description:
+ * @description: zlm rest api
*/
@Service
public class ZlmRestService {
+ private static final String URL = "http://127.0.0.1:9092";
+ private static final String SECRET = "zlm";
@Autowired
private ZlmProperties zlmProperties;
+ /**
+ * 获取服务器配置
+ */
+ public static ServerResponse getServerConfig(String host, String secret) {
+ String s = doApi(host, secret, ApiConstants.GET_SERVER_CONFIG, new HashMap<>());
+ return JSON.parseObject(s, new TypeReference>() {
+ });
+ }
+
+ /**
+ * 获取版本信息
+ */
+ public static ServerResponse version(String host, String secret) {
+ String s = doApi(host, secret, ApiConstants.VERSION, new HashMap<>());
+ return JSON.parseObject(s, new TypeReference>() {
+ });
+ }
+
+ /**
+ * 获取流媒体服务器列表
+ */
+ public static ServerResponse> getApiList(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_API_LIST, params);
+ return JSON.parseObject(s, new TypeReference>>() {
+ });
+ }
+
+ /**
+ * 获取网络线程负载
+ */
+ public static ServerResponse getThreadsLoad(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_THREADS_LOAD, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取主要对象个数
+ */
+ public static ServerResponse getStatistic(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_STATISTIC, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取后台线程负载
+ */
+ public static ServerResponse getWorkThreadsLoad(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_WORK_THREADS_LOAD, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取服务器配置
+ */
+ public static ServerResponse getServerConfig(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_SERVER_CONFIG, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 设置服务器配置
+ */
+ public static ServerResponse setServerConfig(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.SET_SERVER_CONFIG, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 重启服务器
+ */
+ public static ServerResponse restartServer(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.RESTART_SERVER, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取流列表
+ */
+ public static ServerResponse getMediaList(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_MEDIA_LIST, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 关断单个流
+ */
+ public static ServerResponse closeStream(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.CLOSE_STREAM, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 批量关断流
+ */
+ public static ServerResponse closeStreams(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.CLOSE_STREAMS, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取Session列表
+ */
+ public static ServerResponse getAllSession(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_ALL_SESSION, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 断开tcp连接
+ */
+ public static ServerResponse kickSession(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.KICK_SESSION, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 批量断开tcp连接
+ */
+ public static ServerResponse kickSessions(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.KICK_SESSIONS, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 添加rtsp/rtmp/hls拉流代理
+ */
+ public static ServerResponse addStreamProxy(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.ADD_STREAM_PROXY, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 关闭拉流代理
+ */
+ public static ServerResponse delStreamProxy(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.DEL_STREAM_PROXY, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 添加rtsp/rtmp推流
+ */
+ public static ServerResponse addStreamPusherProxy(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.ADD_STREAM_PUSHER_PROXY, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 关闭推流
+ */
+ public static ServerResponse delStreamPusherProxy(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.DEL_STREAM_PUSHER_PROXY, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 添加FFmpeg拉流代理
+ */
+ public static ServerResponse addFFmpegSource(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.ADD_FFMPEG_SOURCE, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 关闭FFmpeg拉流代理
+ */
+ public static ServerResponse delFFmpegSource(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.DEL_FFMPEG_SOURCE, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 流是否在线
+ */
+ public static ServerResponse isMediaOnline(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.IS_MEDIA_ONLINE, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取媒体流播放器列表
+ */
+ public static ServerResponse getMediaPlayerList(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_MEDIA_PLAYER_LIST, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 广播webrtc datachannel消息
+ */
+ public static ServerResponse broadcastMessage(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.BROADCAST_MESSAGE, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取流信息
+ */
+ public static ServerResponse getMediaInfo(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_MEDIA_INFO, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取流信息
+ */
+ public static ServerResponse getMp4RecordFile(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_MP4_RECORD_FILE, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 删除录像文件夹
+ */
+ public static ServerResponse deleteRecordDirectory(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.DELETE_RECORD_DIRECTORY, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 开始录制
+ */
+ public static ServerResponse startRecord(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.START_RECORD, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 设置录像速度
+ */
+ public static ServerResponse setRecordSpeed(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.SET_RECORD_SPEED, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 设置录像流播放位置
+ */
+ public static ServerResponse seekRecordStamp(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.SEEK_RECORD_STAMP, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 停止录制
+ */
+ public static ServerResponse stopRecord(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.STOP_RECORD, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 是否正在录制
+ */
+ public static ServerResponse isRecording(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.IS_RECORDING, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取截图
+ */
+ public static ServerResponse getSnap(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_SNAP, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 查询文件概览
+ */
+ public static ServerResponse getMp4RecordSummary(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_MP4_RECORD_SUMMARY, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取rtp推流信息
+ */
+ public static ServerResponse getRtpInfo(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_RTP_INFO, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 创建RTP服务器
+ */
+ public static ServerResponse openRtpServer(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.OPEN_RTP_SERVER, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 创建多路复用RTP服务器
+ */
+ public static ServerResponse openRtpServerMultiplex(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.OPEN_RTP_SERVER_MULTIPLEX, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 连接RTP服务器
+ */
+ public static ServerResponse connectRtpServer(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.CONNECT_RTP_SERVER, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 关闭RTP服务器
+ */
+ public static ServerResponse closeRtpServer(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.CLOSE_RTP_SERVER, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 更新RTP服务器过滤SSRC
+ */
+ public static ServerResponse updateRtpServerSSRC(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.UPDATE_RTP_SERVER_SSRC, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 暂停RTP超时检查
+ */
+ public static ServerResponse pauseRtpCheck(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.PAUSE_RTP_CHECK, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 恢复RTP超时检查
+ */
+ public static ServerResponse resumeRtpCheck(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.RESUME_RTP_CHECK, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取RTP服务器列表
+ */
+ public static ServerResponse listRtpServer(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.LIST_RTP_SERVER, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 开始发送rtp
+ */
+ public static ServerResponse startSendRtp(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.START_SEND_RTP, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 开始tcp passive被动发送rtp
+ */
+ public static ServerResponse startSendRtpPassive(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.START_SEND_RTP_PASSIVE, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 停止 发送rtp
+ */
+ public static ServerResponse stopSendRtp(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.STOP_SEND_RTP, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取版本信息
+ */
+ public static ServerResponse getVersion(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_VERSION, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取拉流代理信息
+ */
+ public static ServerResponse getProxyInfo(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_PROXY_INFO, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取推流代理信息
+ */
+ public static ServerResponse getProxyPusherInfo(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_PROXY_PUSHER_INFO, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 多文件推流
+ */
+ public static ServerResponse startMultiMp4Publish(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.START_MULTI_MP4_PUBLISH, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 获取存储信息
+ */
+ public static ServerResponse getStorageSpace(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.GET_STORAGE_SPACE, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 关闭多文件推流
+ */
+ public static ServerResponse stopMultiMp4Publish(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.STOP_MULTI_MP4_PUBLISH, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+ /**
+ * 点播mp4文件
+ */
+ public static ServerResponse loadMP4File(String host, String secret, Map params) {
+ String s = doApi(host, secret, ApiConstants.LOAD_MP4_FILE, params);
+ return JSON.parseObject(s, new TypeReference() {
+ });
+ }
+
+
+ public static void main(String[] args) {
+// ServerResponse zlm = getServerConfig(URL, SECRET);
+// System.out.println(zlm);
+ ServerResponse> version = getApiList(URL, SECRET, new HashMap<>());
+ System.out.println(version);
+ }
- public static String doApi(String host, String secret, String api, Map params) {
+ public static String doApi(String host, String secret, String path, Map params) {
Assert.notNull(host, "host is null");
- Assert.notNull(api, "api is null");
+ Assert.notNull(path, "api is null");
Assert.notNull(secret, "secret is null");
params = Optional.ofNullable(params).orElse(new HashMap<>());
params.put("secret", secret);
- String path = Constant.API_INDEX + api;
return HttpUtils.doPostHander(host, path, new HashMap<>(), params, StringUtils.EMPTY);
}
diff --git a/src/main/java/io/github/lunasaw/zlm/constant/ApiConstants.java b/src/main/java/io/github/lunasaw/zlm/constant/ApiConstants.java
new file mode 100644
index 0000000..674a345
--- /dev/null
+++ b/src/main/java/io/github/lunasaw/zlm/constant/ApiConstants.java
@@ -0,0 +1,170 @@
+package io.github.lunasaw.zlm.constant;
+
+/**
+ * @author weidian
+ * @version 1.0
+ * @date 2023/12/2
+ * @description:
+ */
+public class ApiConstants {
+
+ /*API基础路径*/
+ public static final String API_INDEX = "/index/api";
+
+ /*获取服务器api列表*/
+ public static final String GET_API_LIST = API_INDEX + "/getApiList";
+
+ /*获取网络线程负载*/
+ public static final String GET_THREADS_LOAD = API_INDEX + "/getThreadsLoad";
+
+ /*获取主要对象个数*/
+ public static final String GET_STATISTIC = API_INDEX + "/getStatistic";
+
+ /*获取后台线程负载*/
+ public static final String GET_WORK_THREADS_LOAD = API_INDEX + "/getWorkThreadsLoad";
+
+ /*获取服务器配置*/
+ public static final String GET_SERVER_CONFIG = API_INDEX + "/getServerConfig";
+
+ /*设置服务器配置*/
+ public static final String SET_SERVER_CONFIG = API_INDEX + "/setServerConfig";
+
+ /*重启服务器*/
+ public static final String RESTART_SERVER = API_INDEX + "/restartServer";
+
+ /*获取流列表*/
+ public static final String GET_MEDIA_LIST = API_INDEX + "/getMediaList";
+
+ /*关断单个流*/
+ public static final String CLOSE_STREAM = API_INDEX + "/close_stream";
+
+ /*批量关断流*/
+ public static final String CLOSE_STREAMS = API_INDEX + "/close_streams";
+
+ /*获取Session列表*/
+ public static final String GET_ALL_SESSION = API_INDEX + "/getAllSession";
+
+ /*断开tcp连接*/
+ public static final String KICK_SESSION = API_INDEX + "/kick_session";
+
+ /*批量断开tcp连接*/
+ public static final String KICK_SESSIONS = API_INDEX + "/kick_sessions";
+
+ /*添加rtsp/rtmp/hls拉流代理*/
+ public static final String ADD_STREAM_PROXY = API_INDEX + "/addStreamProxy";
+
+ /*关闭拉流代理*/
+ public static final String DEL_STREAM_PROXY = API_INDEX + "/delStreamProxy";
+
+ /*添加rtsp/rtmp推流*/
+ public static final String ADD_STREAM_PUSHER_PROXY = API_INDEX + "/addStreamPusherProxy";
+
+ /*关闭推流*/
+ public static final String DEL_STREAM_PUSHER_PROXY = API_INDEX + "/delStreamPusherProxy";
+
+ /*添加FFmpeg拉流代理*/
+ public static final String ADD_FFMPEG_SOURCE = API_INDEX + "/addFFmpegSource";
+
+ /*关闭FFmpeg拉流代理*/
+ public static final String DEL_FFMPEG_SOURCE = API_INDEX + "/delFFmpegSource";
+
+ /*流是否在线*/
+ public static final String IS_MEDIA_ONLINE = API_INDEX + "/isMediaOnline";
+
+ /*获取媒体流播放器列表*/
+ public static final String GET_MEDIA_PLAYER_LIST = API_INDEX + "/getMediaPlayerList";
+
+ /*广播webrtc datachannel消息*/
+ public static final String BROADCAST_MESSAGE = API_INDEX + "/broadcastMessage";
+
+ /*获取流信息*/
+ public static final String GET_MEDIA_INFO = API_INDEX + "/getMediaInfo";
+
+ /*获取流信息*/
+ public static final String GET_MP4_RECORD_FILE = API_INDEX + "/getMp4RecordFile";
+
+ /*删除录像文件夹*/
+ public static final String DELETE_RECORD_DIRECTORY = API_INDEX + "/deleteRecordDirectory";
+
+ /*开始录制*/
+ public static final String START_RECORD = API_INDEX + "/startRecord";
+
+ /*设置录像速度*/
+ public static final String SET_RECORD_SPEED = API_INDEX + "/setRecordSpeed";
+
+ /*设置录像流播放位置*/
+ public static final String SEEK_RECORD_STAMP = API_INDEX + "/seekRecordStamp";
+
+ /*停止录制*/
+ public static final String STOP_RECORD = API_INDEX + "/stopRecord";
+
+ /*是否正在录制*/
+ public static final String IS_RECORDING = API_INDEX + "/isRecording";
+
+ /*获取截图*/
+ public static final String GET_SNAP = API_INDEX + "/getSnap";
+
+ /*获取版本信息*/
+ public static final String VERSION = API_INDEX + "/version";
+
+ /*查询文件概览*/
+ public static final String GET_MP4_RECORD_SUMMARY = API_INDEX + "/getMp4RecordSummary";
+
+ /*获取rtp推流信息*/
+ public static final String GET_RTP_INFO = API_INDEX + "/getRtpInfo";
+
+ /*创建RTP服务器*/
+ public static final String OPEN_RTP_SERVER = API_INDEX + "/openRtpServer";
+
+ /*创建多路复用RTP服务器*/
+ public static final String OPEN_RTP_SERVER_MULTIPLEX = API_INDEX + "/openRtpServerMultiplex";
+
+ /*连接RTP服务器*/
+ public static final String CONNECT_RTP_SERVER = API_INDEX + "/connectRtpServer";
+
+ /*关闭RTP服务器*/
+ public static final String CLOSE_RTP_SERVER = API_INDEX + "/closeRtpServer";
+
+ /*更新RTP服务器过滤SSRC*/
+ public static final String UPDATE_RTP_SERVER_SSRC = API_INDEX + "/updateRtpServerSSRC";
+
+ /*暂停RTP超时检查*/
+ public static final String PAUSE_RTP_CHECK = API_INDEX + "/pauseRtpCheck";
+
+ /*恢复RTP超时检查*/
+ public static final String RESUME_RTP_CHECK = API_INDEX + "/resumeRtpCheck";
+
+ /*获取RTP服务器列表*/
+ public static final String LIST_RTP_SERVER = API_INDEX + "/listRtpServer";
+
+ /*开始发送rtp*/
+ public static final String START_SEND_RTP = API_INDEX + "/startSendRtp";
+
+ /*开始tcp passive被动发送rtp*/
+ public static final String START_SEND_RTP_PASSIVE = API_INDEX + "/startSendRtpPassive";
+
+ /*停止 发送rtp*/
+ public static final String STOP_SEND_RTP = API_INDEX + "/stopSendRtp";
+
+ /*获取版本信息*/
+ public static final String GET_VERSION = API_INDEX + "/version";
+
+ /*获取拉流代理信息*/
+ public static final String GET_PROXY_INFO = API_INDEX + "/getProxyInfo";
+
+ /*获取推流代理信息*/
+ public static final String GET_PROXY_PUSHER_INFO = API_INDEX + "/getProxyPusherInfo";
+
+ /*多文件推流*/
+ public static final String START_MULTI_MP4_PUBLISH = API_INDEX + "/startMultiMp4Publish";
+
+ /*获取存储信息*/
+ public static final String GET_STORAGE_SPACE = API_INDEX + "/getStorageSpace";
+
+ /*关闭多文件推流*/
+ public static final String STOP_MULTI_MP4_PUBLISH = API_INDEX + "/stopMultiMp4Publish";
+
+ /*点播mp4文件*/
+ public static final String LOAD_MP4_FILE = API_INDEX + "/loadMP4File";
+
+}
diff --git a/src/main/java/io/github/lunasaw/zlm/constant/Constant.java b/src/main/java/io/github/lunasaw/zlm/constant/Constant.java
deleted file mode 100644
index 1c4dde8..0000000
--- a/src/main/java/io/github/lunasaw/zlm/constant/Constant.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package io.github.lunasaw.zlm.constant;
-
-/**
- * @author weidian
- * @version 1.0
- * @date 2023/12/2
- * @description:
- */
-public class Constant {
-
- public static final String API_INDEX = "index/api";
-}
diff --git a/src/main/java/io/github/lunasaw/zlm/entity/ServerNodeConfig.java b/src/main/java/io/github/lunasaw/zlm/entity/ServerNodeConfig.java
new file mode 100644
index 0000000..1ae6a92
--- /dev/null
+++ b/src/main/java/io/github/lunasaw/zlm/entity/ServerNodeConfig.java
@@ -0,0 +1,422 @@
+package io.github.lunasaw.zlm.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+@Data
+public class ServerNodeConfig {
+
+ @JSONField(name = "ffmpeg.restart_sec")
+ private String ffmpegRestartSec;
+
+ @JSONField(name = "rtp.rtpMaxSize")
+ private String rtpRtpMaxSize;
+
+ @JSONField(name = "protocol.hls_demand")
+ private String protocolHlsDemand;
+
+ @JSONField(name = "rtp_proxy.opus_pt")
+ private String rtpProxyOpusPt;
+
+ @JSONField(name = "rtp_proxy.timeoutSec")
+ private String rtpProxyTimeoutSec;
+
+ @JSONField(name = "rtmp.port")
+ private String rtmpPort;
+
+ @JSONField(name = "hook.on_ip_not_found")
+ private String hookOnIpNotFound;
+
+ @JSONField(name = "record.fileRepeat")
+ private String recordFileRepeat;
+
+ @JSONField(name = "general.flowThreshold")
+ private String generalFlowThreshold;
+
+ @JSONField(name = "rtsp.rtpTransportType")
+ private String rtspRtpTransportType;
+
+ @JSONField(name = "hook.retry_delay")
+ private String hookRetryDelay;
+
+ @JSONField(name = "http.rootPath")
+ private String httpRootPath;
+
+ @JSONField(name = "rtsp.keepAliveSecond")
+ private String rtspKeepAliveSecond;
+
+ @JSONField(name = "hook.on_server_started")
+ private String hookOnServerStarted;
+
+ @JSONField(name = "api.defaultSnap")
+ private String apiDefaultSnap;
+
+ @JSONField(name = "cluster.origin_url")
+ private String clusterOriginUrl;
+
+ @JSONField(name = "http.port")
+ private String httpPort;
+
+ @JSONField(name = "http.virtualPath")
+ private String httpVirtualPath;
+
+ @JSONField(name = "http.keepAliveSecond")
+ private String httpKeepAliveSecond;
+
+ @JSONField(name = "ffmpeg.log")
+ private String ffmpegLog;
+
+ @JSONField(name = "hook.on_flow_report")
+ private String hookOnFlowReport;
+
+ @JSONField(name = "http.dirMenu")
+ private String httpDirMenu;
+
+ @JSONField(name = "rtsp.directProxy")
+ private String rtspDirectProxy;
+
+ @JSONField(name = "ffmpeg.cmd")
+ private String ffmpegCmd;
+
+ @JSONField(name = "rtp.lowLatency")
+ private String rtpLowLatency;
+
+ @JSONField(name = "protocol.enable_rtsp")
+ private String protocolEnableRtsp;
+
+ @JSONField(name = "rtsp.port")
+ private String rtspPort;
+
+ @JSONField(name = "rtmp.sslport")
+ private String rtmpSslport;
+
+ @JSONField(name = "protocol.hls_save_path")
+ private String protocolHlsSavePath;
+
+ @JSONField(name = "http.charSet")
+ private String httpCharSet;
+
+ @JSONField(name = "http.sendBufSize")
+ private String httpSendBufSize;
+
+ @JSONField(name = "hls.broadcastRecordTs")
+ private String hlsBroadcastRecordTs;
+
+ @JSONField(name = "api.apiDebug")
+ private String apiApiDebug;
+
+ @JSONField(name = "general.mergeWriteMS")
+ private String generalMergeWriteMS;
+
+ @JSONField(name = "http.forbidCacheSuffix")
+ private String httpForbidCacheSuffix;
+
+ @JSONField(name = "http.notFound")
+ private String httpNotFound;
+
+ @JSONField(name = "hook.retry")
+ private String hookRetry;
+
+ @JSONField(name = "record.appName")
+ private String recordAppName;
+
+ @JSONField(name = "hls.fileBufSize")
+ private String hlsFileBufSize;
+
+ @JSONField(name = "hook.timeoutSec")
+ private String hookTimeoutSec;
+
+ @JSONField(name = "rtsp.sslport")
+ private String rtspSslport;
+
+ @JSONField(name = "hls.deleteDelaySec")
+ private String hlsDeleteDelaySec;
+
+ @JSONField(name = "hook.on_rtp_server_timeout")
+ private String hookOnRtpServerTimeout;
+
+ @JSONField(name = "hook.on_send_rtp_stopped")
+ private String hookOnSendRtpStopped;
+
+ @JSONField(name = "hook.on_record_mp4")
+ private String hookOnRecordMp4;
+
+ @JSONField(name = "hook.alive_interval")
+ private String hookAliveInterval;
+
+ @JSONField(name = "rtmp.handshakeSecond")
+ private String rtmpHandshakeSecond;
+
+ @JSONField(name = "hook.stream_changed_schemas")
+ private String hookStreamChangedSchemas;
+
+ @JSONField(name = "rtc.externIP")
+ private String rtcExternIP;
+
+ @JSONField(name = "rtc.rembBitRate")
+ private String rtcRembBitRate;
+
+ @JSONField(name = "general.streamNoneReaderDelayMS")
+ private String generalStreamNoneReaderDelayMS;
+
+ @JSONField(name = "protocol.mp4_max_second")
+ private String protocolMp4MaxSecond;
+
+ @JSONField(name = "hook.on_publish")
+ private String hookOnPublish;
+
+ @JSONField(name = "rtp_proxy.port")
+ private String rtpProxyPort;
+
+ @JSONField(name = "http.sslport")
+ private String httpSslport;
+
+ @JSONField(name = "rtp.audioMtuSize")
+ private String rtpAudioMtuSize;
+
+ @JSONField(name = "general.check_nvidia_dev")
+ private String generalCheckNvidiaDev;
+
+ @JSONField(name = "record.fastStart")
+ private String recordFastStart;
+
+ @JSONField(name = "hook.on_stream_not_found")
+ private String hookOnStreamNotFound;
+
+ @JSONField(name = "rtp_proxy.port_range")
+ private String rtpProxyPortRange;
+
+ @JSONField(name = "protocol.enable_rtmp")
+ private String protocolEnableRtmp;
+
+ @JSONField(name = "srt.timeoutSec")
+ private String srtTimeoutSec;
+
+ @JSONField(name = "rtsp.handshakeSecond")
+ private String rtspHandshakeSecond;
+
+ @JSONField(name = "hls.segDur")
+ private String hlsSegDur;
+
+ @JSONField(name = "protocol.mp4_as_player")
+ private String protocolMp4AsPlayer;
+
+ @JSONField(name = "api.secret")
+ private String apiSecret;
+
+ @JSONField(name = "hls.segRetain")
+ private String hlsSegRetain;
+
+ @JSONField(name = "protocol.rtsp_demand")
+ private String protocolRtspDemand;
+
+ @JSONField(name = "srt.port")
+ private String srtPort;
+
+ @JSONField(name = "srt.pktBufSize")
+ private String srtPktBufSize;
+
+ @JSONField(name = "rtp_proxy.gop_cache")
+ private String rtpProxyGopCache;
+
+ @JSONField(name = "shell.maxReqSize")
+ private String shellMaxReqSize;
+
+ @JSONField(name = "ffmpeg.snap")
+ private String ffmpegSnap;
+
+ @JSONField(name = "general.maxStreamWaitMS")
+ private String generalMaxStreamWaitMS;
+
+ @JSONField(name = "multicast.addrMax")
+ private String multicastAddrMax;
+
+ @JSONField(name = "general.wait_add_track_ms")
+ private String generalWaitAddTrackMs;
+
+ @JSONField(name = "http.allow_cross_domains")
+ private String httpAllowCrossDomains;
+
+ @JSONField(name = "protocol.modify_stamp")
+ private String protocolModifyStamp;
+
+ @JSONField(name = "rtp.videoMtuSize")
+ private String rtpVideoMtuSize;
+
+ @JSONField(name = "api.snapRoot")
+ private String apiSnapRoot;
+
+ @JSONField(name = "protocol.enable_audio")
+ private String protocolEnableAudio;
+
+ @JSONField(name = "hook.on_server_keepalive")
+ private String hookOnServerKeepalive;
+
+ @JSONField(name = "multicast.addrMin")
+ private String multicastAddrMin;
+
+ @JSONField(name = "protocol.ts_demand")
+ private String protocolTsDemand;
+
+ @JSONField(name = "protocol.enable_fmp4")
+ private String protocolEnableFmp4;
+
+ @JSONField(name = "rtsp.lowLatency")
+ private String rtspLowLatency;
+
+ @JSONField(name = "http.allow_ip_range")
+ private String httpAllowIpRange;
+
+ @JSONField(name = "hook.on_rtsp_realm")
+ private String hookOnRtspRealm;
+
+ @JSONField(name = "hook.on_stream_changed")
+ private String hookOnStreamChanged;
+
+ @JSONField(name = "http.forwarded_ip_header")
+ private String httpForwardedIpHeader;
+
+ @JSONField(name = "rtp_proxy.h265_pt")
+ private String rtpProxyH265Pt;
+
+ @JSONField(name = "hook.on_del_mp4")
+ private String hookOnDelMp4;
+
+ @JSONField(name = "protocol.enable_hls")
+ private String protocolEnableHls;
+
+ @JSONField(name = "protocol.enable_mp4")
+ private String protocolEnableMp4;
+
+ @JSONField(name = "rtc.port")
+ private String rtcPort;
+
+ @JSONField(name = "protocol.fmp4_demand")
+ private String protocolFmp4Demand;
+
+ @JSONField(name = "record.sampleMS")
+ private String recordSampleMS;
+
+ @JSONField(name = "shell.port")
+ private String shellPort;
+
+ @JSONField(name = "hook.on_shell_login")
+ private String hookOnShellLogin;
+
+ @JSONField(name = "cluster.retry_count")
+ private String clusterRetryCount;
+
+ @JSONField(name = "general.enableVhost")
+ private String generalEnableVhost;
+
+ @JSONField(name = "general.unready_frame_cache")
+ private String generalUnreadyFrameCache;
+
+ @JSONField(name = "rtc.preferredCodecV")
+ private String rtcPreferredCodecV;
+
+ @JSONField(name = "rtp_proxy.h264_pt")
+ private String rtpProxyH264Pt;
+
+ @JSONField(name = "protocol.auto_close")
+ private String protocolAutoClose;
+
+ @JSONField(name = "srt.latencyMul")
+ private String srtLatencyMul;
+
+ @JSONField(name = "hook.on_server_exited")
+ private String hookOnServerExited;
+
+ @JSONField(name = "general.resetWhenRePlay")
+ private String generalResetWhenRePlay;
+
+ @JSONField(name = "protocol.mp4_save_path")
+ private String protocolMp4SavePath;
+
+ @JSONField(name = "protocol.continue_push_ms")
+ private String protocolContinuePushMs;
+
+ @JSONField(name = "rtp_proxy.dumpDir")
+ private String rtpProxyDumpDir;
+
+ @JSONField(name = "rtp_proxy.ps_pt")
+ private String rtpProxyPsPt;
+
+ @JSONField(name = "hook.enable")
+ private String hookEnable;
+
+ @JSONField(name = "rtc.timeoutSec")
+ private String rtcTimeoutSec;
+
+ @JSONField(name = "rtc.preferredCodecA")
+ private String rtcPreferredCodecA;
+
+ @JSONField(name = "hls.segKeep")
+ private String hlsSegKeep;
+
+ @JSONField(name = "multicast.udpTTL")
+ private String multicastUdpTTL;
+
+ @JSONField(name = "rtp.h264_stap_a")
+ private String rtpH264StapA;
+
+ @JSONField(name = "hook.on_stream_none_reader")
+ private String hookOnStreamNoneReader;
+
+ @JSONField(name = "hook.on_record_ts")
+ private String hookOnRecordTs;
+
+ @JSONField(name = "ffmpeg.bin")
+ private String ffmpegBin;
+
+ @JSONField(name = "protocol.enable_ts")
+ private String protocolEnableTs;
+
+ @JSONField(name = "protocol.enable_hls_fmp4")
+ private String protocolEnableHlsFmp4;
+
+ @JSONField(name = "hls.segNum")
+ private String hlsSegNum;
+
+ @JSONField(name = "http.maxReqSize")
+ private String httpMaxReqSize;
+
+ @JSONField(name = "rtc.tcpPort")
+ private String rtcTcpPort;
+
+ @JSONField(name = "cluster.timeout_sec")
+ private String clusterTimeoutSec;
+
+ @JSONField(name = "general.enable_ffmpeg_log")
+ private String generalEnableFfmpegLog;
+
+ @JSONField(name = "general.mediaServerId")
+ private String generalMediaServerId;
+
+ @JSONField(name = "hook.on_http_access")
+ private String hookOnHttpAccess;
+
+ @JSONField(name = "general.wait_track_ready_ms")
+ private String generalWaitTrackReadyMs;
+
+ @JSONField(name = "rtsp.authBasic")
+ private String rtspAuthBasic;
+
+ @JSONField(name = "hook.on_rtsp_auth")
+ private String hookOnRtspAuth;
+
+ @JSONField(name = "protocol.rtmp_demand")
+ private String protocolRtmpDemand;
+
+ @JSONField(name = "protocol.add_mute_audio")
+ private String protocolAddMuteAudio;
+
+ @JSONField(name = "record.fileBufSize")
+ private String recordFileBufSize;
+
+ @JSONField(name = "rtmp.keepAliveSecond")
+ private String rtmpKeepAliveSecond;
+
+ @JSONField(name = "hook.on_play")
+ private String hookOnPlay;
+}
\ No newline at end of file
diff --git a/src/main/java/io/github/lunasaw/zlm/entity/ServerResponse.java b/src/main/java/io/github/lunasaw/zlm/entity/ServerResponse.java
new file mode 100644
index 0000000..ac9ce13
--- /dev/null
+++ b/src/main/java/io/github/lunasaw/zlm/entity/ServerResponse.java
@@ -0,0 +1,14 @@
+package io.github.lunasaw.zlm.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+@Data
+public class ServerResponse {
+
+ @JSONField(name = "code")
+ private Integer code;
+
+ @JSONField(name = "data")
+ private T data;
+}
\ No newline at end of file
diff --git a/src/main/java/io/github/lunasaw/zlm/entity/Version.java b/src/main/java/io/github/lunasaw/zlm/entity/Version.java
new file mode 100644
index 0000000..24c7d6b
--- /dev/null
+++ b/src/main/java/io/github/lunasaw/zlm/entity/Version.java
@@ -0,0 +1,17 @@
+package io.github.lunasaw.zlm.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+@Data
+public class Version {
+
+ @JSONField(name = "buildTime")
+ private String buildTime;
+
+ @JSONField(name = "branchName")
+ private String branchName;
+
+ @JSONField(name = "commitHash")
+ private String commitHash;
+}
\ No newline at end of file
diff --git a/zlm-api.md b/zlm-api.md
new file mode 100644
index 0000000..3028b07
--- /dev/null
+++ b/zlm-api.md
@@ -0,0 +1,1460 @@
+---
+title: WD-ZLM v1.0.0
+language_tabs:
+ - shell: Shell
+ - http: HTTP
+ - javascript: JavaScript
+ - ruby: Ruby
+ - python: Python
+ - php: PHP
+ - java: Java
+ - go: Go
+toc_footers: [ ]
+includes: [ ]
+search: true
+code_clipboard: true
+highlight_theme: darkula
+headingLevel: 2
+generator: "@tarslib/widdershins v4.0.17"
+
+---
+
+# WD-ZLM
+
+> v1.0.0
+
+Base URLs:
+
+* 开发环境: http://127.0.0.1:9092
+
+# Default
+
+## GET 获取服务器api列表(getApiList)
+
+GET /index/api/getApiList
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取网络线程负载(getThreadsLoad)
+
+GET /index/api/getThreadsLoad
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取主要对象个数(getStatistic)
+
+GET /index/api/getStatistic
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取后台线程负载(getWorkThreadsLoad)
+
+GET /index/api/getWorkThreadsLoad
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取服务器配置(getServerConfig)
+
+GET /index/api/getServerConfig
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 设置服务器配置(setServerConfig)
+
+GET /index/api/setServerConfig
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| api.apiDebug | query | string | 是 | 配置键与配置项值 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 重启服务器(restartServer)
+
+GET /index/api/restartServer
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取流列表(getMediaList)
+
+GET /index/api/getMediaList
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 关断单个流(close_stream)
+
+GET /index/api/close_stream
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| schema | query | string | 是 | 协议,例如 rtsp或rtmp |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 test |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 批量关断流(close_streams)
+
+GET /index/api/close_streams
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| schema | query | string | 是 | 协议,例如 rtsp或rtmp |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 test |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取Session列表(getAllSession)
+
+GET /index/api/getAllSession
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 断开tcp连接(kick_session)
+
+GET /index/api/kick_session
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| id | query | string | 是 | 客户端唯一id,可以通过getAllSession接口获取 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 批量断开tcp连接(kick_sessions)
+
+GET /index/api/kick_sessions
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 添加rtsp/rtmp/hls拉流代理(addStreamProxy)
+
+GET /index/api/addStreamProxy
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| vhost | query | string | 是 | 添加的流的虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 添加的流的应用名,例如live |
+| stream | query | string | 是 | 添加的流的id名,例如test |
+| url | query | string | 是 | 拉流地址,例如rtmp://live.hkstv.hk.lxdns.com/live/hks2 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 关闭拉流代理(delStreamProxy)
+
+GET /index/api/delStreamProxy
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| key | query | string | 是 | addStreamProxy接口返回的key |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 添加rtsp/rtmp推流(addStreamPusherProxy)
+
+GET /index/api/addStreamPusherProxy
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|---------|-------|--------|----|-------------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| schema | query | string | 是 | 推流协议,支持rtsp、rtmp,大小写敏感 |
+| vhost | query | string | 是 | 已注册流的虚拟主机,一般为__defaultVhost__ |
+| app | query | string | 是 | 已注册流的应用名,例如live |
+| stream | query | string | 是 | 已注册流的id名,例如test |
+| dst_url | query | string | 是 | 推流地址,需要与schema字段协议一致 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 关闭推流(delStreamPusherProxy)
+
+GET /index/api/delStreamPusherProxy
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|------------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| key | query | string | 是 | addStreamPusherProxy接口返回的key |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 添加FFmpeg拉流代理(addFFmpegSource)
+
+GET /index/api/addFFmpegSource
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|------------|-------|--------|----|---------------------------------------------------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| src_url | query | string | 是 | FFmpeg拉流地址,支持任意协议或格式(只要FFmpeg支持即可) |
+| dst_url | query | string | 是 | FFmpeg rtmp推流地址,一般都是推给自己,例如rtmp://127.0.0.1/live/stream_form_ffmpeg |
+| timeout_ms | query | string | 是 | FFmpeg推流成功超时时间,单位毫秒 |
+| enable_hls | query | string | 是 | 是否开启hls录制 |
+| enable_mp4 | query | string | 是 | 是否开启mp4录制 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 关闭FFmpeg拉流代理(delFFmpegSource)
+
+GET /index/api/delFFmpegSource
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| key | query | string | 是 | none |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 流是否在线(isMediaOnline)
+
+GET /index/api/isMediaOnline
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| schema | query | string | 是 | 协议,例如 rtsp或rtmp |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 test |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取媒体流播放器列表(getMediaPlayerList)
+
+GET /index/api/getMediaPlayerList
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| schema | query | string | 是 | 协议,例如 rtsp或rtmp |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 test |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 广播webrtc datachannel消息(broadcastMessage)
+
+GET /index/api/broadcastMessage
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| schema | query | string | 是 | 协议,例如 rtsp或rtmp,目前仅支持rtsp协议 |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 test |
+| msg | query | string | 是 | none |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取流信息(getMediaInfo)
+
+GET /index/api/getMediaInfo
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| schema | query | string | 是 | 协议,例如 rtsp或rtmp |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 test |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取流信息(getMp4RecordFile)
+
+GET /index/api/getMp4RecordFile
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|-----------------|-------|--------|----|---------------------------------------------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 test |
+| customized_path | query | string | 是 | 录像文件保存自定义根目录,为空则采用配置文件设置 |
+| period | query | string | 是 | 流的录像日期,格式为2020-02-01,如果不是完整的日期,那么是搜索录像文件夹列表,否则搜索对应日期下的mp4文件列表 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 删除录像文件夹(deleteRecordDirectory)
+
+GET /index/api/deleteRecordDirectory
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|----------------------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 test |
+| period | query | string | 是 | 流的录像日期,格式为2020-01-01,如果不是完整的日期,那么会删除失败 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 开始录制(startRecord)
+
+GET /index/api/startRecord
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| type | query | string | 是 | 0为hls,1为mp4 |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 obs |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 设置录像速度(setRecordSpeed)
+
+GET /index/api/setRecordSpeed
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 obs |
+| speed | query | string | 是 | 要设置的录像倍速 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 设置录像流播放位置(seekRecordStamp)
+
+GET /index/api/seekRecordStamp
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 obs |
+| stamp | query | string | 是 | 要设置的录像播放位置 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 停止录制(stopRecord)
+
+GET /index/api/stopRecord
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| type | query | string | 是 | 0为hls,1为mp4 |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 obs |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 是否正在录制(isRecording)
+
+GET /index/api/isRecording
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| type | query | string | 是 | 0为hls,1为mp4 |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 obs |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取截图(getSnap)
+
+GET /index/api/getSnap
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|-------------|-------|--------|----|---------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| url | query | string | 是 | 需要截图的url,可以是本机的,也可以是远程主机的 |
+| timeout_sec | query | string | 是 | 截图失败超时时间,防止FFmpeg一直等待截图 |
+| expire_sec | query | string | 是 | 截图的过期时间,该时间内产生的截图都会作为缓存返回 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取rtp推流信息(getRtpInfo)
+
+GET /index/api/getRtpInfo
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|-----------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| stream_id | query | string | 是 | 流id |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 创建多路复用RTP服务器(openRtpServerMultiplex)
+
+GET /index/api/openRtpServer
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|-----------|-------|--------|----|------------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| port | query | string | 是 | 绑定的端口,0时为随机端口 |
+| tcp_mode | query | string | 是 | tcp模式,0时为不启用tcp监听,1时为启用tcp监听 |
+| stream_id | query | string | 是 | 该端口绑定的流id |
+
+#### 详细说明
+
+**stream_id**: 该端口绑定的流id
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 连接RTP服务器(connectRtpServer)
+
+GET /index/api/connectRtpServer
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|-----------|-------|--------|----|----------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| dst_url | query | string | 是 | tcp主动模式时服务端地址 |
+| dst_port | query | string | 是 | tcp主动模式时服务端端口 |
+| stream_id | query | string | 是 | OpenRtpServer时绑定的流id |
+
+#### 详细说明
+
+**stream_id**: OpenRtpServer时绑定的流id
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 关闭RTP服务器(closeRtpServer)
+
+GET /index/api/closeRtpServer
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|-----------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| stream_id | query | string | 是 | 该端口绑定的流id |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 更新RTP服务器过滤SSRC(updateRtpServerSSRC)
+
+GET /index/api/updateRtpServerSSRC
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|-----------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| stream_id | query | string | 是 | 该端口绑定的流id |
+| ssrc | query | string | 是 | 十进制ssrc |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 暂停RTP超时检查(pauseRtpCheck)
+
+GET /index/api/pauseRtpCheck
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|-----------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| stream_id | query | string | 是 | 该端口绑定的流id |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 恢复RTP超时检查(resumeRtpCheck)
+
+GET /index/api/resumeRtpCheck
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|-----------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| stream_id | query | string | 是 | 该端口绑定的流id |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取RTP服务器列表(listRtpServer)
+
+GET /index/api/listRtpServer
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 开始发送rtp(startSendRtp)
+
+GET /index/api/startSendRtp
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|----------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 obs |
+| ssrc | query | string | 是 | rtp推流的ssrc |
+| dst_url | query | string | 是 | 目标ip或域名 |
+| dst_port | query | string | 是 | 目标端口 |
+| is_udp | query | string | 是 | 是否为udp模式,否则为tcp模式 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 开始tcp passive被动发送rtp(startSendRtpPassive)
+
+GET /index/api/startSendRtpPassive
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|---------------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 obs |
+| ssrc | query | string | 是 | rtp推流的ssrc,ssrc不同时,可以推流到多个上级服务器 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 停止 发送rtp(stopSendRtp)
+
+GET /index/api/stopSendRtp
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| vhost | query | string | 是 | 虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 应用名,例如 live |
+| stream | query | string | 是 | 流id,例如 obs |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取版本信息
+
+GET /index/api/version
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取拉流代理信息(getProxyInfo)
+
+GET /index/api/getProxyInfo
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|------|
+| secret | query | string | 是 | none |
+| key | query | string | 是 | none |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取推流代理信息(getProxyPusherInfo)
+
+GET /index/api/getProxyPusherInfo
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|------|
+| secret | query | string | 是 | none |
+| key | query | string | 是 | none |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 多文件推流(startMultiMp4Publish)
+
+GET /index/api/startMultiMp4Publish
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|---------------|-------|--------|----|------------------|
+| secret | query | string | 是 | none |
+| app | query | string | 否 | 添加的流的应用名,例如live |
+| stream | query | string | 否 | 添加的流的id名,例如test |
+| startTime | query | string | 否 | 开始时间 |
+| endTime | query | string | 否 | 结束时间 |
+| speed | query | string | 否 | 倍速 |
+| remoteAddress | query | string | 否 | 推流地址 |
+| callId | query | string | 否 | 全局唯一ID |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 关闭多文件推流(startMultiMp4Publish)
+
+GET /index/api/stopMultiMp4Publish
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|---------|
+| secret | query | string | 是 | none |
+| key | query | string | 是 | none |
+| callId | query | string | 否 | 全局唯一ID |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 获取存储信息(getStorageSpace)
+
+GET /index/api/getStorageSpace
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 查询文件概览 getMp4RecordSummary
+
+GET /index/api/getMp4RecordSummary
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|--------|-------|--------|----|-----------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| app | query | string | 否 | none |
+| vhost | query | string | 否 | none |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+## GET 点播mp4文件(loadMP4File)
+
+GET /index/api/loadMP4File
+
+### 请求参数
+
+| 名称 | 位置 | 类型 | 必选 | 说明 |
+|-----------|-------|--------|----|------------------------------|
+| secret | query | string | 是 | api操作密钥(配置文件配置) |
+| vhost | query | string | 是 | 添加的流的虚拟主机,例如__defaultVhost__ |
+| app | query | string | 是 | 添加的流的应用名,例如live |
+| stream | query | string | 是 | 添加的流的id名,例如test |
+| file_path | query | string | 是 | mp4文件绝对路径 |
+
+> 返回示例
+
+> 200 Response
+
+```json
+{}
+```
+
+### 返回结果
+
+| 状态码 | 状态码含义 | 说明 | 数据模型 |
+|-----|---------------------------------------------------------|----|--------|
+| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | 成功 | Inline |
+
+### 返回数据结构
+
+# 数据模型
+
diff --git a/zlm-spring-boot-starter-test/pom.xml b/zlm-spring-boot-starter-test/pom.xml
index 275c231..ae86185 100644
--- a/zlm-spring-boot-starter-test/pom.xml
+++ b/zlm-spring-boot-starter-test/pom.xml
@@ -17,8 +17,8 @@
8
8
UTF-8
- 2.4.2
- 2.7.8
+ 2.5.2
+ 2.7.18
@@ -43,13 +43,6 @@
1.0-SNAPSHOT
-
- org.springframework.boot
- spring-boot-starter
- 2.7.10
-
-
-
org.springframework.boot
spring-boot-starter-test