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