648540858
2024-04-02 8b90fade9eb3a62b428f23f2306cb1911c98d355
支持使用abl接收国标流
21个文件已修改
1个文件已添加
2171 ■■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServer高性能流媒体服务器使用说明.txt 1743 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/abl/ABLRESTfulUtils.java 197 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/abl/bean/hook/ABLHookParam.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/bean/MediaInfo.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/bean/MediaServer.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/event/hook/HookSubscribe.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/service/IMediaNodeServerService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/service/IMediaServerService.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaNodeServerService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
数据库/abl/初始化-mysql-2.7.0.sql 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
数据库/abl/初始化-postgresql-kingbase-2.7.0.sql 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
数据库/abl/更新-mysql-2.7.0.sql 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
数据库/abl/更新-postgresql-kingbase-2.7.0.sql 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
@@ -195,8 +195,7 @@
        }
    }
    public void setFlv(String host, int port, int sslPort, String app, String stream, String callIdParam) {
        String file = String.format("%s/%s.live.flv%s", app, stream, callIdParam);
    public void setFlv(String host, int port, int sslPort, String file) {
        if (port > 0) {
            this.flv = new StreamURL("http", host, port, file);
        }
@@ -207,6 +206,15 @@
        }
    }
    public void setWsFlv(String host, int port, int sslPort, String file) {
        if (port > 0) {
            this.ws_flv = new StreamURL("ws", host, port, file);
        }
        if (sslPort > 0) {
            this.wss_flv = new StreamURL("wss", host, sslPort, file);
        }
    }
    public void setFmp4(String host, int port, int sslPort, String app, String stream, String callIdParam) {
        String file = String.format("%s/%s.live.mp4%s", app, stream, callIdParam);
        if (port > 0) {
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
@@ -42,11 +42,23 @@
    @Value("${media.stream-ip:${media.ip}}")
    private String streamIp;
    @Value("${media.http-port}")
    @Value("${media.http-port:0}")
    private Integer httpPort;
    @Value("${media.flv-port:0}")
    private Integer flvPort = 0;
    @Value("${media.ws-flv-port:0}")
    private Integer wsFlvPort = 0;
    @Value("${media.http-ssl-port:0}")
    private Integer httpSSlPort = 0;
    @Value("${media.flv-ssl-port:0}")
    private Integer flvSSlPort = 0;
    @Value("${media.ws-flv-ssl-port:0}")
    private Integer wsFlvSSlPort = 0;
    @Value("${media.rtmp-port:0}")
    private Integer rtmpPort = 0;
@@ -208,7 +220,11 @@
        mediaServerItem.setSdpIp(getSdpIp());
        mediaServerItem.setStreamIp(getStreamIp());
        mediaServerItem.setHttpPort(httpPort);
        mediaServerItem.setFlvPort(flvPort);
        mediaServerItem.setWsFlvPort(wsFlvPort);
        mediaServerItem.setHttpSSlPort(httpSSlPort);
        mediaServerItem.setFlvSSLPort(flvSSlPort);
        mediaServerItem.setWsFlvSSLPort(wsFlvSSlPort);
        mediaServerItem.setRtmpPort(rtmpPort);
        mediaServerItem.setRtmpSSlPort(rtmpSSlPort);
        mediaServerItem.setRtpProxyPort(getRtpProxyPort());
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -500,7 +500,7 @@
                        String startTimeStr = DateUtil.urlFormatter.format(start);
                        String endTimeStr = DateUtil.urlFormatter.format(end);
                        String stream = device.getDeviceId() + "_" + channelId + "_" + startTimeStr + "_" + endTimeStr;
                        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, stream, null, device.isSsrcCheck(), true, 0,false, false, device.getStreamModeForParam());
                        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, stream, null, device.isSsrcCheck(), true, 0,false,!channel.isHasAudio(), false, device.getStreamModeForParam());
                        sendRtpItem.setStream(stream);
                        // å†™å…¥redis, è¶…时时回复
                        redisCatchStorage.updateSendRTPSever(sendRtpItem);
@@ -530,7 +530,7 @@
                        }
                        sendRtpItem.setPlayType(InviteStreamType.DOWNLOAD);
                        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, null, null, device.isSsrcCheck(), true, 0, false, false, device.getStreamModeForParam());
                        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, null, null, device.isSsrcCheck(), true, 0, false,!channel.isHasAudio(), false, device.getStreamModeForParam());
                        sendRtpItem.setStream(ssrcInfo.getStream());
                        // å†™å…¥redis, è¶…时时回复
                        redisCatchStorage.updateSendRTPSever(sendRtpItem);
src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java
@@ -6,6 +6,7 @@
import com.genersoft.iot.vmp.media.service.IMediaNodeServerService;
import com.genersoft.iot.vmp.media.bean.MediaServer;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -14,9 +15,12 @@
@Service("abl")
public class ABLMediaNodeServerService implements IMediaNodeServerService {
    @Autowired
    private ABLRESTfulUtils ablresTfulUtils;
    @Override
    public int createRTPServer(MediaServer mediaServerItem, String streamId, long ssrc, Integer port, Boolean onlyAuto, Boolean reUsePort, Integer tcpMode) {
        return 0;
    public int createRTPServer(MediaServer mediaServer, String stream, long ssrc, Integer port, Boolean onlyAuto, Boolean disableAudio, Boolean reUsePort, Integer tcpMode) {
        return ablresTfulUtils.openRtpServer(mediaServer, "rtp", stream, 96, port, tcpMode, disableAudio?1:0);
    }
    @Override
src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java
@@ -212,15 +212,24 @@
//        if (mediaServerItem.getHttpSSlPort() == 0) {
//            mediaServerItem.setHttpSSlPort(ablServerConfig.getHttpSSLport());
//        }
        if (mediaServerItem.getRtmpPort() == 0) {
        if (mediaServerItem.getRtmpPort() == 0 && ablServerConfig.getRtmpPort() != null) {
            mediaServerItem.setRtmpPort(ablServerConfig.getRtmpPort());
        }
//        if (mediaServerItem.getRtmpSSlPort() == 0) {
//            mediaServerItem.setRtmpSSlPort(ablServerConfig.getRtmpSslPort());
//        }
        if (mediaServerItem.getRtspPort() == 0) {
        if (mediaServerItem.getRtspPort() == 0 && ablServerConfig.getRtspPort() != null) {
            mediaServerItem.setRtspPort(ablServerConfig.getRtspPort());
        }
        if (mediaServerItem.getFlvPort() == 0 && ablServerConfig.getHttpFlvPort() != null) {
            mediaServerItem.setFlvPort(ablServerConfig.getHttpFlvPort());
        }
        if (mediaServerItem.getWsFlvPort() == 0 && ablServerConfig.getWsPort() != null) {
            mediaServerItem.setWsFlvPort(ablServerConfig.getWsPort());
        }
        if (mediaServerItem.getRtpProxyPort() == 0 && ablServerConfig.getPsTsRecvPort() != null) {
            mediaServerItem.setRtpProxyPort(ablServerConfig.getPsTsRecvPort());
        }
//        if (mediaServerItem.getRtspSSLPort() == 0) {
//            mediaServerItem.setRtspSSLPort(ablServerConfig.getRtspSSlport());
//        }
src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServer¸ßÐÔÄÜÁ÷ýÌå·þÎñÆ÷ʹÓÃ˵Ã÷.txt
New file
@@ -0,0 +1,1743 @@
一、功能说明
         ABLMediaServer高性能流媒体服务器,windows平台采用高性能的完成端口网络模型、Linux下采用epoll,加上线程池进行媒体数据
    çš„æŽ¥æ”¶ã€è½¬æ¢ã€å‘送。服务器的性能强劲、运行稳定,坚如磐石。经过压力测试比较,转发性能、CPU占有率、运行稳定性优势明显 ã€‚可
    ä»¥é€šè¿‡ffmpeg命令或者其他标准的rtsp、rtmp推流函数往ABLMediaServer推送rtsp流、rtmp流,请求服务器代理拉流,请求服务器接收国
    æ ‡GB28181。服务器通过转换,输出标准的rtsp码流、rtmp码流、http-flv、ws-flv ç æµï¼ˆæ”¯æŒH265视频输出)、http-mp4(视频支持H264、
    H265,音频支持AAC)、hls码流输出(视频支持H264、H265,音频支持AAC)、GB28181码流(国标PS流 )输出。
        æµåª’体服务器支持录像、支持智能录像删除、录像查询、录像文件点播、录像文件极速下载。http-flv、ws-flv、http-mp4 åè®®ç‚¹æ’­æ—¶
    æ”¯æŒæš‚停继续、支持拖动播放。rtsp点播录像文件时支持慢放(1/16、1/8、1/4、1/2),快放(2、4、8、16 ï¼‰ã€æ­£å¸¸é€Ÿåº¦ã€æ”¯æŒæ‹–动播放。
    æµåª’体服务器支秒级(基本上1秒以内)图片抓拍,支持对抓拍的图片进行查找,支持抓拍图片以http协议下载。
       æœåŠ¡å™¨æ”¯æŒH265转码为H264,转码输出视频支持指定分辨率、宽高、码率大小等等参数。Windows平台支持英伟达显卡硬件加速转码。实
    æµ‹linux å¹³å°èƒ½æœ€å¤§å¹¶å‘转码40è·¯H265(硬件环境 è‡³å¼º E5 2650 V3),实测windows å¹³å°èƒ½æœ€å¤§å¹¶å‘转码35è·¯H265(i9 + è‹±ä¼Ÿè¾¾ RTX 2080)
       Linux æ–°å¢žæ”¯æŒè‹±ä¼Ÿè¾¾ä¸“业显卡,支持硬件解码、硬件编码,支持多个显卡同时进行转码。两张特斯拉T4(16G)显卡可以同时把80è·¯1080P
    çš„H265视频转码为 1280 x 720 çš„H264,转码延时低于10毫秒,如果需要更强的转码功能可以多插几张显卡或者集群 ã€‚
       æœåŠ¡å™¨æ”¯æŒè½¬ç å‡ºæ¥çš„è§†é¢‘æ‰“å…¥è‡ªå®šä¹‰æ°´å°ï¼Œæ”¯æŒæ°´å°çš„å­—ç¬¦å†…å®¹ã€å­—ä½“å¤§å°ã€ å­—体颜色、字体位置都可以在配置文件中配置。
        éžå¸¸æ„Ÿè°¢ZLMediaKit和Media-Server ä¸¤ä¸ªå·¥ç¨‹é¡¹ç›®çš„作者,ABLMediaSever参考复用了ZLMediaKit的http请求函数的参数表(请求的URL
    åŠè¯·æ±‚的参数名及一些初始值)以及整个框架的一些设计思想。直接调用了Media-Server å·¥ç¨‹çš„ rtmp、flv、hls、fmp4 å¤ç”¨ä¸Žè§£å¤ç”¨ç­‰ç­‰ã€‚
    éžå¸¸å´‡æ‹œä¸Žæ„Ÿè°¢ä¸¤ä½å¤§ä½¬ä¸ºä¸­å›½çš„开源流媒体努力与付出,再次感谢。
                                                                                    ã€æ¬¢è¿ŽåŠ å…¥é«˜æ€§èƒ½æµåª’ä½“æœåŠ¡QQ群 873666268 ã€‘
二、ABLMediaServer主要功能
    ç½‘络协议媒体输入
       rtsp、rtmp外部主动推流输入
         1、rtsp外部主动推流    (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
         2、rtmp外部主动推流    (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC)
         3、国标GB28181输入     (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
         4、交通运输部jtt1078   (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
       rtsp、rtmp、http-flv、本地mp4文件 æ‹‰æµè¾“入:
         1、rtsp     æ‹‰æµ       (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
         2、rtmp     æ‹‰æµ       (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC)
         3、http-flv æ‹‰æµ       (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC)
         4、本地mp4  æ‹‰æµ       (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
       websock方式私有协议发送PCM数据进入流媒体服务器(可以在浏览器录音通过websocket以下面的私有协议把语音接入流媒体服务器方便国标对讲、或者其他应用比如语音广播)
         1、数据包格式
            åŒ…头 + 数据类型 + 长度 + 数据包
            åŒ…头4个字节 0xAB 0xCD 0xEF 0xAB
            æ•°æ®ç±»åž‹ã€€  1 ä¸ªå­—节 ï¼Œ[ 0x01 æŽ¨æµéŸ³é¢‘注册 ] [0x02  å‘送 PCM éŸ³é¢‘数据包] [0x03 æ–­å¼€éŸ³é¢‘推流 ]
            é•¿åº¦     ã€€ 2 ä¸ªå­—节 ï¼Œç½‘络字节顺序(大端)
            æ•°æ®åŒ…      éŸ³é¢‘注册包、pcm音频数据包、注销包
        2、数据包类型
             1)、音频注册包 ,json æ ¼å¼
                 {"method":"register","app":"talk","stream":"xian_1","audioCodec":"pcm","channels":1,"sampleRate":16000,"targetAudioCodec":"g711a"}
                 æ ·ä¾‹ï¼šå‘送音频注册
                  websocket åªè¦è¿žæŽ¥ä¸Šæ¥ï¼Œå°±é¦–先发送 éŸ³é¢‘注册包
                 (0xAB 0xCD 0xEF 0xAB) + 0x01 + strlen(音频注册包) + {"method":"register","app":"talk","stream":"xian_1","audioCodec":"pcm","channels":1,"sampleRate":16000,"targetAudioCodec":"g711a"}
            2) ã€éŸ³é¢‘数据包 åªæ”¯æŒ 16位采样精度的pcm ï¼Œå•通道、双通道、常见的采样频率都支持(8000、16000、32000、48000)
                 æ ·ä¾‹ï¼šçŽ°åœ¨åªå‘é€çº¯pcm音频数据
                 (0xAB 0xCD 0xEF 0xAB) + 0x02 + strlen(pcm纯音频数据) + pcm纯音频数据
            3)、注销包
                {"method":"destruction"}
                æ ·ä¾‹ï¼šå‘送注销包
                (0xAB 0xCD 0xEF 0xAB) + 0x03 + strlen({"method":"destruction"} ) + {"method":"destruction"}
        æ”¯æŒç”¨ffmpeg推纯音频流接入流媒体服务器,支持的音频格式有(g711A、G711U、AAC、MP3)
             1、以rtsp协议推本地aac文件接入流媒体
                 ffmpeg -re -stream_loop -1 -i F:\music\xxx.aac -c:a aac -rtsp_transport tcp -f rtsp rtsp://190.15.240.11:554/music/aac1
             2、以rtmp协议推本地aac文件接入流媒体
                 ffmpeg -re -stream_loop -1 -i F:\music\xxx.aac -c:a aac -f flv rtmp://190.15.240.11:1935/music/aac2
             3、以rtsp协议推本地mp3文件接入流媒体
                 ffmpeg -re -stream_loop -1 -i F:\music\xxx.mp3 -c:a mp3 -rtsp_transport tcp -f rtsp rtsp://190.15.240.11:554/music/aac3
             4、以rtmp协议推本地mp3文件接入流媒体
                 ffmpeg -re -stream_loop -1 -i F:\music\xxx.mp3 -c:a mp3 -f flv rtmp://190.15.240.11:1935/music/aac4
             5、以rtsp协议推本地mp4文件中的纯音频流接入服务器
                 1) æ¯”如推一个视频格式为h264,音频为aac的mp4文件中的音频流进入服务器,那么服务器接收到的音频流为aac ,视频不做推送
                    ffmpeg -re -stream_loop -1 -i F:\video\H264_AAC_2021-02-10_1080P.mp4 -vn -acodec copy -rtsp_transport tcp -f rtsp rtsp://44.35.33.39:554/music/aac5
                 2) æ¯”如推一个视频格式为h264,音频为g711A的mp4文件中的音频流进入服务器,那么服务器接收到的音频流为g711A ,视频不做推送
                    ffmpeg -re -stream_loop -1 -i F:\video\H264-G711A-92017.mp4 -vn -acodec copy -rtsp_transport tcp -f rtsp rtsp://44.35.33.39:554/music/aac6
                 3) æ¯”如推一个视频格式为h264,音频为g711U的mp4文件中的音频流进入服务器,那么服务器接收到的音频流为g711U ,视频不做推送
                    ffmpeg -re -stream_loop -1 -i F:\video\H264-G711U-56434.mp4 -vn -acodec copy -rtsp_transport tcp -f rtsp rtsp://44.35.33.39:554/music/aac7
    ç½‘络协议媒体 è¾“出:
       è¢«åŠ¨æ‹‰æµè¾“å‡º
         1、rtsp                (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
         2、rtmp                (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC)
         3、GB28181码流         (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
         4、http-flv            (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC)
         5、http-hls            (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC)
         6、http-mp4            (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC)
          7、websocket-flv       (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC)
         8、webrtc              (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:G711A、G711U、OPUS)
         9、交通运输部jtt1078   (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
       rtsp、rtmp、gb28181、jtt1078 ä¸»åŠ¨æŽ¨æµè¾“å‡ºï¼š
         1、rtsp推流            (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
         2、rtmp推流            (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC)
         3、GB28181推流         (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
         4、交通运输部jtt1078   (支持 è§†é¢‘:H264、H265 ï¼ŒéŸ³é¢‘:AAC、G711A、G711U)
三、简明使用例子
     1) é¦–先要配置 ABLMediaServer.ini é‡Œé¢çš„ æœ¬æœºçš„IP地址 localipAddress ã€recordPath é¡¹ã€‚
          1  æœ¬æœºçš„IP地址,最好需要配置准确(如果不配置程序会自动获取一个地址代替,如果本机有多个地址可能会不准确,如果配置则使用配置的IP地址,这样就准确),
           å› ä¸ºè°ƒç”¨ getMediaList èŽ·å–å¯ç”¨åª’ä½“æºçš„json中,会使用到本机的IP地址来拼接 rtsp、rtmp、http-flv、ws-flv、hls、http-mp4 çš„æ’­æ”¾url ã€‚
           è°ƒç”¨ getMediaList è¿”回的json串中有如下url子项:
            "url": {
                "rtsp": "rtsp://10.0.0.239:554/Media/Camera_00001",
                "rtmp": "rtmp://10.0.0.239:1935/Media/Camera_00001",
                "http-flv": "http://10.0.0.239:8088/Media/Camera_00001.flv",
                "ws-flv": "ws://10.0.0.239:6088/Media/Camera_00001.flv",
                "http-mp4": "http://10.0.0.239:5088/Media/Camera_00001.mp4",
                "http-hls": "http://10.0.0.239:9088/Media/Camera_00001.m3u8"
            }
            å…¶ä¸­çš„ 10.0.0.239 å°±æ˜¯å¯ä»¥ä»Ž localipAddress é…ç½®é¡¹ ç²¾ç¡®èŽ·å– ã€‚
         2、录像路径配置 recordPath,如果不需要录像,可以忽略录像路径配置
            # å½•像文件保存路径,如果不配置录像文件保存在应用程序所在的路径下的record子路径,如果配置路径则保存在配置的路径的record里面
            # æ³¨æ„ï¼šå¦‚果需要录像存储,存储的硬盘千万不要分区,整个硬盘作为一个区,因为服务器没有执行两个以上的盘符操作。
            # å½•像保存路径配置 windows平台的路径配置 æ¯”如 D:\video ,Linux å¹³å°é…ç½® /home/video
            # å½•像路径使用了默认路径,就一直使用默认路径,如果使用了配置路径就一直使用配置路径,确保使用的路径的硬盘空间为最大的,如果需要更换路径,要把原来的录像路径的视频全部删除。
            # 1路高清5M的摄像头,如果录像的话,每小时产生2G大小左右的录像文件。可以根据这个来计算需要购买多大的硬盘,接入多少路摄像头,需要设置录像文件最大的保存时间
     2)、  åª’体输出规则: [network protocol]://[ip]:[port]/[app]/[stream][.extend]
              ã€æ³¨ï¼šå¦‚果自己不想拼接播放url ï¼Œå¯ä»¥è°ƒç”¨http函数 /index/api/getMediaList,返回可播放媒
               ä½“源中有各种播放协议的url, è¯¦è§ä¸‹é¢çš„函数 /index/api/getMediaList ã€‘
                è¯´æ˜Žï¼š
                      [network protocol]  æœ‰ rtsp、rtmp、http、ws
                      [ip]                å°±æ˜¯æœåŠ¡å™¨æ‰€åœ¨çš„IP地址
                        [port]              å„个网络协议分享时设置的端口号,详见 ABLMediaServer.ini çš„配置文件,里面有相应的网络协议配置端口
                      [app]               å„种网络协议发送过来设置的一级名字
                      [stream]            å„种网络协议发送过来设置的二级名字
                      [.extend]           æ‰©å±•名字,主要为为了访问服务器时,服务器需要识别网络协议需要客户端发送过来的扩展名。
                                            rtsp、rtmp        ä¸éœ€è¦æ‰©å±•名,
                                            http-flv ã€ws-flv æ‰©å±•名为 .flv
                                            hls æ–¹å¼è®¿é—®æ—¶ï¼Œ  æ‰©å±•名为 .m3u8
                                            http-mp4访问时    æ‰©å±•名为 .mp4
                      æ¯”如服务器IP为 190.15.240.11 ï¼Œapp ä¸º Media ,stream ä¸º Camera_00001 ,假定端口都是默认 ï¼Œé‚£ä¹ˆå„种网络访问url如下:
                         rtsp:
                            rtsp://190.15.240.11:554/Media/Camera_00001
                         rtmp:
                            rtmp://190.15.240.11:1935/Media/Camera_00001
                         http-flv:
                            http://190.15.240.11:8088/Media/Camera_00001.flv
                         http-mp4:
                            http://190.15.240.11:5088/Media/Camera_00001.mp4
                         websocket-flv:
                            ws://190.15.240.11:6088/Media/Camera_00001.flv
                         http-hls:
                            http://190.15.240.11:9088/Media/Camera_00001.m3u8
    3)、使用ffmpeg往 ABLMediaServer æŽ¨é€rtsp ç æµ ã€å‡å®š æºæ‘„像机rtsp RUL为 rtsp://admin:abldyjh2020@192.168.1.120:554 , ABLMediaServer æ‰€åœ¨æœåŠ¡å™¨åœ°å€ä¸º 190.15.240.11 ã€‘
        ã€æŽ¨é€rtsp方式说明:视频支持 H264、H265 ,音频支持AAC、G711A、G711U ã€‘
        ffmpeg -rtsp_transport tcp -i rtsp://admin:abldyjh2020@192.168.1.120:554 -vcodec copy -acodec copy -f rtsp -rtsp_transport tcp rtsp://190.15.240.11:554/Media/Camera_00001
       åª’体输出:
         rtsp: ã€rtsp输出格式说明:视频支持 H264、H265 ,音频支持AAC、G711A、G711U ã€‘
            rtsp://190.15.240.11:554/Media/Camera_00001
         rtmp: ã€rtmp输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
            rtmp://190.15.240.11:1935/Media/Camera_00001
         http-flv: ã€http-flv输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
            http://190.15.240.11:8088/Media/Camera_00001.flv
         ws-flv: ã€http-flv输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
            ws://190.15.240.11:6088/Media/Camera_00001.flv
         http-hls: ã€http-hls输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
            http://190.15.240.11:9088/Media/Camera_00001.m3u8
    4)、使用ffmpeg往 ABLMediaServer æŽ¨é€rtmp ç æµ ã€å‡å®š æºæ‘„像机rtsp RUL为 rtsp://admin:abldyjh2020@192.168.1.120:554 , ABLMediaServer æ‰€åœ¨æœåŠ¡å™¨åœ°å€ä¸º 190.15.240.11 ã€‘
        ã€æŽ¨é€rtmp方式说明:视频支持 H264 ,音频支持AAC ã€‘
        ffmpeg -rtsp_transport tcp -i rtsp://admin:abldyjh2020@192.168.1.120:554 -acodec copy -vcodec copy -f flv rtmp://190.15.240.11:1935/Media/Camera_00001
          rtsp: ã€rtsp输出格式说明:视频支持 H264、H265 ,音频支持AAC、G711A、G711U ã€‘
            rtsp://190.15.240.11:554/Media/Camera_00001
          rtmp: ã€rtmp输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
            rtmp://190.15.240.11:1935/Media/Camera_00001
          http-flv: ã€http-flv输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
            http://190.15.240.11:8088/Media/Camera_00001.flv
         ws-flv: ã€http-flv输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
            ws://190.15.240.11:6088/Media/Camera_00001.flv
         http-hls: ã€http-hls输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
             http://190.15.240.11:9088/Media/Camera_00001.m3u8
    5)、使用ffmpeg往 ABLMediaServer æŽ¨é€rtsp的文件码流 ã€å‡å®šåª’体文件为:F:\video\MP4有声音\H264_AAC_2021-02-10_1080P.mp4  , ABLMediaServer æ‰€åœ¨æœåŠ¡å™¨åœ°å€ä¸º 190.15.240.11 ã€‘
        ã€æŽ¨é€rtsp方式说明:视频支持 H264、H265 ,音频支持AAC、G711A、G711U ã€‘
        ffmpeg -re -stream_loop -1 -i F:\video\MP4有声音\H264_AAC_2021-02-10_1080P.mp4 -vcodec copy -acodec copy -rtsp_transport tcp -f rtsp rtsp://190.15.240.11:554/Media/Camera_00001
        åª’体输出:
          rtsp: ã€rtsp输出格式说明:视频支持 H264、H265 ,音频支持AAC、G711A、G711U ã€‘
            rtsp://190.15.240.11:554/Media/Camera_00001
          rtmp: ã€rtmp输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
            rtmp://190.15.240.11:1935/Media/Camera_00001
          http-flv: ã€http-flv输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
            http://190.15.240.11:8088/Media/Camera_00001.flv
         ws-flv: ã€http-flv输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
            ws://190.15.240.11:6088/Media/Camera_00001.flv
         http-hls: ã€http-hls输出格式说明:视频支持 H264、H265 ,音频支持AAC ã€‘
             http://190.15.240.11:9088/Media/Camera_00001.m3u8
      ã€ç‰¹åˆ«æ³¨æ˜Žï¼šå¯ä»¥å¾€10000 çš„udp端口推送TS码流,推送成功后,可以调用 http函数getMediaList来获取接入的rtp码流 ã€‘
         ffmpeg.exe -re -stream_loop -1 -i F:\video\H264_20191021094432.mp4 -vcodec copy -f rtp_mpegts rtp://127.0.0.1:100000
    6)、流媒体输出播放验证
         å¦‚果视频是rtsp方式,可以采用VLC进行播放验证 
     å¦‚æžœrtmp、http-flv åè®®ï¼Œè§†é¢‘为h264 ,可以采用VLC播放验证、或者B站的 flv.js æ’­æ”¾å™¨éªŒè¯
         å¦‚æžœrtmp、http-flv åè®®ï¼Œè§†é¢‘为h265 ,可以采用EasyPlayer.js æ’­æ”¾å™¨éªŒè¯ï¼Œã€æ³¨ï¼šVLC ã€flv.js ä¸æ”¯æŒRtmp的H265视频、也不支持http-flv的265视频 ã€‘
    7)、申请代理rtsp、rtmp、flv æ‹‰æµ ã€æœ¬åœ°mp4文件 ï¼Œç”³è¯·åˆ é™¤ä»£ç†æ‹‰æµ
         1) ç”³è¯·ä»£ç†rtsp、rtmp、flv æ‹‰æµã€æœ¬åœ°mp4文件
               URL: /index/api/addStreamProxy
                    å‚数:               å‚数说明            å‚数参考值
                    secret                   æœåŠ¡å™¨å¯†ç         æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    vhost                                      æ¯”如  _defaultVhost_
                    app                      åº”用名            æ¯”如 Media
                    stream                   åª’体流名          æ¯”如 Camera_00001            ã€/app/stream ç»„合起来不能重复】
                    url                      ä»£ç†æ‹‰æµurl       æ¯”如 rtsp://admin:abldyjh2020@192.168.1.120:554         æˆ–者
                                                                       rtmp://190.15.240.36:1935/Media/Camera_00001       æˆ–者
                                                                     http://190.15.240.36:8088/Media/Camera_00001.flv   æˆ–者
                                                                    d:\\video\\xxxx.mp4   (windows平台)
                                                                    /home/video/xxxx.mp4  (Linux平台)
                     isRtspRecordURL                             ä»£ç†æ‹‰æµçš„url是否是rtsp录像回放的url é»˜è®¤0 ï¼Œ1 æ˜¯ã€å¯é€‰å‚数】,如果是rtsp录像回放的url,可以进行控制代理拉流,比如 æš‚停、继续、控制倍速播放,拖动播放等等 ï¼Œå‚考
                                                                å‡½æ•° /index/api/controlStreamProxy
                    optionsHeartbeat          options心跳       options å‘½ä»¤ä½œä¸ºå¿ƒè·³åŒ…      ã€å¯é€‰å‚数】 ä»£ç†rtsp拉流成后,是否开启发送 0 ä¸å¼€å¯ï¼Œ 1 å¼€å¯ ï¼Œé»˜è®¤ä¸å¼€å¯ï¼Œå¦‚果从 ZLMediaKit æ‹‰å–rtsp流,建议设置为 1
                    enable_mp4                æ˜¯å¦å½•像          1 å½•像,0 ä¸å½•像            ã€å¯é€‰å‚数】
                    enable_hls                æ˜¯å¦hls切片       1 è¿›è¡Œhls åˆ‡ç‰‡ ï¼Œ0 ä¸åˆ‡ç‰‡   ã€å¯é€‰å‚数】
                    convertOutWidth           è½¬ç å®½            è½¬ç è¾“出宽 å¦‚果指定宽、高   ã€å¯é€‰å‚数】[1920 x 1080, 1280 x 720 ,960 x 640 ,800 x 480 ,720 x 576 , 720 x 480 ,640 x 480 ,352 x 288 ] å°±è¯´æ˜Ž H265 è¿›è¡Œè½¬ç ä¸º H264
                    convertOutHeight          è½¬ç é«˜            è½¬ç è¾“出高 å¦‚果指定宽、高   ã€å¯é€‰å‚数】[1920 x 1080, 1280 x 720 ,960 x 640 ,800 x 480 ,720 x 576 , 720 x 480 ,640 x 480 ,352 x 288 ] å°±è¯´æ˜Ž H265 è¿›è¡Œè½¬ç ä¸º H264
                    H264DecodeEncode_enable   H264是否解码      H264分辨率高再编码降分辨率,【可选参数】有时候需要H264视频进行先解码再重新编码降低分辨率,可以设置 H264DecodeEncode_enable ä¸º 1 ï¼Œé™ä¸‹æ¥çš„分辨率为 convertOutWidth ã€ convertOutHeight
                    disableVideo              æ˜¯å¦è¿‡æ»¤æŽ‰è§†é¢‘    0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤è§†é¢‘       ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤è§†é¢‘,国家电网协议中需要摄像头和摄像头直接需要对接,摄像头推上来的媒体流中过滤掉视频(disableVideo=1)再发给对方才能完成对讲
                    disableAudio              æ˜¯å¦è¿‡æ»¤æŽ‰éŸ³é¢‘    0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤éŸ³é¢‘       ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤éŸ³é¢‘,有时候不需要音频、或者由于敏感原因禁止收听音频,可以过滤掉音频流接入流媒体服务器,只需要设置 disableAudio = 1即可过滤音频
               http  GET æ–¹å¼
                    1 è¯·æ±‚rtsp拉流样例
                        http://190.15.240.11:7088/index/api/addStreamProxy?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&vhost=_defaultVhost_&app=Media&stream=Camera_00001&url=rtsp://admin:abldyjh2020@192.168.1.120:554&enable_mp4=0
               http POST æ–¹å¼
                    1 è¯·æ±‚rtsp拉流样例
                       http请求 url æ ·ä¾‹
                         http://190.15.240.11:7088/index/api/addStreamProxy
                       body å‚æ•° , json æ ¼å¼
                         {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","vhost":"_defaultVhost_","app":"Media","stream":"Camera_00001","url":"rtsp://admin:abldyjh2020@192.168.1.120:554","enable_mp4":0}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "success",   # success ä¸ºæˆåŠŸ
                        "key": 93            # æˆåŠŸæ—¶è¿”å›žå¤§äºŽ0的值,为代理拉流的Key ,删除代理拉流时需要用的
                    }
         2) æŽ§åˆ¶ä»£ç†æ‹‰æµï¼Œæ¯”如 æš‚停、继续、控制倍速播放,拖动播放等等
                 URL: /index/api/controlStreamProxy
                 å‚数:
                    secret  æœåŠ¡å™¨å¯†ç  ï¼Œæ¯”如  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    key                  æ¯”如  93 ï¼Œè°ƒç”¨ addStreamProxy è¿”回的 key çš„值
                    command              æ¯”如  pause、resume、seek、scale å¯¹äºŽå¯¹åº”意思:暂停、继续、拖动播放、倍速播放
                     value  (字符串)      æ¯”如  1、2、4、8、16(倍速播放) ï¼Œnpt方式:360、1800、3600(拖动播放),clock方式:clock=20230625T113000Z-19700101T000001Z(拖动到:2023-06-25 11:30:00执行播放)
                                               value ä¸ºå¯é€‰å‚数,当 command ä¸º pause,resume æ—¶ï¼Œvalue ä¸ç”¨ ï¼Œå½“ command ä¸ºseek,sacale
                                               æ˜¯ï¼Œéœ€è¦å¡«å†™value的值
                    å‘½ä»¤ã€å€¼æ ·ä¾‹åˆ—表
                    command              value                                             æ³¨é‡Š
                    pause                ä¸éœ€è¦                                            æš‚停回放
                    resume               ä¸éœ€è¦                                            ç»§ç»­å›žæ”¾
                    scale                2                                                 2倍速回放
                    seek                 360                                               æ‹–拽从开始点计算起到360秒处再回放  ã€ntp方式拖拽 ï¼Œä»£è¡¨ åŽä¸º VCN\3800 ã€‘
                    seek                 clock=20230625T113000Z-19700101T000001Z           æ‹–拽到20230625T113000Z处再回放     ã€clock方式拖拽 ï¼Œä»£è¡¨ æµ·åº·NVR  ã€‘
                http GET æ–¹å¼
                    http://190.15.240.11:7088/index/api/controlStreamProxy?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93&command=pause              æš‚停
                    http://190.15.240.11:7088/index/api/controlStreamProxy?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93&command=resume             ç»§ç»­
                    http://190.15.240.11:7088/index/api/controlStreamProxy?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93&command=scale&value=2      2倍速回放
                    http://190.15.240.11:7088/index/api/controlStreamProxy?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93&command=seek&value=360     æ‹–拽到360秒处继续回放
                    http://190.15.240.11:7088/index/api/controlStreamProxy?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93&command=seek&value=clock=20230625T113000Z-19700101T000001Z
                http  POST æ–¹å¼
                    http URL :
                      http://190.15.240.11:7088/index/api/controlStreamProxy
                    body å‚æ•° Json格式
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93,"command":"pause"}
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93,"command":"resume"}
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93,"command":"sacale","value":"2"}
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93,"command":"seek","value":"360"}
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93,"command":"seek","value":"clock=20230625T113000Z-19700101T000001Z"}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "success",   # success ä¸ºæˆåŠŸ ,如果失败是其他值
                    }
                 ã€æ³¨ï¼šå‘送http请求 å¯ä»¥ä½¿ç”¨curl、postman、或者其他标准的http工具 ã€‘
         3) ç”³è¯·åˆ é™¤ä»£ç†rtsp、rtmp、flv æ‹‰æµ
                  URL: /index/api/delStreamProxy
                 å‚数:
                    secret  æœåŠ¡å™¨å¯†ç  ï¼Œæ¯”如  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    key                  æ¯”如  93 ï¼Œè°ƒç”¨ addStreamProxy è¿”回的 key çš„值
                http GET æ–¹å¼
                    http://190.15.240.11:7088/index/api/delStreamProxy?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93
                http  POST æ–¹å¼
                    http URL :
                      http://190.15.240.11:7088/index/api/delStreamProxy
                    body å‚æ•° Json格式
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "success",   # success ä¸ºæˆåŠŸ ,如果失败是其他值
                    }
                 ã€æ³¨ï¼šå‘送http请求 å¯ä»¥ä½¿ç”¨curl、postman、或者其他标准的http工具 ã€‘
     8)、申请代理rtsp、rtmp、推流 ã€ç”³è¯·åˆ é™¤ä»£ç†æ‹‰æµ
         1) ç”³è¯·ä»£ç†rtsp、rtmp æŽ¨æµï¼ˆæ³¨æ„ï¼šä¸æ˜¯å›½æ ‡GB28181推流)
                 URL: /index/api/addPushProxy
                 å‚数:                å‚数说明          å‚考值
                    secret             æœåŠ¡å™¨å¯†ç  ï¼Œ      æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    vhost                                 æ¯”如 _defaultVhost_
                    app                åº”用名             æ¯”如 Media
                    stream             åª’体流名           æ¯”如 Camera_00001
                    url                ä»£ç†æŽ¨æµurl        æ¯”如 rtsp://190.15.240.36:554/Media/Camera_00001 æˆ–者 rtmp://190.15.240.36:1935/Media/Camera_00001
                    disableVideo       æ˜¯å¦è¿‡æ»¤æŽ‰è§†é¢‘     0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤è§†é¢‘  ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤è§†é¢‘,国家电网协议中需要摄像头和摄像头直接需要对接,摄像头推上来的媒体流中过滤掉视频(disableVideo=1)再发给对方才能完成对讲
                    disableAudio       æ˜¯å¦è¿‡æ»¤æŽ‰éŸ³é¢‘     0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤éŸ³é¢‘  ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤éŸ³é¢‘,有时候不需要音频、或者由于敏感原因禁止收听音频,可以过滤掉音频流接入流媒体服务器,只需要设置 disableAudio = 1即可过滤音频
               http  GET æ–¹å¼
                     http://190.15.240.11:7088/index/api/addPushProxy?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&vhost=_defaultVhost_&app=Media&stream=Camera_00001&url=rtsp://190.15.240.36:554/Media/Camera_00001
               http  POST æ–¹å¼
                    http URL
                      http://190.15.240.11:7088/index/api/addPushProxy
                    http Body å‚æ•° (json格式)
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","vhost":"_defaultVhost_","app":"Media","stream":"Camera_00001","url":"rtsp://190.15.240.36:554/Media/Camera_00001"}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "success",   # success ä¸ºæˆåŠŸ
                        "key": 93            # æˆåŠŸæ—¶è¿”å›žå¤§äºŽ0的值,为代理推流的Key ,删除代理推流时需要用的
                    }
         2) ç”³è¯·åˆ é™¤ä»£ç†rtsp、rtmp æŽ¨æµ
                  URL: /index/api/delPushProxy
                 å‚数:      å‚数说明          å‚数参考值
                    secret  æœåŠ¡å™¨å¯†ç  ï¼Œ      æ¯”如  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    key     ä¸»é”®ID             æ¯”如  93 ï¼Œè°ƒç”¨ /index/api/addPushProxy è¿”回的 key çš„值
                http GET æ–¹å¼
                    http://190.15.240.11:7088/index/api/delPushProxy?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93
                http POST æ–¹å¼
                    http URL
                      http://190.15.240.11:7088/index/api/delPushProxy
                    http Body json æ ¼å¼
                      {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "success",   # success ä¸ºæˆåŠŸ ,如果失败是其他值
                    }
    9)、创建GB28181\Jtt1078接收端口、删除GB28181\Jtt1078接收端口、国标暂停、继续
         1     åˆ›å»ºGB28181\Jtt1078接收端口
                 URL: /index/api/openRtpServer
                 åŠŸèƒ½ï¼š
                      åˆ›å»ºGB28181\Jtt1078接收端口,如果该端口接收超时,会自动回收,不用调用  /index/api/closeRtpServer
                 å‚数:                      å‚数说明           å‚数参考值
                    secret                    æœåŠ¡å™¨å¯†ç         æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    vhost                                       æ¯”如 _defaultVhost_
                    app                       åº”用名            æ¯”如 gb28181 ã€rtp ç­‰ç­‰ (接入)
                    stream_id                 åª’体流名          æ¯”如 44030012343220234234 ï¼ˆæœ€å¥½æ˜¯å›½æ ‡ç¼–号)( æŽ¥å…¥ )
                    payload                   PS负载值          å›½æ ‡SDP里面PS负载值 ,比如 96,98 ,108 ,一定要从国标SDP里面获取
                    port                      ç«¯å£å·            0 ï¼Œç”±æœåŠ¡å™¨è‡ªåŠ¨åˆ†é…ï¼Œåˆ«çš„å€¼ æ¯”如 26324 ä¸ºæŒ‡å®šç«¯å£
                    enable_tcp                æ˜¯å¦ä¸ºtcp         0 ä¸º udp , 1 ä¸ºtcp被动方式 ï¼Œ2 ä¸ºtcp主动连接方式
                    dst_url                   ç›®æ ‡IP            ç›®æ ‡IP地址  ã€å¯é€‰å‚æ•° ï¼Œå½“ enable_tcp ä¸º 2 æ—¶å¿…须填写 ã€‘
                    dst_port                  ç›®æ ‡ç«¯å£          ç›®æ ‡ç«¯å£    ã€å¯é€‰å‚æ•° ï¼Œå½“ enable_tcp ä¸º 2 æ—¶å¿…须填写】
                     enable_mp4                æ˜¯å¦å½•像          1 å½•像,0 ä¸å½•像            ã€å¯é€‰å‚数】
                    enable_hls                æ˜¯å¦hls切片       1 è¿›è¡Œhls åˆ‡ç‰‡ ï¼Œ0 ä¸åˆ‡ç‰‡   ã€å¯é€‰å‚数】
                    convertOutWidth           è½¬ç å®½            è½¬ç è¾“出宽 å¦‚果指定宽、高   ã€å¯é€‰å‚数】[1920 x 1080, 1280 x 720 ,960 x 640 ,800 x 480 ,720 x 576 , 720 x 480 ,640 x 480 ,352 x 288 ] å°±è¯´æ˜Ž H265 è¿›è¡Œè½¬ç ä¸º H264
                    convertOutHeight          è½¬ç é«˜            è½¬ç è¾“出高 å¦‚果指定宽、高   ã€å¯é€‰å‚数】[1920 x 1080, 1280 x 720 ,960 x 640 ,800 x 480 ,720 x 576 , 720 x 480 ,640 x 480 ,352 x 288 ] å°±è¯´æ˜Ž H265 è¿›è¡Œè½¬ç ä¸º H264
                    H264DecodeEncode_enable   H264是否解码      H264分辨率高再编码降分辨率,【可选参数】有时候需要H264视频进行先解码再重新编码降低分辨率,可以设置 H264DecodeEncode_enable ä¸º 1 ï¼Œé™ä¸‹æ¥çš„分辨率为 convertOutWidth ã€ convertOutHeight
                    RtpPayloadDataType        rtp打包数据格式   rtp打包数据格式             ã€å¯é€‰å‚æ•° ï¼Œé»˜è®¤ 1 ã€‘ [1 PS å›½æ ‡gb28181 ]、[ 2 ES è§†é¢‘支持 H246\H265,音频只支持G711A、G711U ]、[3 XHB (一家公司的打包格式) åªæ”¯æŒè§†é¢‘,音频不能加入打包 ] [ 4 ã€Jt1078(2016版本)码流接入 ]
                    disableVideo              æ˜¯å¦è¿‡æ»¤æŽ‰è§†é¢‘    0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤è§†é¢‘       ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤è§†é¢‘,国家电网协议中需要摄像头和摄像头直接需要对接,摄像头推上来的媒体流中过滤掉视频(disableVideo=1)再发给对方才能完成对讲
                    disableAudio              æ˜¯å¦è¿‡æ»¤æŽ‰éŸ³é¢‘    0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤éŸ³é¢‘       ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤éŸ³é¢‘,有时候不需要音频、或者由于敏感原因禁止收听音频,可以过滤掉音频流接入流媒体服务器,只需要设置 disableAudio = 1即可过滤音频
                    jtt1078_version           æŒ‡å®š1078版本号    2013、2016、2019            ã€å¯é€‰å‚数】 2013 æŒ‡å®šä¸º 2013版本 ã€2016 æŒ‡å®šä¸º 2016版本、 2019 æŒ‡å®šä¸º 2019 ç‰ˆæœ¬
                    send_app                  åº”用名            æ¯”如 gb28181 ã€rtp ç­‰ç­‰     ã€å¯é€‰å‚数】 ç”¨äºŽæŠŠæœ¬æœåŠ¡å™¨çš„ç æµï¼ˆsend_app/send_stream_id)回复给发送端
                    send_stream_id            åª’体流名          æ¯”如 44030012343220234234   ã€å¯é€‰å‚数】 ç”¨äºŽæŠŠæœ¬æœåŠ¡å™¨çš„ç æµï¼ˆsend_app/send_stream_id)回复给发送端
                    send_disableVideo         æ˜¯å¦è¿‡æ»¤æŽ‰è§†é¢‘    0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤è§†é¢‘       ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤è§†é¢‘,国家电网协议中需要摄像头和摄像头直接需要对接,摄像头推上来的媒体流中过滤掉视频(disableVideo=1)再发给对方才能完成对讲
                    send_disableAudio         æ˜¯å¦è¿‡æ»¤æŽ‰éŸ³é¢‘    0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤éŸ³é¢‘       ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤éŸ³é¢‘,有时候不需要音频、或者由于敏感原因禁止收听音频,可以过滤掉音频流接入流媒体服务器,只需要设置 disableAudio = 1即可过滤音频
                    detectSendAppStream       æ˜¯å¦æ£€æµ‹å‘送流ID  0 ä¸æ£€æµ‹ ï¼Œ1 æ£€æµ‹           ã€å¯é€‰å‚数】 é»˜è®¤ 1 åœ¨éœ€è¦å›žä¼ ç æµæ—¶ï¼Œäº‹å…ˆæ£€æµ‹ send_app、send_stream_id æ˜¯å¦å­˜åœ¨ã€‚0 ä¸æ£€æµ‹ï¼Œå…ˆæ‰“开接收成功后,稍后再把send_app、send_stream_id接入流媒体,openRtpServer函数自动回复给下级流媒体。
                 http  GET æ–¹å¼
                    http://190.15.240.11:7088/index/api/openRtpServer?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&vhost=_defaultVhost_&app=gb28181&stream_id=44030012343220234234&payload=96&port=0&enable_tcp=0&enable_mp4=0
                 http  POST æ–¹å¼
                    http URL
                      http://190.15.240.11:7088/index/api/openRtpServer
                    http å‚数值
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","vhost":"_defaultVhost_","app":"Media","stream_id":"Camera_00001","payload":96,"port":0,"enable_tcp":0,"enable_mp4":0}
                è¿”回Body:
                      {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "port": 8356,        # ç«¯å£å·
                        "memo": "success",   # success ä¸ºæˆåŠŸ
                        "key": 93            # æˆåŠŸæ—¶è¿”å›žå¤§äºŽ0的值,GB28181接收实例key ,关闭时需要
                      }
           2    åˆ é™¤ GB28181\Jtt1078接收端口
                 URL: /index/api/closeRtpServer
                 åŠŸèƒ½ï¼š
                      åˆ é™¤GB28181\Jtt1078接收端口
                 å‚数:              å‚数说明     å‚数参考值
                    secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    key              ä¸»é”®å€¼ID     æ¯”如  93 ï¼Œ  è°ƒç”¨ /index/api/openRtpServer è¿”回的 key çš„值
                http GET æ–¹å¼
                   http://190.15.240.11:7088/index/api/closeRtpServer?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93
                http  POST æ–¹å¼
                   http URL
                     http://190.15.240.11:7088/index/api/closeRtpServer
                   http Body å‚æ•° json æ ¼å¼
                     {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "success",   # success ä¸ºæˆåŠŸ ,如果失败是其他值
                    }
           3    æš‚停 GB28181\Jtt1078接收端口,只是不检测接收端口是否有码流进入。
                 URL: /index/api/pauseRtpServer
                 åŠŸèƒ½ï¼š
                      æš‚停GB28181\Jtt1078接收
                 å‚数:              å‚数说明     å‚数参考值
                    secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    key              ä¸»é”®å€¼ID     æ¯”如  93 ï¼Œ  è°ƒç”¨ /index/api/openRtpServer è¿”回的 key çš„值
                http GET æ–¹å¼
                   http://44.35.33.249:7088/index/api/pauseRtpServer?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=588
                http  POST æ–¹å¼
                   http URL
                     http://44.35.33.249:7088/index/api/pauseRtpServer
                   http Body å‚æ•° json æ ¼å¼
                     {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":588}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "success",   # success ä¸ºæˆåŠŸ ,如果失败是其他值
                    }
           4   ç»§ç»­ GB28181\Jtt1078接收端口,开启检测端口是否有码流到达,如果时长到达最大超时没有码流进入会立即删除接收端口
                 URL: /index/api/resumeRtpServer
                 åŠŸèƒ½ï¼š
                      ç»§ç»­GB28181\Jtt1078接收
                 å‚数:              å‚数说明     å‚数参考值
                    secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    key              ä¸»é”®å€¼ID     æ¯”如  93 ï¼Œ  è°ƒç”¨ /index/api/openRtpServer è¿”回的 key çš„值
                http GET æ–¹å¼
                   http://44.35.33.249:7088/index/api/resumeRtpServer?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=588
                http  POST æ–¹å¼
                   http URL
                     http://44.35.33.249:7088/index/api/resumeRtpServer
                   http Body å‚æ•° json æ ¼å¼
                     {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":588}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "success",   # success ä¸ºæˆåŠŸ ,如果失败是其他值
                    }
     10)、创建GB28181\Jtt1078 å‘送端口、删除GB28181\Jtt1078发送端口
         1     åˆ›å»ºGB28181\Jtt1078发送端口
                 URL: /index/api/startSendRtp
                 åŠŸèƒ½ï¼š
                      åˆ›å»ºGB28181\Jtt1078发送端口,如果该发送端端口没有数据发送,会自动回收,不用调用  /index/api/stopSendRtp
                 å‚数:                 å‚数说明              å‚数参考值
                    secret              æœåŠ¡å™¨å¯†ç             æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    vhost                                     æ¯”如 _defaultVhost_
                    app                 åº”用名                æ¯”如 gb28181 ã€rtp ç­‰ç­‰  (发送出去)
                    stream              åª’体流名              æ¯”如 44030012343220234234 ï¼ˆå‘送出去)
                    payload             PS负载值              å›½æ ‡SDP里面PS负载值 ,比如 96,98 ,108 ,rtp打包时需要
                    ssrc                åŒæ­¥æº                ssrc
                    src_port            å‘送端绑定的端口号    æŒ‡å®šæœåŠ¡å™¨åœ¨å‘é€å›½æ ‡æµæ—¶ç»‘å®šçš„ç«¯å£å·ï¼Œå¦‚æžœä¸º 0 ï¼Œç”±æœåŠ¡å™¨è‡ªåŠ¨åˆ†é…ï¼Œåˆ«çš„å€¼ æ¯”如 26324 ä¸ºæŒ‡å®šç«¯å£
                    dst_url             ç›®æ ‡IP                ç›®æ ‡IP地址
                    dst_port            ç›®æ ‡ç«¯å£              ç›®æ ‡ç«¯å£
                    is_udp              æ˜¯å¦è®¾ç½®udp           0 TCP主动方式,1 udp æ–¹å¼ ï¼Œ2 ä¸º TCP è¢«åŠ¨æ–¹å¼
                    RtpPayloadDataType  rtp打包数据格式      ã€å¯é€‰å‚æ•° ï¼Œé»˜è®¤ 1 ã€‘ [ 1 PS å›½æ ‡gb28181 ]、[ 2 ES è§†é¢‘支持 H246\H265,音频只支持G711A、G711U ]、[3 XHB (一家公司的打包格式) åªæ”¯æŒè§†é¢‘,音频不能加入打包 ] [ 4 ã€Jt1078(2016版本)码流发送 ]
                    disableVideo        æ˜¯å¦è¿‡æ»¤æŽ‰è§†é¢‘        0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤è§†é¢‘       ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤è§†é¢‘,国家电网协议中需要摄像头和摄像头直接需要对接,摄像头推上来的媒体流中过滤掉视频(disableVideo=1)再发给对方才能完成对讲
                    disableAudio        æ˜¯å¦è¿‡æ»¤æŽ‰éŸ³é¢‘        0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤éŸ³é¢‘       ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤éŸ³é¢‘,有时候不需要音频、或者由于敏感原因禁止收听音频,可以过滤掉音频流接入流媒体服务器,只需要设置 disableAudio = 1即可过滤音频
                    jtt1078_version     æŒ‡å®š1078版本号        2013、2016、2019            ã€å¯é€‰å‚数】 2013 æŒ‡å®šä¸º 2013版本 ã€2016 æŒ‡å®šä¸º 2016版本、 2019 æŒ‡å®šä¸º 2019 ç‰ˆæœ¬
                    recv_app            åº”用名               æ¯”如 gb28181 ã€rtp ç­‰ç­‰      ã€å¯é€‰å‚数】 æŽ¥å…¥è¿›æ¥ é€šè¿‡åœ¨å‘送的连接中接收进来的码流
                    recv_stream         åª’体流名             æ¯”如 44030012343220234234    ã€å¯é€‰å‚数】 æŽ¥å…¥è¿›æ¥ é€šè¿‡åœ¨å‘送的连接中接收进来的码流
                    recv_disableVideo   æ˜¯å¦è¿‡æ»¤æŽ‰è§†é¢‘       0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤è§†é¢‘        ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤è§†é¢‘,国家电网协议中需要摄像头和摄像头直接需要对接,摄像头推上来的媒体流中过滤掉视频(disableVideo=1)再发给对方才能完成对讲
                    recv_disableAudio   æ˜¯å¦è¿‡æ»¤æŽ‰éŸ³é¢‘       0 ä¸è¿‡æ»¤ ï¼Œ1 è¿‡æ»¤éŸ³é¢‘        ã€å¯é€‰å‚数】 é»˜è®¤ 0 ä¸è¿‡æ»¤éŸ³é¢‘,有时候不需要音频、或者由于敏感原因禁止收听音频,可以过滤掉音频流接入流媒体服务器,只需要设置 disableAudio = 1即可过滤音频
                 http  GET æ–¹å¼
                    http://190.15.240.11:7088/index/api/startSendRtp?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&vhost=_defaultVhost_&app=gb28181&stream=44030012343220234234&payload=96&ssrc=5224&src_port=26324&dst_url=190.15.240.11&dst_port=9824&is_udp=1
                 http  POST æ–¹å¼
                    http URL
                      http://190.15.240.11:7088/index/api/startSendRtp
                    http å‚数值
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","vhost":"_defaultVhost_","app":"Media","stream":"Camera_00001","payload":96,"ssrc":2432,"src_port":26324,"dst_url":"190.15.240.11","dst_port":9824,"is_udp":1}
                è¿”回Body:
                      {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "port": 8356,        # ç«¯å£å·
                        "memo": "success",   # success ä¸ºæˆåŠŸ
                        "key": 93            # æˆåŠŸæ—¶è¿”å›žå¤§äºŽ0的值,GB28181发送码流实例key ,关闭时需要
                      }
           2    åˆ é™¤ GB28181\Jtt1078发送端口
                 URL: /index/api/stopSendRtp
                 åŠŸèƒ½ï¼š
                      åˆ é™¤GB28181\Jtt1078发送端口
                 å‚数:              å‚数说明     å‚数参考值
                    secret           æœåŠ¡å™¨å¯†ç    æ¯”如  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    key              ä¸»é”®å€¼ID     æ¯”如  93 ï¼Œ  è°ƒç”¨ /index/api/startSendRtp è¿”回的 key çš„值
                http GET æ–¹å¼
                   http://190.15.240.11:7088/index/api/stopSendRtp?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93
                http  POST æ–¹å¼
                   http URL
                     http://190.15.240.11:7088/index/api/stopSendRtp
                   http Body å‚æ•° json æ ¼å¼
                     {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "success",   # success ä¸ºæˆåŠŸ ,如果失败是其他值
                    }
    11)、获取流媒体服务器所有可用的媒体源
             URL: /index/api/getMediaList
             åŠŸèƒ½ï¼š
                 èŽ·å–æµåª’ä½“æœåŠ¡å™¨æ‰€æœ‰åª’ä½“æº
             å‚数:              å‚数说明     å‚数参考值
                secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc        ã€å¿…填参数】
                app              åº”用名       æ¯”如 rtp、gb28181、Media ç­‰ç­‰ ï¼Œè‡ªå·±èµ·çš„名字     ã€å¯é€‰å‚数】
                stream           åª’体流名     æ¯”如 Camera_00001、44303403343034243200234 ç­‰ç­‰  ã€å¯é€‰å‚数】
                å‚数填写样例说明:
              æ ·ä¾‹1(app、stream éƒ½ä¸å¡«å†™ï¼‰
                   secret  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                  è¿”回所有在线的媒体源
              æ ·ä¾‹2 ï¼ˆåªå¡«å†™ app ï¼‰
                   secret  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                   app     rtp
                   è¿”回 app ç­‰äºŽ rtp çš„æ‰€æœ‰åª’体源
              æ ·ä¾‹3 ï¼ˆå¡«å†™ app = rtp , stream = 44303403343034243200234)
                   secret  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                   app     rtp
                   stream  44303403343034243200234
                  è¿”回 app ç­‰äºŽ rtp、并且 stream ç­‰äºŽ 44303403343034243200234 çš„æ‰€æœ‰åª’体源
              æ ·ä¾‹4 ï¼ˆå¡«å†™ stream = 44303403343034243200234)
                   secret  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    stream  44303403343034243200234
                   è¿”回 stream ç­‰äºŽ 44303403343034243200234 çš„æ‰€æœ‰åª’体源
             http  GET æ–¹å¼
               http://127.0.0.1:7088/index/api/getMediaList?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
            http  POST æ–¹å¼
               http URL
                 http://190.15.240.11:7088/index/api/getMediaList
               http Body å‚æ•° json æ ¼å¼
                 {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc"}
             è¿”回Body:
                {
                    "code": 0,
                    "memo": "success",
                    "mediaList": [
                        {
                            "key": 34,
                            "app": "Media",
                            "stream": "Camera_00001",
                            "sim": "123456789123",      ã€1078码流接入这个字段的值不会为空,代表设备的sim卡编码 ã€‘
                            "status": false ,           ã€ false å°šæœªå½•像,true æ­£åœ¨å½•像    ã€‘
                             "enable_hls": false,        ã€ false å°šæœªå¯ç”¨ï¼Œtrue å¯ç”¨hls回放 ã€‘
                            "transcodingStatus": false, ã€ false å°šæœªè½¬ç ï¼Œtrue æ­£åœ¨è½¬ç     ã€‘
                            "sourceURL": "rtsp://10.0.0.239:554/Media/Camera_00001",
                            "sourceType": 23,
                            "readerCount": 0,
                            "videoCodec": "H264",
                            "width": 1920,
                            "height": 1080,
                            "networkType": 24,
                            "audioCodec": "AAC",
                            "audioChannels": 1,
                            "audioSampleRate": 16000,
                            "url": {
                                "rtsp": "rtsp://10.0.0.239:554/Media/Camera_00001",
                                "rtmp": "rtmp://10.0.0.239:1935/Media/Camera_00001",
                                "http-flv": "http://10.0.0.239:8088/Media/Camera_00001.flv",
                                "ws-flv": "ws://10.0.0.239:6088/Media/Camera_00001.flv",
                                "http-mp4": "http://10.0.0.239:5088/Media/Camera_00001.mp4",
                                "http-hls": "http://10.0.0.239:9088/Media/Camera_00001.m3u8",
                                "webrtc":"http://10.0.0.239:8892/webrtc-streamer.html?video=/Media/Camera_00001"
                            }
                        }
                    ]
                }
              ã€æ³¨é‡Šï¼šå¯ä»¥æ ¹æ® "networkType": 24, è¿™ä¸ªå­—段值区分 åª’体接入的类型 ï¼Œå…·ä½“详见网络类型的对照表 ã€‘
   12)   åˆ é™¤ æŸä¸€ä¸ªåª’体源
         URL: /index/api/delMediaStream
         åŠŸèƒ½ï¼š
              æŸä¸€ä¸ªåª’体源,这媒体源,可以是rtp推流、rtmp推流,各种方式代理拉流接入的,国标接入 ç­‰ç­‰ã€‚
         å‚数:              å‚数说明     å‚数参考值
            secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
            key              ä¸»é”®å€¼ID     æ¯”如  93 ï¼Œ  è°ƒç”¨ /index/api/getMediaList è¿”回的 key çš„值
        http GET æ–¹å¼
           http://190.15.240.11:7088/index/api/delMediaStream?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93
        http  POST æ–¹å¼
           http URL
             http://190.15.240.11:7088/index/api/delMediaStream
           http Body å‚æ•° json æ ¼å¼
             {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93}
        è¿”回Body:
            {
                "code": 0,           # 0为操作成功,其他值为操作失败
                "memo": "success",   # success ä¸ºæˆåŠŸ ,如果失败是其他值
            }
    13)、获取流媒体服务器所有往外部输出码流列表,包括外部请求的rtsp、rtmp、http-flv、ws-flv、hls åˆ—表
                                          ä¹ŸåŒ…括服务器代理rtsp推流、rtmp推流列表
                                          ä¹ŸåŒ…括服务器以国标方式往上级推rtp流列表
                        ã€å¿…要时可以调用 /index/api/delOutList æŽ¥å£åˆ é™¤æŸä¸€ä¸ªåˆ—表对象,比如删除某一路国标推流、删除某一路rtsp推流、 åˆ é™¤æŸä¸€è·¯rtmp推流】
             URL: /index/api/getOutList
             åŠŸèƒ½ï¼š
                 èŽ·å–æµåª’ä½“æœåŠ¡å™¨æ‰€æœ‰è¾“å‡ºæµåˆ—è¡¨
             å‚数:              å‚数说明     å‚数参考值
                secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
             http  GET æ–¹å¼
               http://44.35.33.239:7088/index/api/getOutList?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
            http  POST æ–¹å¼
               http URL
                 http://44.35.33.239:7088/index/api/getOutList
               http Body å‚æ•° json æ ¼å¼
                 {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc"}
             è¿”回Body:
                    {
                        "code": 0,
                        "memo": "success",
                        "outList": [
                            {
                                "key": 103,                ã€è¯·æ±‚客户端的标识ID ï¼Œå¯ä»¥è°ƒç”¨  /index/api/delOutList åˆ é™¤ è¯¥è¯·æ±‚】
                                "app": "Media",
                                "stream": "Camera_00001",
                                "sourceURL": "rtsp://44.35.33.239:554/Media/Camera_00001",  ã€è¡¨ç¤ºå¤–界以rtsp方式向服务器请求码流】
                                "videoCodec": "H264",
                                "audioCodec": "AAC",
                                "audioChannels": 1,
                                "audioSampleRate": 16000,
                                "networkType": 24,         ã€ç½‘络类型为24 ï¼Œæ ‡è¯†ä¸ºrtsp æ–¹å¼ã€‘
                                "dst_url": "44.35.33.39",  ã€ è¯·æ±‚码流客户端IP   ã€‘
                                "dst_port": 43801          ã€ è¯·æ±‚码流客户端端口 ã€‘
                            },
                            {
                                "key": 85,                 ã€è¯·æ±‚客户端的标识ID ï¼Œå¯ä»¥è°ƒç”¨  /index/api/delOutList åˆ é™¤ è¯¥è¯·æ±‚】
                                "app": "Media",
                                "stream": "Camera_00001",
                                "sourceURL": "http://localhost:8088/Media/Camera_00001.flv",【表示外界以 http-flv æ–¹å¼å‘服务器请求码流】
                                "videoCodec": "H264",
                                "audioCodec": "AAC",
                                "audioChannels": 1,
                                "audioSampleRate": 16000,
                                "networkType": 25,         ã€ç½‘络类型为25 ï¼Œæ ‡è¯†ä¸º http-flv æ–¹å¼ã€‘
                                "dst_url": "44.35.33.39",  ã€ è¯·æ±‚码流客户端IP   ã€‘
                                "dst_port": 43806          ã€ è¯·æ±‚码流客户端端口 ã€‘
                            }
                        ]
                    }
                  ã€æ³¨é‡Šï¼šå¯ä»¥æ ¹æ® "networkType": 24, è¿™ä¸ªå­—段值区分 åª’体输出的类型 ï¼Œå…·ä½“详见网络类型的对照表 ã€‘
   14)   åˆ é™¤ æŸä¸€ä¸ªæœåŠ¡å™¨æ‰€æœ‰å¾€å¤–éƒ¨è¾“å‡ºç æµåˆ—è¡¨
         URL: /index/api/delOutList
         åŠŸèƒ½ï¼š
              åˆ é™¤æŸä¸€ä¸ªæµåª’体服务器所有往外部输出码流列表,包括外部请求的rtsp、rtmp、http-flv、ws-flv、hls ç‚¹æ’­ ã€‚国标推流、rtsp推流、rtmp æŽ¨æµ ç­‰ç­‰
         å‚数:              å‚数说明     å‚数参考值
            secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
            key              ä¸»é”®å€¼ID     æ¯”如  93 ï¼Œ  è°ƒç”¨ /index/api/getOutList è¿”回的 key çš„值
        http GET æ–¹å¼
           http://190.15.240.11:7088/index/api/delOutList?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=93
        http  POST æ–¹å¼
           http URL
             http://190.15.240.11:7088/index/api/delOutList
           http Body å‚æ•° json æ ¼å¼
             {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","key":93}
        è¿”回Body:
            {
                "code": 0,           # 0为操作成功,其他值为操作失败
                "memo": "success",   # success ä¸ºæˆåŠŸ ,如果失败是其他值
            }
   15)根据条件组合,删除任意一个或一组或者全部媒体输入列表
       URL: /index/api/close_streams
       åŠŸèƒ½
          åˆ é™¤ä»»æ„ä¸€ä¸ªæˆ–一组或者全部媒体输入列表
            secret           æœåŠ¡å™¨å¯†ç             æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc                           ã€å¿…填参数】
            vhost                                  æ¯”如 _defaultVhost_                                                 ã€å¯é€‰å‚数】
            app              åº”用名                æ¯”如 gb28181 ã€rtp ç­‰ç­‰                                             ã€å¯é€‰å‚数】
            stream           åª’体流名              æ¯”如 Camera_00001、dsafdsafassdafadsfas、等等                       ã€å¯é€‰å‚数】
            force            æ˜¯å¦å¼ºåˆ¶å…³é—­          1 å¼ºåˆ¶å…³é—­ï¼Œä¸ç®¡æ˜¯å¦æœ‰äººåœ¨è§‚看、0 éžå¼ºåˆ¶å…³é—­ï¼Œå½“有人观看时不关闭。  ã€å¿…填参数】
         http GET æ–¹å¼
            ç¤ºä¾‹1: http://190.168.24.112:7088/index/api/close_streams?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&app=live&force=1
                    ã€è¡¨ç¤ºå¼ºè¡Œå…³é—­ app ç­‰äºŽ live çš„码流接入】
            ç¤ºä¾‹2: http://190.168.24.112:7088/index/api/close_streams?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&app=live&stream=Camera_00001&force=1
                    ã€è¡¨ç¤ºå¼ºè¡Œå…³é—­ app ç­‰äºŽ live, å¹¶ä¸” stream ç­‰äºŽ Camera_00001  çš„码流接入 ã€‘
            ç¤ºä¾‹3: http://190.168.24.112:7088/index/api/close_streams?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&force=1
                    ã€è¡¨ç¤ºå¼ºè¡Œå…³é—­ æ‰€æœ‰ç æµï¼ˆapp全部、stream全部) æŽ¥å…¥ ã€‘
          http pos æ–¹å¼
            ç¤ºä¾‹1: http URL:
                      http://190.168.24.112:7088/index/api/close_streams
                    body:
                      {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","app":"live","force":1}
                     ã€è¡¨ç¤ºå¼ºè¡Œå…³é—­ app ç­‰äºŽ live çš„码流接入】
            ç¤ºä¾‹2: http URL:
                      http://190.168.24.112:7088/index/api/close_streams
                    body:
                      {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","app":"live","stream":"Camera_00001","force":1}
                   ã€è¡¨ç¤ºå¼ºè¡Œå…³é—­ app ç­‰äºŽ live, å¹¶ä¸” stream ç­‰äºŽ Camera_00001  çš„码流接入 ã€‘
            ç¤ºä¾‹3: http URL:
                      http://190.168.24.112:7088/index/api/close_streams
                    body:
                      {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","force":1}
                   ã€ è¡¨ç¤ºå¼ºè¡Œå…³é—­ æ‰€æœ‰ç æµï¼ˆapp全部、stream全部) æŽ¥å…¥ ã€‘
     16)、 å¼€å§‹å½•像、停止录像
         1) ç”³è¯·å¼€å§‹å½•像
                 URL: /index/api/startRecord
                 å‚数:     å‚数说明          å‚考值
                    secret  æœåŠ¡å™¨å¯†ç  ï¼Œæ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    vhost                æ¯”如 _defaultVhost_
                    app     åº”用名       æ¯”如 Media
                    stream  åª’体流名     æ¯”如 Camera_00001
               http  GET æ–¹å¼
                     http://190.15.240.11:7088/index/api/startRecord?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&vhost=_defaultVhost_&app=Media&stream=Camera_00001
               http  POST æ–¹å¼
                    http URL
                      http://190.15.240.11:7088/index/api/startRecord
                    http Body å‚æ•° (json格式)
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","vhost":"_defaultVhost_","app":"Media","stream":"Camera_00001"}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "MediaSource: /Media/Camera_00001 start Record",   #  "code": 0 ä¸ºæˆåŠŸ
                    }
         2) ç”³è¯·åœæ­¢å½•像
                  URL: /index/api/stopRecord
                 å‚数:     å‚数说明          å‚考值
                    secret  æœåŠ¡å™¨å¯†ç  ï¼Œæ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    vhost                æ¯”如 _defaultVhost_
                    app     åº”用名       æ¯”如 Media
                    stream  åª’体流名     æ¯”如 Camera_00001
               http  GET æ–¹å¼
                     http://190.15.240.11:7088/index/api/stopRecord?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&vhost=_defaultVhost_&app=Media&stream=Camera_00001
               http  POST æ–¹å¼
                    http URL
                      http://190.15.240.11:7088/index/api/stopRecord
                    http Body å‚æ•° (json格式)
                       {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","vhost":"_defaultVhost_","app":"Media","stream":"Camera_00001"}
                è¿”回Body:
                    {
                        "code": 0,           # 0为操作成功,其他值为操作失败
                        "memo": "success",   # success ä¸ºæˆåŠŸ
                    }
   17  èŽ·å–ç³»ç»Ÿé…ç½®å‚æ•°
         URL: /index/api/getServerConfig
         åŠŸèƒ½ï¼š
              èŽ·å–æœåŠ¡å™¨çš„é…ç½®å‚æ•°
         å‚数:              å‚数说明     å‚数参考值
            secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc
        http GET æ–¹å¼
           http://190.15.240.11:7088/index/api/getServerConfig?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
        http  POST æ–¹å¼
           http URL
             http://190.15.240.11:7088/index/api/getServerConfig
           http Body å‚æ•° json æ ¼å¼
             {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc"}
        è¿”回Body:
            {
                "code": 0,
                "params": [
                    {
                        "secret": "035c73f7-bb6b-4889-a715-d9eb2d1925cc",
                        "memo": "server password",
                    },
                    {
                        "ServerIP": "44.35.33.239",
                        "memo": "ABLMediaServer ip address"
                    },
                    {
                        "rtc.listening-ip": "192.168.2.5",
                        "memo": "Total number of video playback threads ."
                    },
                    {
                        "mediaServerID": "ABLMediaServer_00001",
                        "memo": "media Server ID "
                    },
                    {
                        "hook_enable": 0,
                        "memo": "hook_enable = 1 open notice , hook_enable = 0 close notice "
                    },
                    {
                        "enable_audio": 1,
                        "memo": "enable_audio = 1 open Audio , enable_audio = 0 Close Audio "
                    },
                    {
                        "httpServerPort": 7088,
                        "memo": "http api port "
                    },
                    {
                        "rtspPort": 554,
                        "memo": "rtsp port "
                    },
                    {
                        "rtmpPort": 1935,
                        "memo": "rtmp port "
                    },
                    {
                        "httpFlvPort": 8088,
                        "memo": "http-flv port "
                    },
                    {
                        "hls_enable": 0,
                        "memo": "hls whether enable "
                    },
                    {
                        "hlsPort": 9088,
                        "memo": "hls port"
                    },
                    {
                        "wsPort": 6088,
                        "memo": "websocket flv port"
                    },
                    {
                        "mp4Port": 5088,
                        "memo": "http mp4 port"
                    },
                    {
                        "ps_tsRecvPort": 10000,
                        "memo": "recv ts , ps Stream port "
                    },
                    {
                        "hlsCutType": 2,
                        "memo": "hlsCutType = 1 hls cut to Harddisk,hlsCutType = 2  hls cut Media to memory"
                    },
                    {
                        "h265CutType": 1,
                        "memo": " 1 h265 cut TS , 2 cut fmp4 "
                    },
                    {
                        "RecvThreadCount": 128,
                        "memo": " RecvThreadCount "
                    },
                    {
                        "SendThreadCount": 128,
                        "memo": "SendThreadCount"
                    },
                    {
                        "GB28181RtpTCPHeadType": 2,
                        "memo": "rtp Length Type"
                    },
                    {
                        "ReConnectingCount": 40320,
                        "memo": "Try reconnections times ."
                    },
                    {
                        "maxTimeNoOneWatch": 9999999,
                        "memo": "maxTimeNoOneWatch ."
                    },
                    {
                        "pushEnable_mp4": 0,
                        "memo": "pushEnable_mp4 ."
                    },
                    {
                        "fileSecond": 180,
                        "memo": "fileSecond ."
                    },
                    {
                        "fileKeepMaxTime": 1,
                        "memo": "fileKeepMaxTime ."
                    },
                    {
                        "httpDownloadSpeed": 6,
                        "memo": "httpDownloadSpeed ."
                    },
                    {
                        "RecordReplayThread": 32,
                        "memo": "Total number of video playback threads ."
                    }
                ]
            }
        18)、查询录像列表
             URL: /index/api/queryRecordList
             åŠŸèƒ½ï¼š
                 æŸ¥è¯¢æŸä¸€è·¯è¾“入源的录像列表(可以查询代理拉流输入、推流输入、国标输入等等 )
             å‚数:              å‚数说明     å‚数参考值
                secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc        ã€å¿…填参数】
                vhost                         æ¯”如 _defaultVhost_                              ã€å¯é€‰å‚数】
                app              åº”用名       æ¯”如 rtp、gb28181、Media ç­‰ç­‰ ï¼Œè‡ªå·±èµ·çš„名字     ã€å¿…填参数】
                stream           åª’体流名     æ¯”如 Camera_00001、44303403343034243200234 ç­‰ç­‰  ã€å¿…填参数】
                starttime        å¼€å§‹æ—¶é—´     æ¯”如 20220116154810 å¹´æœˆæ—¥æ—¶åˆ†ç§’                 ã€å¿…填参数】
                endtime          ç»“束时间     æ¯”如 20220116155115 å¹´æœˆæ—¥æ—¶åˆ†ç§’                 ã€å¿…填参数】
            ã€æ³¨æ„ï¼š1、开始时间必须小于 å½“前时间减去切片时长的时间 2、从 å¼€å§‹æ—¶é—´ è‡³ ç»“束时间 ä¸èƒ½è¶…过3天】
             http  GET æ–¹å¼
               http://10.0.0.239:7088/index/api/queryRecordList?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&app=Media&stream=Camera_00001&starttime=20220116154810&endtime=20220116155115
            http  POST æ–¹å¼
               http URL
                 http://190.15.240.11:7088/index/api/queryRecordList
               http Body å‚æ•° json æ ¼å¼
                 {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","vhost":"_defaultVhost_","app":"Media","stream":"Camera_00001","starttime":"20220116154810","endtime":"20220116155115"}
             è¿”回Body:
                {
                    "code": 0,
                    "app": "Media",
                    "stream": "Camera_00001",
                    "starttime": "20220116154810",
                    "endtime": "20220116155115",
                    "recordFileList": [
                        {
                            "file": "20220116154810.mp4",
                            "duration": 300,   å½“前录像时间长度,单位 ç§’
                            "url": {
                                "rtsp": "rtsp://10.0.0.239:554/Media/Camera_00001__ReplayFMP4RecordFile__20220116154810",
                                "rtmp": "rtmp://10.0.0.239:1935/Media/Camera_00001__ReplayFMP4RecordFile__20220116154810",
                                "http-flv": "http://10.0.0.239:8088/Media/Camera_00001__ReplayFMP4RecordFile__20220116154810.flv",
                                "ws-flv": "ws://10.0.0.239:6088/Media/Camera_00001__ReplayFMP4RecordFile__20220116154810.flv",
                                "http-mp4": "http://10.0.0.239:5088/Media/Camera_00001__ReplayFMP4RecordFile__20220116154810.mp4?download_speed=1",
                                "download": "http://10.0.0.239:5088/Media/Camera_00001__ReplayFMP4RecordFile__20220116154810.mp4?download_speed=6"
                            }
                        },
                        {
                            "file": "20220116155110.mp4",
                            "duration": 256,    å½“前录像时间长度,单位 ç§’
                            "url": {
                                "rtsp": "rtsp://10.0.0.239:554/Media/Camera_00001__ReplayFMP4RecordFile__20220116155110",
                                "rtmp": "rtmp://10.0.0.239:1935/Media/Camera_00001__ReplayFMP4RecordFile__20220116155110",
                                "http-flv": "http://10.0.0.239:8088/Media/Camera_00001__ReplayFMP4RecordFile__20220116155110.flv",
                                "ws-flv": "ws://10.0.0.239:6088/Media/Camera_00001__ReplayFMP4RecordFile__20220116155110.flv",
                                "http-mp4": "http://10.0.0.239:5088/Media/Camera_00001__ReplayFMP4RecordFile__20220116155110.mp4?download_speed=1",
                                "download": "http://10.0.0.239:5088/Media/Camera_00001__ReplayFMP4RecordFile__20220116155110.mp4?download_speed=6"
                            }
                        }
                    ]
                }
      19)、消息通知使用
            åŠŸèƒ½è¯´æ˜Žï¼šæ¶ˆæ¯é€šçŸ¥æ˜¯æµåª’ä½“æœåŠ¡å™¨çš„ä¸€äº›æ¶ˆæ¯æ¯”å¦‚æ— äººè§‚çœ‹ã€fmp4录像切片完成、播放时流地址不存在等等信息能及时的通知到另外一个http服务器上,需要此功能
                      æ¶ˆæ¯é€šçŸ¥åŠŸèƒ½ç”¨åœ¨ä»€ä¹ˆåœ°æ–¹ï¼Œæ¯”å¦‚è¯´æ— äººè§‚çœ‹æ¶ˆæ¯é€šçŸ¥ï¼Œå½“æ”¶åˆ°æ— äººè§‚çœ‹æ¶ˆæ¯æ—¶ï¼Œå›½æ ‡æœåŠ¡å™¨å¯ä»¥å…³é—­å›½æ ‡å‘æµï¼Œæ–­å¼€ä»£ç†æ‹‰æµï¼Œæ–­å¼€æŽ¨æµç­‰ç­‰æ“ä½œ
                      è¦ä½¿ç”¨æ­¤åŠŸèƒ½æŠŠé…ç½®æ–‡ä»¶çš„å‚æ•°hook_enable å€¼è®¾ç½®ä¸º 1,同时通知的http服务器地址、端口号一定要设置对,下面列举出配置文件中的相关参数
                hook_enable=1                                                                  #事件通知部分,当 hook_enable=1 æ—¶ï¼Œå¼€å¯äº‹ä»¶é€šçŸ¥ï¼Œhook_enable=0时关闭事件通知
                on_stream_arrive=http://10.0.0.238:7088/index/hook/on_stream_arrive            #当某一路的码流达到时会通知一次
                  on_stream_none_reader=http://10.0.0.238:8080/index/hook/on_stream_none_reader  #当某一路流无人观看时,会触发该通知事件,接收端收到后可以进行断流操作
                on_stream_disconnect=http://10.0.0.238:7088/index/hook/on_stream_disconnect    #当某一路码流断开时会通知一次
                on_stream_not_found=http://10.0.0.238:8080/index/hook/on_stream_not_found      #播放时,找不到播放的码流,通过配合on_stream_none_reader事件可以完成按需拉流
                 on_record_mp4=http://10.0.0.238:8080/index/hook/on_record_mp4                  #录制完毕一段mp4文件通知
                ã€æ³¨ï¼šhttp url的 IP,端口 æ˜¯ä»£è¡¨æ¶ˆæ¯æŽ¥æ”¶æœåŠ¡å™¨çš„IP,端口,一定要填写正确,url åœ°å€è¦åˆæ³•,不要有空格 ã€‘
                1、当某一路码流到达时会发送通知:
                    POST /index/hook/on_stream_arrive HTTP/1.1  # æ ¹æ® /index/hook/on_stream_arrive è¿™ä¸ªå¯ä»¥åˆ¤æ–­æ˜¯æŸä¸€è·¯ç æµåˆ°è¾¾
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 105
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-5.2.9(2022-03-28)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                  {
                   "app":"Media",                            # app
                   "stream":"Camera_00001",                  # stream
                   "mediaServerId":"ABLMediaServer_00001",   # æµåª’体服务器编号 ï¼Œåœ¨é…ç½®æ–‡ä»¶å¯ä»¥é…ç½®ï¼Œå¦‚果集群流媒体服务器时,可以给每台流媒体服务器起个编号
                   "networkType":23,                         # åª’体流来源网络编号,可参考附表
                   "key":130,                                # åª’体流来源编号,可以根据这个key进行关闭流媒体 å¯ä»¥è°ƒç”¨delMediaStream或close_streams å‡½æ•°è¿›è¡Œå…³é—­
                   "status":true,
                   "enable_hls":false,
                   "transcodingStatus":false,
                   "sourceURL":"rtsp://admin:abldyjh2020@44.35.33.248:554",
                   "readerCount":0,
                   "noneReaderDuration":0,
                   "videoCodec":"H265",
                   "videoFrameSpeed":25,
                   "width":1920,
                   "height":1080,
                   "videoBitrate":0,
                   "audioCodec":"AAC",
                   "audioChannels":1,
                   "audioSampleRate":8000,
                   "audioBitrate":0,
                   "url":
                      {
                       "rtsp":"rtsp://44.35.33.249:554/Media/Camera_00001",
                       "rtmp":"rtmp://44.35.33.249:1935/Media/Camera_00001",
                       "http-flv":"http://44.35.33.249:8088/Media/Camera_00001.flv",
                       "ws-flv":"ws://44.35.33.249:6088/Media/Camera_00001.flv",
                       "http-mp4":"http://44.35.33.249:5088/Media/Camera_00001.mp4",
                       "http-hls":"http://44.35.33.249:9088/Media/Camera_00001.m3u8"
                      }
                  }
                2、无人观看消息通知样例:
                    POST /index/hook/on_stream_none_reader HTTP/1.1  # æ ¹æ® /index/hook/on_stream_none_reader è¿™ä¸ªå¯ä»¥åˆ¤æ–­æ˜¯æ— äººè§‚看消息通知
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 105
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-5.2.9(2022-03-28)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                  {
                   "app":"Media",                            # app
                   "stream":"Camera_00001",                  # stream
                   "mediaServerId":"ABLMediaServer_00001",   # æµåª’体服务器编号 ï¼Œåœ¨é…ç½®æ–‡ä»¶å¯ä»¥é…ç½®ï¼Œå¦‚果集群流媒体服务器时,可以给每台流媒体服务器起个编号
                   "networkType":23,                         # åª’体流来源网络编号,可参考附表
                   "key":130                                 # åª’体流来源编号,可以根据这个key进行关闭流媒体 å¯ä»¥è°ƒç”¨delMediaStream或close_streams å‡½æ•°è¿›è¡Œå…³é—­
                  }
                 3、 fmp4录像切片录像完成一个文件时会发送一个消息通知
                    POST /index/hook/on_record_mp4 HTTP/1.1  # æ ¹æ® /index/hook/on_record_mp4 è¿™ä¸ªå¯ä»¥åˆ¤æ–­æ˜¯mp4录像切片完毕一个通知
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 127
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-5.2.9(2022-03-28)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                    {
                      "app":"Media",                          # app
                      "stream":"Camera_00001",                # stream
                      "mediaServerId":"ABLMediaServer_00001", # æµåª’体服务器编号 ï¼Œåœ¨é…ç½®æ–‡ä»¶å¯ä»¥é…ç½®ï¼Œå¦‚果集群流媒体服务器时,可以给每台流媒体服务器起个编号
                      "networkType":70,                       # åª’体流来源网络编号,可参考附表
                      "fileName":"20220312212546.mp4"         # å½•像切片完成的文件名字
                    }
                4、当某一路码流断开时会发送通知:
                    POST /index/hook/on_stream_disconnect HTTP/1.1  # æ ¹æ® /index/hook/on_stream_disconnect è¿™ä¸ªå¯ä»¥åˆ¤æ–­æ˜¯æŸä¸€è·¯ç æµæ–­å¼€
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 105
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-5.2.9(2022-03-28)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                  {
                   "app":"Media",                            # app
                   "stream":"Camera_00001",                  # stream
                   "mediaServerId":"ABLMediaServer_00001",   # æµåª’体服务器编号 ï¼Œåœ¨é…ç½®æ–‡ä»¶å¯ä»¥é…ç½®ï¼Œå¦‚果集群流媒体服务器时,可以给每台流媒体服务器起个编号
                   "networkType":23,                         # åª’体流来源网络编号,可参考附表
                   "key":130                                 # åª’体流来源编号,可以根据这个key进行关闭流媒体 å¯ä»¥è°ƒç”¨delMediaStream或close_streams å‡½æ•°è¿›è¡Œå…³é—­
                  }
                 5、 å½“播放一个url,如果不存在时,会发出一个消息通知
                    POST /index/hook/on_stream_not_found HTTP/1.1  # æ ¹æ® /index/hook/on_stream_not_found ï¼ŒHttp接收服务器得知流不不存在
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 127
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-5.2.9(2022-03-28)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                    {
                      "app":"Media",                          # app      ä¸å­˜åœ¨çš„app
                      "stream":"Camera_00001",                # stream   ä¸å­˜åœ¨çš„stream
                      "mediaServerId":"ABLMediaServer_00001"  # æµåª’体服务器编号 ï¼Œåœ¨é…ç½®æ–‡ä»¶å¯ä»¥é…ç½®ï¼Œå¦‚果集群流媒体服务器时,可以给每台流媒体服务器起个编号
                    }
                 6、ABLMediaServer启动时会发送上线通知
                    POST /index/hook/on_server_started HTTP/1.1
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 105
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-6.3.5(2023-04-30)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                    {"localipAddress":"44.35.33.249","mediaServerId":"ABLMediaServer_00001","datetime":"2023-04-18 10:04:37"}
                  7、某一个码流接入流媒体服务器时会产生 å‘布 äº‹ä»¶é€šçŸ¥
                    POST /index/hook/on_publish HTTP/1.1
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 149
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-6.3.5(2023-04-30)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                    {"app":"Media","stream":"Camera_00001","mediaServerId":"ABLMediaServer_00001","networkType":50,"key":470,"ip":"44.35.33.248" ,"port":554,"params":""}
                  8、当播放流媒体服务器里面某一个码流时,会触发 æ’­æ”¾äº‹ä»¶ ï¼Œå¯ä»¥é€šçŸ¥ parmas å‚数值进行播放鉴权
                    POST /index/hook/on_play HTTP/1.1
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 135
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-6.3.5(2023-04-30)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                    {"app":"Media","stream":"Camera_00001","mediaServerId":"ABLMediaServer_00001","networkType":30,"key":472,"ip":"" ,"port":0,"params":"user=admin&password=safsa234234&token=@#$@#$@#ASDFasfdsa@#$23"}
                 9、如果某一个码流进行MP4录像(enable_mp4=1),会触发录像进度通知事件
                    POST /index/hook/on_record_progress HTTP/1.1
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 204
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-6.3.5(2023-04-30)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                    {"app":"Media","stream":"Camera_00001","mediaServerId":"ABLMediaServer_00001","networkType":472,"key":470,"fileName":"20230418100440.mp4","currentFileDuration":49,"TotalVideoDuration":49}
                 10、如果某一个码流开启hls(enable_hls=1)并且设置为切片到硬盘(hlsCutType=1 åœ¨é…ç½®æ–‡ä»¶ä¸­ï¼‰ ï¼Œæ¯å½“切片完成一个ts文件会触发该事件
                    POST /index/hook/on_record_ts HTTP/1.1
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 246
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-6.3.5(2023-04-30)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                    {"app":"Media","stream":"Camera_00001","mediaServerId":"ABLMediaServer_00001","networkType":30,"key":470,"createDateTime":"2023-04-18 10:05:47","currentFileDuration":3,"fileName":"D:\WorkDir\ABLMediaServer\x64\Debug\www\Media\Camera_00001\23.ts"}
                 11、流媒体服务器每隔60秒会触发心跳事件通知
                    POST /index/hook/on_server_keepalive HTTP/1.1
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 105
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-6.3.5(2023-04-30)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                    {"localipAddress":"44.35.33.249","mediaServerId":"ABLMediaServer_00001","datetime":"2023-04-18 10:25:40"}
                  12、当代理拉流、国标接入等等 ç æµä¸åˆ°è¾¾æ—¶ä¼šå‘出 ç æµä¸åˆ°è¾¾çš„事件通知
                    POST /index/hook/on_stream_not_arrive HTTP/1.1
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 155
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-6.3.5(2023-04-30)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                    {"mediaServerId":"ABLMediaServer_00001","app":"gb28181","stream":"440300123432202342349","networkType":60,"key":470}
                  13、如果某一个码流进行MP4录像(enable_mp4=1),当某个MP4文件被删除会触发该事件通知
                    POST /index/hook/on_delete_record_mp4 HTTP/1.1
                    Accept: */*
                    Accept-Language: zh-CN,zh;q=0.8
                    Connection: keep-alive
                    Content-Length: 204
                    Content-Type: application/json
                    Host: 127.0.0.1
                    Tools: ABLMediaServer-6.3.5(2023-04-30)
                    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
                    {"app":"Media","stream":"Camera_00001","mediaServerId":"ABLMediaServer_00001","fileName":"20230418100440.mp4"}
      20) å›¾ç‰‡æŠ“拍
             URL: /index/api/getSnap
             åŠŸèƒ½ï¼š
                 æŸ¥è¯¢æŸä¸€æŽ¥å…¥çš„媒体源进行抓拍
             å‚数:              å‚数说明     å‚数参考值
                secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc        ã€å¿…填参数】
                vhost                         æ¯”如 _defaultVhost_                              ã€å¯é€‰å‚数】
                app              åº”用名       æ¯”如 rtp、gb28181、Media ç­‰ç­‰ ï¼Œè‡ªå·±èµ·çš„名字     ã€å¿…填参数】
                stream           åª’体流名     æ¯”如 Camera_00001、44303403343034243200234 ç­‰ç­‰  ã€å¿…填参数】
                 timeout_sec      è¶…æ—¶æ—¶é•¿     10  å³æœ¬æ¬¡æŠ“拍最大超时时长 å•位 ç§’               ã€å¿…填参数】
             http  GET æ–¹å¼
               http://127.0.0.1:7088/index/api/getSnap?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&vhost=_defaultVhost_&app=Media&stream=Camera_00001&timeout_sec=10
            http  POST æ–¹å¼
               http URL
                 http://190.15.240.11:7088/index/api/getSnap
                http Body å‚æ•° json æ ¼å¼
                 {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","vhost":"_defaultVhost_","app":"Media","stream":"Camera_00001","timeout_sec":10}
            æŠ“拍成功返回:
            {
                "code": 0,
                "memo": "success , Catpuring takes time 219 millisecond .",
                "url": "http://10.0.0.239:7088/Media/Camera_00001/2022031910034501.jpg"
            }
        21)图片列表查询
             URL: /index/api/queryPictureList
             åŠŸèƒ½ï¼š
                 æŸ¥è¯¢æŸä¸€è·¯è¾“入源的抓拍图片列表
             å‚数:              å‚数说明     å‚数参考值
                secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc        ã€å¿…填参数】
                vhost                         æ¯”如 _defaultVhost_                              ã€å¯é€‰å‚数】
                app              åº”用名       æ¯”如 rtp、gb28181、Media ç­‰ç­‰ ï¼Œè‡ªå·±èµ·çš„名字     ã€å¿…填参数】
                stream           åª’体流名     æ¯”如 Camera_00001、44303403343034243200234 ç­‰ç­‰  ã€å¿…填参数】
                starttime        å¼€å§‹æ—¶é—´     æ¯”如 20220317081201 å¹´æœˆæ—¥æ—¶åˆ†ç§’                 ã€å¿…填参数】
                endtime          ç»“束时间     æ¯”如 20220319231201 å¹´æœˆæ—¥æ—¶åˆ†ç§’                 ã€å¿…填参数】
            ã€æ³¨æ„ï¼š1、开始时间必须小于 å½“前时间减去切片时长的时间 2、从 å¼€å§‹æ—¶é—´ è‡³ ç»“束时间 ä¸èƒ½è¶…过7天】
             http  GET æ–¹å¼
               http://10.0.0.239:7088/index/api/queryPictureList?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&app=Media&stream=Camera_00001&starttime=20220317081201&endtime=20220319231201
            http  POST æ–¹å¼
               http URL
                 http://190.15.240.11:7088/index/api/queryPictureList
               http Body å‚æ•° json æ ¼å¼
                 {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","vhost":"_defaultVhost_","app":"Media","stream":"Camera_00001","starttime":"20220317081201","endtime":"20220319231201"}
              æˆåŠŸè¿”å›žBody值
                {
                "code": 0,
                "app": "Media",
                "stream": "Camera_00001",
                "starttime": "20220317081201",
                "endtime": "20220319231201",
                "PictureFileList": [
                    {
                        "file": "2022031816153857.jpg",
                        "url": "http://10.0.0.239:7088/Media/Camera_00001/2022031816153857.jpg"
                    },
                    {
                        "file": "2022031816153958.jpg",
                        "url": "http://10.0.0.239:7088/Media/Camera_00001/2022031816153958.jpg"
                    },
                    {
                        "file": "2022031816154059.jpg",
                        "url": "http://10.0.0.239:7088/Media/Camera_00001/2022031816154059.jpg"
                    },
                 ]
              }
     22、修改某一路的水印相关参数
            URL: index/api/setTransFilter
         åŠŸèƒ½ï¼š
             ä¿®æ”¹æŸä¸€è·¯çš„æ°´å°ç›¸å…³å‚数,比水印的内容、颜色、字体大小、字体位置、字体透明度
         å‚数:              å‚数说明     å‚数参考值
            secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc        ã€å¿…填参数】
            vhost                         æ¯”如 _defaultVhost_                              ã€å¯é€‰å‚数】
            app              åº”用名       æ¯”如 rtp、gb28181、Media ç­‰ç­‰ ï¼Œè‡ªå·±èµ·çš„名字     ã€å¿…填参数】
            stream           åª’体流名     æ¯”如 Camera_00001、44303403343034243200234 ç­‰ç­‰  ã€å¿…填参数】
            text             æ°´å°å†…容     æ¯”如 æŸæŸå¸‚某某公安局                  ã€å¿…填参数】
            size             å­—体大小     20、30 ã€40 ã€50                       ã€å¿…填参数】
            color            å­—体颜色     red,green,blue,white,black,
            alpha            é€æ˜Žåº¦       0.1 ~  0.9 ,
            left             æ°´å°x坐标    æ¯”如 5 ã€ 10 ã€20
            top              æ°´å°y坐标    æ¯”如 5 ã€ 10 ã€ 20
            trans            æ˜¯å¦è½¬æ¢     å›ºå®šä¸º 1
         http  POST æ–¹å¼
             http://127.0.0.1:7088/index/api/setTransFilter
         Body å‚数内容为
                {
                "secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc",
                "app" : "live",
                "stream" : "test",
                "text" : "ABL",
                "size" : 60,
                "color" : "red",
                "alpha" : 0.8,
                "left" : 40,
                "top" : 40,
                "trans" : 1
                }
        23、为了功能更新的需要,增加设置参数值的接口,可以单独设置 ABLMediaServer.ini çš„æŸä¸€ä¸ªå€¼ï¼Œå¹¶ä¸”服务器不用重启,立即起效
            URL: index/api/setConfigParamValue
             åŠŸèƒ½ï¼š
                ä¸ºäº†åŠŸèƒ½æ›´æ–°çš„éœ€è¦ï¼Œå¢žåŠ è®¾ç½®å‚æ•°å€¼çš„æŽ¥å£ï¼Œå¯ä»¥å•ç‹¬è®¾ç½® ABLMediaServer.ini çš„æŸä¸€ä¸ªå€¼ï¼Œå¹¶ä¸”服务器不用重启,立即起效
             å‚数:              å‚数说明     å‚数参考值
                secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc        ã€å¿…填参数】
                vhost                         æ¯”如 _defaultVhost_                              ã€å¯é€‰å‚数】
                key              å‚数名       æ¯”如 saveGB28181Rtp ï¼ˆä¿å­˜æŽ¥å…¥çš„国标PS流)、 saveProxyRtspRtp ï¼ˆä¿å­˜rtsp代理拉流的rtp流)
                                              è¿˜æœ‰ ABLMediaServer.ini é‡Œé¢çš„配置参数,如果参数值不填就设置空,不是空格
                                                mediaServerID = ABLMediaServer_00001
                                                secret = 035c73f7-bb6b-4889-a715-d9eb2d1925cc
                                                localipAddress =
                                                maxTimeNoOneWatch = 9999999
                                                recordPath =
                                                picturePath =
                                                maxSameTimeSnap = 16
                                                snapOutPictureWidth = 0
                                                snapOutPictureHeight = 0
                                                snapObjectDestroy = 1
                                                snapObjectDuration = 120
                                                captureReplayType = 1
                                                pictureMaxCount = 30
                                                pushEnable_mp4 = 0
                                                fileSecond = 300
                                                videoFileFormat = 1
                                                fileKeepMaxTime = 3
                                                httpDownloadSpeed = 6
                                                fileRepeat = 0
                                                H265ConvertH264_enable = 0
                                                H265DecodeCpuGpuType = 0
                                                H264DecodeEncode_enable = 0
                                                filterVideo_enable = 0
                                                filterVideo_text = ABL水印测试123
                                                FilterFontSize = 30
                                                FilterFontColor = red
                                                FilterFontLeft = 5
                                                FilterFontTop = 5
                                                FilterFontAlpha = 0.6
                                                convertOutWidth = 720
                                                convertOutHeight = 480
                                                convertMaxObject = 26
                                                convertOutBitrate = 1024
                                                hook_enable = 0
                                                noneReaderDuration = 15
                                                on_server_started = http://10.0.0.238:4088/index/hook/on_server_started
                                                on_server_keepalive = http://10.0.0.238:4088/index/hook/on_server_keepalive
                                                on_stream_arrive = http://10.0.0.238:4088/index/hook/on_stream_arrive
                                                on_stream_not_arrive = http://10.0.0.238:4088/index/hook/on_stream_not_arrive
                                                on_stream_none_reader = http://10.0.0.238:4088/index/hook/on_stream_none_reader
                                                on_stream_disconnect = http://10.0.0.238:4088/index/hook/on_stream_disconnect
                                                on_stream_not_found =
                                                on_record_mp4 = http://10.0.0.238:4088/index/hook/on_record_mp4
                                                on_delete_record_mp4 = http://10.0.0.238:4088/index/hook/on_delete_record_mp4
                                                on_record_progress = http://10.0.0.238:4088/index/hook/on_record_progress
                                                on_record_ts = http://10.0.0.238:4088/index/hook/on_record_ts
                                                httpServerPort = 7088
                                                rtspPort = 554
                                                rtmpPort = 1935
                                                httpMp4Port = 5088
                                                wsFlvPort = 6088
                                                httpFlvPort = 8088
                                                ps_tsRecvPort = 10000
                                                hls_enable = 0
                                                hlsPort = 9088
                                                hlsCutTime = 3
                                                hlsCutType = 2
                                                h265CutType = 1
                                                enable_audio = 1
                                                G711ConvertAAC = 0
                                                IOContentNumber = 16
                                                ThreadCountOfIOContent = 8
                                                RecvThreadCount = 128
                                                SendThreadCount = 128
                                                RecordReplayThread = 32
                                                GB28181RtpTCPHeadType = 2
                                                ReConnectingCount = 40320
                                                MaxDiconnectTimeoutSecond = 36
                                                ForceSendingIFrame = 1
                value            å‚数值         è¯¦è§ ABLMediaServer.ini çš„参数值及参数值说明
             http  GET æ–¹å¼
            ã€€ æ¯”如:
                 æ‰“开保存国标PS标志
                ã€€ã€€ http://44.35.33.239:7088/index/api/setConfigParamValue?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=saveGB28181Rtp&value=1
                 å…³é—­å­˜å›½æ ‡PS标志
                ã€€ã€€ http://44.35.33.239:7088/index/api/setConfigParamValue?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=saveGB28181Rtp&value=0
                 æ‰“开保存代理拉rtsp流标志
                ã€€ã€€ http://44.35.33.239:7088/index/api/setConfigParamValue?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=saveProxyRtspRtp&value=1
                 å…³é—­ä¿å­˜ä»£ç†æ‹‰ï½’tsp流标志
                ã€€ã€€ http://44.35.33.239:7088/index/api/setConfigParamValue?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&key=saveProxyRtspRtp&value=0
        24)安全停止服务器
             URL: /index/api/shutdownServer
             åŠŸèƒ½ï¼š
                 å®‰å…¨åœæ­¢æœåŠ¡å™¨ï¼Œå¦‚æžœæœåŠ¡å™¨æ­£åœ¨å½•åƒã€æŠ“æ‹ç­‰ç­‰æ“ä½œï¼Œéœ€è¦è°ƒç”¨è¯¥å‡½æ•°å®‰å…¨åœæ­¢æœåŠ¡å™¨ï¼Œè¿™æ ·å½•åˆ¶çš„mp4才能正常播放
             å‚数:              å‚数说明     å‚数参考值
                secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc        ã€å¿…填参数】
             http  GET æ–¹å¼
               http://127.0.0.1:7088/index/api/shutdownServer?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
            http  POST æ–¹å¼
               http URL
                 http://127.0.0.1:7088/index/api/shutdownServer
               http Body å‚æ•° json æ ¼å¼
                 {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc"}
             è¿”回Body:
                {
                    "code": 0,
                    "memo": "ABLMediaServer shutdown Successed !"
                }
        25)重新启动服务器
             URL: /index/api/restartServer
             åŠŸèƒ½ï¼š
                 å®‰å…¨é‡å¯æœåŠ¡å™¨ï¼Œå¦‚æžœæœåŠ¡å™¨æ­£åœ¨å½•åƒã€æŠ“æ‹ç­‰ç­‰æ“ä½œï¼Œéœ€è¦è°ƒç”¨è¯¥å‡½æ•°å®‰å…¨é‡å¯æœåŠ¡å™¨ï¼Œè¿™æ ·å½•åˆ¶çš„mp4才能正常播放
             å‚数:              å‚数说明     å‚数参考值
                secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc        ã€å¿…填参数】
             http  GET æ–¹å¼
               http://127.0.0.1:7088/index/api/restartServer?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
            http  POST æ–¹å¼
               http URL
                 http://127.0.0.1:7088/index/api/restartServer
               http Body å‚æ•° json æ ¼å¼
                 {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc"}
             è¿”回Body:
                {
                    "code": 0,
                    "memo": "ABLMediaServer restartServer Successed ! "
                }
          26)获取当前转码的数量
             URL: /index/api/getTranscodingCount
             åŠŸèƒ½ï¼š
                  èŽ·å–å½“å‰æ­£åœ¨è½¬ç çš„æ•°é‡
             å‚数:              å‚数说明     å‚数参考值
                secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc        ã€å¿…填参数】
             http  GET æ–¹å¼
               http://127.0.0.1:7088/index/api/getTranscodingCount?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
            http  POST æ–¹å¼
               http URL
                 http://127.0.0.1:7088/index/api/getTranscodingCount
               http Body å‚æ•° json æ ¼å¼
                 {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc"}
             è¿”回Body:
                {
                    "code": 0,
                    "currentTranscodingCount": 2
                }
      27)、列举流媒体服务器所有占用端口
             URL: /index/api/listServerPort
             åŠŸèƒ½ï¼š
                 åˆ—举流媒体服务器所有占用端口
             å‚数:              å‚数说明     å‚数参考值
                secret           æœåŠ¡å™¨å¯†ç    æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc        ã€å¿…填参数】
                app              åº”用名       æ¯”如 rtp、gb28181、Media ç­‰ç­‰ ï¼Œè‡ªå·±èµ·çš„名字     ã€å¯é€‰å‚数】
                stream           åª’体流名     æ¯”如 Camera_00001、44303403343034243200234 ç­‰ç­‰  ã€å¯é€‰å‚数】
                å‚数填写样例说明:
              æ ·ä¾‹1(app、stream éƒ½ä¸å¡«å†™ï¼‰
                   secret  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                  è¿”回所有在线的媒体源
              æ ·ä¾‹2 ï¼ˆåªå¡«å†™ app ï¼‰
                   secret  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                   app     rtp
                   è¿”回 app ç­‰äºŽ rtp çš„æ‰€æœ‰åª’体源
              æ ·ä¾‹3 ï¼ˆå¡«å†™ app = rtp , stream = 44303403343034243200234)
                   secret  035c73f7-bb6b-4889-a715-d9eb2d1925cc
                   app     rtp
                   stream  44303403343034243200234
                  è¿”回 app ç­‰äºŽ rtp、并且 stream ç­‰äºŽ 44303403343034243200234 çš„æ‰€æœ‰åª’体源
              æ ·ä¾‹4 ï¼ˆå¡«å†™ stream = 44303403343034243200234)
                   secret           035c73f7-bb6b-4889-a715-d9eb2d1925cc
                    stream           44303403343034243200234
                   è¿”回 stream ç­‰äºŽ 44303403343034243200234 çš„æ‰€æœ‰åª’体源
             http  GET æ–¹å¼
                http://127.0.0.1:7088/index/api/listServerPort?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
            http  POST æ–¹å¼
               http URL
                 http://127.0.0.1:7088/index/api/listServerPort
               http Body å‚æ•° json æ ¼å¼
                 {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc"}
             è¿”回Body:
                    {
                        "code": 0,
                        "memo": "success",
                        "data": [
                            {
                                "key": 478,
                                "app": "Media",
                                "stream": "Camera_00003",
                                "networkType": 23,
                                "port": 34988
                            },
                            {
                                "key": 477,
                                "app": "Media",
                                "stream": "Camera_00002",
                                "networkType": 23,
                                "port": 34986
                            },
                            {
                                "key": 476,
                                "app": "Media",
                                "stream": "Camera_00001",
                                "networkType": 23,
                                "port": 34984
                            },
                            {
                                "key": 456,
                                "app": "",
                                "stream": "",
                                "networkType": 68,
                                "port": 10000
                            }
                        ]
                    }
                   ã€æ³¨é‡Šï¼šå¯ä»¥æ ¹æ® "networkType": 23, è¿™ä¸ªå­—段标识对象的网络类型 ï¼Œå…·ä½“详见网络类型的对照表 ã€‘
        28)、批量设置服务器的配置参数
                 URL: /index/api/setServerConfig
             åŠŸèƒ½ï¼š
                 æ‰¹é‡è®¾ç½®æœåŠ¡å™¨çš„é…ç½®å‚æ•°
             å‚数:                     å‚数说明                  å‚数参考值
                secret                  æœåŠ¡å™¨å¯†ç                 æ¯”如 035c73f7-bb6b-4889-a715-d9eb2d1925cc              ã€å¿…填参数】
                 noneReaderDuration      å¤šå°‘秒无人观看通知一次    20                                                     ã€å¯é€‰å‚数】
                on_server_started       æœåŠ¡å™¨å¯åŠ¨é€šçŸ¥            http://10.0.0.238:4088/index/hook/on_server_started    ã€å¯é€‰å‚数】
                iframeArriveNoticCount  i帧达到通知总数           30                                                     ã€å¯é€‰å‚数】
            http  GET æ–¹å¼
               http://127.0.0.1:7088/index/api/setServerConfig?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&noneReaderDuration=20&on_server_started=http://10.0.0.238:4088/index/hook/on_server_started&iframeArriveNoticCount=30
            http  POST æ–¹å¼
               http URL
                 http://127.0.0.1:7088/index/api/setServerConfig
               http Body å‚æ•° json æ ¼å¼
                 {"secret":"035c73f7-bb6b-4889-a715-d9eb2d1925cc","noneReaderDuration":20,"iframeArriveNoticCount":30,"on_server_started":"http://10.0.0.238:4088/index/hook/on_server_started"}
        29) ä¸ºäº†æ–¹ä¾¿æŸäº›ç‰¹æ®Šåœºåˆï¼ŒæœåŠ¡å™¨æ”¯æŒudp的10000 ç«¯å£æŽ¥å…¥å›½æ ‡PS码流,就是人们常说的单端口模式,url的命名规则为 /rtp/ssrc ,其中ssrc为下级rtp打包
             çš„16进制的值转换为大小的字符串,即可sprintf(url,"rtp/%X",ssrc) ,具体接入的url名字可以调用 getMediaList æŸ¥è¯¢å‡ºæŽ¥å…¥çš„国标流 ã€‚需要注意的是
             ä¸‹çº§ rtp æ‰“包时每路视频的rtp中的ssrc不能相同。
        30) ç½‘络类型的对照表
          1 åª’体输入网络类型对照表
              æ•´å½¢å€¼     ä»£è¡¨æ„ä¹‰
              21         ä»¥rtmp方式推送接入流媒体服务器
              23         ä»¥rtsp方式推送接入流媒体服务器
              30         æœåС噍以rtsp方式主动拉流接入
              31         æœåС噍以rtmp方式主动拉流接入
              32         æœåС噍以flv方式主动拉流接入
              33         æœåС噍以hls方式主动拉流接入
              50         ä»£ç†æ‹‰æµæŽ¥å…¥æœåС噍
              60         æœåŠ¡å™¨ä»¥å›½æ ‡28181的UDP方式接入
              61         æœåŠ¡å™¨ä»¥å›½æ ‡28181的TCP方式接入
               80         æœåŠ¡å™¨å½•åƒæ–‡ä»¶ç‚¹æ’­ä»¥è¯»å–fmp4文件输入
              81         æœåŠ¡å™¨å½•åƒæ–‡ä»¶ç‚¹æ’­ä»¥è¯»å–TS文件输入
              82         æœåŠ¡å™¨å½•åƒæ–‡ä»¶ç‚¹æ’­ä»¥è¯»å–PS文件输入
              83         æœåŠ¡å™¨å½•åƒæ–‡ä»¶ç‚¹æ’­ä»¥è¯»å–FLV文件输入
          2 åª’体输出网络类型对照表
             æ•´å½¢å€¼     ä»£è¡¨æ„ä¹‰
              22         æœåС噍以rtsp被动方式往外发送码流 ï¼Œå³å¸¸è§çš„vlc点播
              24         æœåС噍以rtmp被动方式往外发送码流 ï¼Œå³å¸¸è§çš„vlc点播
              25         æœåС噍以flv被动方式往外发送码流 ï¼Œå³å¸¸è§çš„vlc点播 ã€æµè§ˆå™¨æ’­æ”¾
              26         æœåС噍以hls被动方式往外发送码流 ï¼Œå³å¸¸è§çš„vlc点播 ã€æµè§ˆå™¨æ’­æ”¾
              27         æœåС噍以ws-flv被动方式往外发送码流 ,EasyPlayer.js插件播放、浏览器播放
              28         æœåС噍以http-mp4被动方式往外发送码流 ï¼Œå³å¸¸è§çš„vlc点播 ã€æµè§ˆå™¨æ’­æ”¾
              40         æœåС噍以rtsp主动方式往外发送码流 ï¼Œå³å¸¸è§çš„rtsp推流
              41         æœåС噍以rtmp主动方式往外发送码流 ï¼Œå³å¸¸è§çš„rtmp推流
              65         æœåŠ¡å™¨ä»¥å›½æ ‡GB28181主动UDP方式往外发送码流 ï¼Œå³å¸¸è§çš„国标以UDP方式往上级推流
              66         æœåŠ¡å™¨ä»¥å›½æ ‡GB28181主动TCP方式往外发送码流 ï¼Œå³å¸¸è§çš„国标以TCP方式往上级推流
src/main/java/com/genersoft/iot/vmp/media/abl/ABLRESTfulUtils.java
@@ -270,126 +270,29 @@
        }
    }
    public JSONObject getMediaList(MediaServer mediaServerItem, String app, String stream, String schema, RequestCallback callback){
    public Integer openRtpServer(MediaServer mediaServer, String app, String stream, int payload, Integer port, Integer tcpMode, Integer disableAudio) {
        Map<String, Object> param = new HashMap<>();
        if (app != null) {
            param.put("app",app);
        }
        if (stream != null) {
            param.put("stream",stream);
        }
        if (schema != null) {
            param.put("schema",schema);
        }
        param.put("vhost","__defaultVhost__");
        return sendPost(mediaServerItem, "getMediaList",param, callback);
    }
    public JSONObject getMediaList(MediaServer mediaServerItem, String app, String stream){
        return getMediaList(mediaServerItem, app, stream,null,  null);
    }
    public JSONObject getMediaList(MediaServer mediaServerItem, RequestCallback callback){
        return sendPost(mediaServerItem, "getMediaList",null, callback);
    }
    public JSONObject getMediaInfo(MediaServer mediaServerItem, String app, String schema, String stream){
        Map<String, Object> param = new HashMap<>();
        param.put("app",app);
        param.put("schema",schema);
        param.put("stream",stream);
        param.put("vhost","__defaultVhost__");
        return sendPost(mediaServerItem, "getMediaInfo",param, null);
    }
    public JSONObject getRtpInfo(MediaServer mediaServerItem, String stream_id){
        Map<String, Object> param = new HashMap<>();
        param.put("stream_id",stream_id);
        return sendPost(mediaServerItem, "getRtpInfo",param, null);
    }
    public JSONObject addFFmpegSource(MediaServer mediaServerItem, String src_url, String dst_url, Integer timeout_ms,
                                      boolean enable_audio, boolean enable_mp4, String ffmpeg_cmd_key){
        logger.info(src_url);
        logger.info(dst_url);
        Map<String, Object> param = new HashMap<>();
        param.put("src_url", src_url);
        param.put("dst_url", dst_url);
        param.put("timeout_ms", timeout_ms);
        param.put("enable_mp4", enable_mp4);
        param.put("ffmpeg_cmd_key", ffmpeg_cmd_key);
        return sendPost(mediaServerItem, "addFFmpegSource",param, null);
    }
    public JSONObject delFFmpegSource(MediaServer mediaServerItem, String key){
        Map<String, Object> param = new HashMap<>();
        param.put("key", key);
        return sendPost(mediaServerItem, "delFFmpegSource",param, null);
    }
    public JSONObject delStreamProxy(MediaServer mediaServerItem, String key){
        Map<String, Object> param = new HashMap<>();
        param.put("key", key);
        return sendPost(mediaServerItem, "delStreamProxy",param, null);
    }
    public JSONObject getServerConfig(MediaServer mediaServerItem){
        return sendPost(mediaServerItem, "getServerConfig",null, null);
    }
    public JSONObject setConfigParamValue(MediaServer mediaServerItem, String key, Object value){
        Map<String, Object> param =  new HashMap<>();
        param.put("key", key);
        param.put("value", value);
        return sendGet(mediaServerItem,"setConfigParamValue", param);
    }
    public JSONObject openRtpServer(MediaServer mediaServerItem, Map<String, Object> param){
        return sendPost(mediaServerItem, "openRtpServer",param, null);
    }
    public JSONObject closeRtpServer(MediaServer mediaServerItem, Map<String, Object> param) {
        return sendPost(mediaServerItem, "closeRtpServer",param, null);
    }
    public void closeRtpServer(MediaServer mediaServerItem, Map<String, Object> param, RequestCallback callback) {
        sendPost(mediaServerItem, "closeRtpServer",param, callback);
    }
    public JSONObject listRtpServer(MediaServer mediaServerItem) {
        return sendPost(mediaServerItem, "listRtpServer",null, null);
    }
    public JSONObject startSendRtp(MediaServer mediaServerItem, Map<String, Object> param) {
        return sendPost(mediaServerItem, "startSendRtp",param, null);
    }
    public JSONObject startSendRtpPassive(MediaServer mediaServerItem, Map<String, Object> param) {
        return sendPost(mediaServerItem, "startSendRtpPassive",param, null);
    }
    public JSONObject startSendRtpPassive(MediaServer mediaServerItem, Map<String, Object> param, RequestCallback callback) {
        return sendPost(mediaServerItem, "startSendRtpPassive",param, callback);
    }
    public JSONObject stopSendRtp(MediaServer mediaServerItem, Map<String, Object> param) {
        return sendPost(mediaServerItem, "stopSendRtp",param, null);
    }
    public JSONObject restartServer(MediaServer mediaServerItem) {
        return sendPost(mediaServerItem, "restartServer",null, null);
    }
    public JSONObject addStreamProxy(MediaServer mediaServerItem, String app, String stream, String url, boolean enable_audio, boolean enable_mp4, String rtp_type) {
        Map<String, Object> param = new HashMap<>();
        param.put("vhost", "__defaultVhost__");
        param.put("vhost", "_defaultVhost_");
        param.put("app", app);
        param.put("stream", stream);
        param.put("url", url);
        param.put("enable_mp4", enable_mp4?1:0);
        param.put("enable_audio", enable_audio?1:0);
        param.put("rtp_type", rtp_type);
        return sendPost(mediaServerItem, "addStreamProxy",param, null, 20);
        param.put("stream_id", stream);
        param.put("payload", payload);
        if (port != null) {
            param.put("port", port);
        }
        if (tcpMode != null) {
            param.put("enable_tcp", tcpMode);
        }
        if (disableAudio != null) {
            param.put("disableAudio", disableAudio);
        }
        JSONObject jsonObject = sendPost(mediaServer, "openRtpServer", param, null);
        if (jsonObject.getInteger("code") == 0) {
            return jsonObject.getInteger("port");
        }else {
            return 0;
        }
    }
    public JSONObject closeStreams(MediaServer mediaServerItem, String app, String stream) {
@@ -401,58 +304,14 @@
        return sendPost(mediaServerItem, "close_streams",param, null);
    }
    public JSONObject getAllSession(MediaServer mediaServerItem) {
        return sendPost(mediaServerItem, "getAllSession",null, null);
    public JSONObject getServerConfig(MediaServer mediaServerItem){
        return sendPost(mediaServerItem, "getServerConfig",null, null);
    }
    public void kickSessions(MediaServer mediaServerItem, String localPortSStr) {
        Map<String, Object> param = new HashMap<>();
        param.put("local_port", localPortSStr);
        sendPost(mediaServerItem, "kick_sessions",param, null);
    }
    public void getSnap(MediaServer mediaServerItem, String streamUrl, int timeout_sec, int expire_sec, String targetPath, String fileName) {
        Map<String, Object> param = new HashMap<>(3);
        param.put("url", streamUrl);
        param.put("timeout_sec", timeout_sec);
        param.put("expire_sec", expire_sec);
        sendGetForImg(mediaServerItem, "getSnap", param, targetPath, fileName);
    }
    public JSONObject pauseRtpCheck(MediaServer mediaServerItem, String streamId) {
        Map<String, Object> param = new HashMap<>(1);
        param.put("stream_id", streamId);
        return sendPost(mediaServerItem, "pauseRtpCheck",param, null);
    }
    public JSONObject resumeRtpCheck(MediaServer mediaServerItem, String streamId) {
        Map<String, Object> param = new HashMap<>(1);
        param.put("stream_id", streamId);
        return sendPost(mediaServerItem, "resumeRtpCheck",param, null);
    }
    public JSONObject connectRtpServer(MediaServer mediaServerItem, String dst_url, int dst_port, String stream_id) {
        Map<String, Object> param = new HashMap<>(1);
        param.put("dst_url", dst_url);
        param.put("dst_port", dst_port);
        param.put("stream_id", stream_id);
        return sendPost(mediaServerItem, "connectRtpServer",param, null);
    }
    public JSONObject updateRtpServerSSRC(MediaServer mediaServerItem, String streamId, String ssrc) {
        Map<String, Object> param = new HashMap<>(1);
        param.put("ssrc", ssrc);
        param.put("stream_id", streamId);
        return sendPost(mediaServerItem, "updateRtpServerSSRC",param, null);
    }
    public JSONObject deleteRecordDirectory(MediaServer mediaServerItem, String app, String stream, String date, String fileName) {
        Map<String, Object> param = new HashMap<>(1);
        param.put("vhost", "__defaultVhost__");
        param.put("app", app);
        param.put("stream", stream);
        param.put("period", date);
        param.put("name", fileName);
        return sendPost(mediaServerItem, "deleteRecordDirectory",param, null);
    public JSONObject setConfigParamValue(MediaServer mediaServerItem, String key, Object value){
        Map<String, Object> param =  new HashMap<>();
        param.put("key", key);
        param.put("value", value);
        return sendGet(mediaServerItem,"setConfigParamValue", param);
    }
}
src/main/java/com/genersoft/iot/vmp/media/abl/bean/hook/ABLHookParam.java
@@ -21,7 +21,7 @@
    /**
     * åª’体流来源网络编号,可参考附表
     */
    private String networkType;
    private Integer networkType;
    public String getMediaServerId() {
        return mediaServerId;
@@ -55,11 +55,11 @@
        this.key = key;
    }
    public String getNetworkType() {
    public Integer getNetworkType() {
        return networkType;
    }
    public void setNetworkType(String networkType) {
    public void setNetworkType(Integer networkType) {
        this.networkType = networkType;
    }
}
src/main/java/com/genersoft/iot/vmp/media/bean/MediaInfo.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.media.abl.bean.hook.OnStreamArriveABLHookParam;
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
import com.genersoft.iot.vmp.media.zlm.dto.hook.OriginType;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
@@ -186,6 +187,24 @@
        mediaInfo.setReaderCount(param.getReaderCount());
        mediaInfo.setOnline(true);
        mediaInfo.setVideoCodec(param.getVideoCodec());
        switch (param.getNetworkType()) {
            case 21:
                mediaInfo.setOriginType(OriginType.RTMP_PUSH.ordinal());
                break;
            case 23:
                mediaInfo.setOriginType(OriginType.RTSP_PUSH.ordinal());
                break;
            case 30:
            case 31:
            case 32:
            case 33:
                mediaInfo.setOriginType(OriginType.PULL.ordinal());
                break;
            default:
                mediaInfo.setOriginType(OriginType.UNKNOWN.ordinal());
                break;
        }
        mediaInfo.setWidth(param.getWidth());
        mediaInfo.setHeight(param.getHeight());
        mediaInfo.setAudioCodec(param.getAudioCodec());
src/main/java/com/genersoft/iot/vmp/media/bean/MediaServer.java
@@ -32,6 +32,18 @@
    @Schema(description = "RTMP端口")
    private int rtmpPort;
    @Schema(description = "flv端口")
    private int flvPort;
    @Schema(description = "https-flv端口")
    private int flvSSLPort;
    @Schema(description = "ws-flv端口")
    private int wsFlvPort;
    @Schema(description = "wss-flv端口")
    private int wsFlvSSLPort;
    @Schema(description = "RTMPS端口")
    private int rtmpSSlPort;
@@ -98,7 +110,11 @@
        sdpIp = ObjectUtils.isEmpty(zlmServerConfig.getSdpIp())? zlmServerConfig.getIp(): zlmServerConfig.getSdpIp();
        streamIp = ObjectUtils.isEmpty(zlmServerConfig.getStreamIp())? zlmServerConfig.getIp(): zlmServerConfig.getStreamIp();
        httpPort = zlmServerConfig.getHttpPort();
        flvPort = zlmServerConfig.getHttpPort();
        wsFlvPort = zlmServerConfig.getHttpPort();
        httpSSlPort = zlmServerConfig.getHttpSSLport();
        flvSSLPort = zlmServerConfig.getHttpSSLport();
        wsFlvSSLPort = zlmServerConfig.getHttpSSLport();
        rtmpPort = zlmServerConfig.getRtmpPort();
        rtmpSSlPort = zlmServerConfig.getRtmpSslPort();
        rtpProxyPort = zlmServerConfig.getRtpProxyPort();
@@ -328,4 +344,36 @@
    public void setType(String type) {
        this.type = type;
    }
    public int getFlvPort() {
        return flvPort;
    }
    public void setFlvPort(int flvPort) {
        this.flvPort = flvPort;
    }
    public int getFlvSSLPort() {
        return flvSSLPort;
    }
    public void setFlvSSLPort(int flvSSLPort) {
        this.flvSSLPort = flvSSLPort;
    }
    public int getWsFlvPort() {
        return wsFlvPort;
    }
    public void setWsFlvPort(int wsFlvPort) {
        this.wsFlvPort = wsFlvPort;
    }
    public int getWsFlvSSLPort() {
        return wsFlvSSLPort;
    }
    public void setWsFlvSSLPort(int wsFlvSSLPort) {
        this.wsFlvSSLPort = wsFlvSSLPort;
    }
}
src/main/java/com/genersoft/iot/vmp/media/event/hook/HookSubscribe.java
@@ -35,7 +35,7 @@
    @Async("taskExecutor")
    @EventListener
    public void onApplicationEvent(MediaArrivalEvent event) {
        if ("rtsp".equals(event.getSchema())) {
        if (event.getSchema() == null || "rtsp".equals(event.getSchema())) {
            sendNotify(HookType.on_media_arrival, event);
        }
@@ -47,7 +47,7 @@
    @Async("taskExecutor")
    @EventListener
    public void onApplicationEvent(MediaDepartureEvent event) {
        if ("rtsp".equals(event.getSchema())) {
        if (event.getSchema() == null || "rtsp".equals(event.getSchema())) {
            sendNotify(HookType.on_media_departure, event);
        }
src/main/java/com/genersoft/iot/vmp/media/service/IMediaNodeServerService.java
@@ -10,7 +10,7 @@
import java.util.Map;
public interface IMediaNodeServerService {
    int createRTPServer(MediaServer mediaServer, String streamId, long ssrc, Integer port, Boolean onlyAuto, Boolean reUsePort, Integer tcpMode);
    int createRTPServer(MediaServer mediaServer, String streamId, long ssrc, Integer port, Boolean onlyAuto, Boolean disableAudio, Boolean reUsePort, Integer tcpMode);
    void closeRtpServer(MediaServer mediaServer, String streamId);
src/main/java/com/genersoft/iot/vmp/media/service/IMediaServerService.java
@@ -33,9 +33,7 @@
    void updateVmServer(List<MediaServer>  mediaServerItemList);
    SSRCInfo openRTPServer(MediaServer mediaServerItem, String streamId, String presetSsrc, boolean ssrcCheck,
                           boolean isPlayback, Integer port, Boolean onlyAuto, Boolean reUsePort, Integer tcpMode);
    SSRCInfo openRTPServer(MediaServer mediaServerItem, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback, Integer port, Boolean onlyAuto);
                           boolean isPlayback, Integer port, Boolean onlyAuto, Boolean disableAudio, Boolean reUsePort, Integer tcpMode);
    void closeRTPServer(MediaServer mediaServerItem, String streamId);
src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java
@@ -132,7 +132,7 @@
    @Override
    public SSRCInfo openRTPServer(MediaServer mediaServer, String streamId, String presetSsrc, boolean ssrcCheck,
                                  boolean isPlayback, Integer port, Boolean onlyAuto, Boolean reUsePort, Integer tcpMode) {
                                  boolean isPlayback, Integer port, Boolean onlyAuto, Boolean disableAudio, Boolean reUsePort, Integer tcpMode) {
        if (mediaServer == null || mediaServer.getId() == null) {
            logger.info("[openRTPServer] å¤±è´¥, mediaServer == null || mediaServer.getId() == null");
            return null;
@@ -163,18 +163,12 @@
                logger.info("[openRTPServer] å¤±è´¥, mediaServer的类型: {},未找到对应的实现类", mediaServer.getType());
                return null;
            }
            rtpServerPort = mediaNodeServerService.createRTPServer(mediaServer, streamId, ssrcCheck ? Long.parseLong(ssrc) : 0, port, onlyAuto, reUsePort, tcpMode);
            rtpServerPort = mediaNodeServerService.createRTPServer(mediaServer, streamId, ssrcCheck ? Long.parseLong(ssrc) : 0, port, onlyAuto, disableAudio, reUsePort, tcpMode);
        } else {
            rtpServerPort = mediaServer.getRtpProxyPort();
        }
        return new SSRCInfo(rtpServerPort, ssrc, streamId);
    }
    @Override
    public SSRCInfo openRTPServer(MediaServer mediaServer, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback, Integer port, Boolean onlyAuto) {
        return openRTPServer(mediaServer, streamId, ssrc, ssrcCheck, isPlayback, port, onlyAuto, null, 0);
    }
    @Override
    public void closeRTPServer(MediaServer mediaServer, String streamId) {
@@ -770,7 +764,18 @@
        String callIdParam = ObjectUtils.isEmpty(callId)?"":"?callId=" + callId;
        streamInfoResult.setRtmp(addr, mediaServer.getRtmpPort(),mediaServer.getRtmpSSlPort(), app,  stream, callIdParam);
        streamInfoResult.setRtsp(addr, mediaServer.getRtspPort(),mediaServer.getRtspSSLPort(), app,  stream, callIdParam);
        streamInfoResult.setFlv(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), app,  stream, callIdParam);
        if ("abl".equals(mediaServer.getType())) {
            String flvFile = String.format("%s/%s.flv%s", app, stream, callIdParam);
            streamInfoResult.setFlv(addr, mediaServer.getFlvPort(),mediaServer.getFlvSSLPort(), flvFile);
            streamInfoResult.setWsFlv(addr, mediaServer.getWsFlvPort(),mediaServer.getWsFlvSSLPort(), flvFile);
        }else {
            String flvFile = String.format("%s/%s.live.flv%s", app, stream, callIdParam);
            streamInfoResult.setFlv(addr, mediaServer.getFlvPort(),mediaServer.getFlvSSLPort(), flvFile);
            streamInfoResult.setWsFlv(addr, mediaServer.getWsFlvPort(),mediaServer.getWsFlvSSLPort(), flvFile);
        }
        streamInfoResult.setFmp4(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), app,  stream, callIdParam);
        streamInfoResult.setHls(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), app,  stream, callIdParam);
        streamInfoResult.setTs(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), app,  stream, callIdParam);
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaNodeServerService.java
@@ -39,7 +39,7 @@
    private String sipIp;
    @Override
    public int createRTPServer(MediaServer mediaServer, String streamId, long ssrc, Integer port, Boolean onlyAuto, Boolean reUsePort, Integer tcpMode) {
    public int createRTPServer(MediaServer mediaServer, String streamId, long ssrc, Integer port, Boolean onlyAuto, Boolean disableAudio, Boolean reUsePort, Integer tcpMode) {
        return zlmServerFactory.createRTPServer(mediaServer, streamId, ssrc, port, onlyAuto, reUsePort, tcpMode);
    }
@@ -178,7 +178,9 @@
        String callIdParam = ObjectUtils.isEmpty(callId)?"":"?callId=" + callId;
        streamInfoResult.setRtmp(addr, mediaServer.getRtmpPort(),mediaServer.getRtmpSSlPort(), app,  stream, callIdParam);
        streamInfoResult.setRtsp(addr, mediaServer.getRtspPort(),mediaServer.getRtspSSLPort(), app,  stream, callIdParam);
        streamInfoResult.setFlv(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), app,  stream, callIdParam);
        String flvFile = String.format("%s/%s.live.flv%s", app, stream, callIdParam);
        streamInfoResult.setFlv(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), flvFile);
        streamInfoResult.setWsFlv(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), flvFile);
        streamInfoResult.setFmp4(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), app,  stream, callIdParam);
        streamInfoResult.setHls(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), app,  stream, callIdParam);
        streamInfoResult.setTs(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), app,  stream, callIdParam);
src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java
@@ -542,7 +542,7 @@
        } else {
            tcpMode = 0;
        }
        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, null, ssrcCheck, false, null, true, false, tcpMode);
        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, null, ssrcCheck, false, null, true, false, false, tcpMode);
        if (ssrcInfo == null || ssrcInfo.getPort() < 0) {
            logger.info("[国标级联] å‘起语音喊话 å¼€å¯ç«¯å£ç›‘听失败, platform: {}, channel: {}", platform.getServerGBId(), channelId);
            SipSubscribe.EventResult<Object> eventResult = new SipSubscribe.EventResult<>();
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -259,7 +259,7 @@
            );
            SSRCInfo ssrcInfo = mediaServerService.openRTPServer(event.getMediaServer(), event.getStream(), null,
                    device.isSsrcCheck(), true, 0, false, false, device.getStreamModeForParam());
                    device.isSsrcCheck(), true, 0, false, !deviceChannel.isHasAudio(), false, device.getStreamModeForParam());
            playBack(event.getMediaServer(), ssrcInfo, deviceId, channelId, startTime, endTime, null);
        }
    }
@@ -321,7 +321,7 @@
            }
        }
        String streamId = String.format("%s_%s", device.getDeviceId(), channelId);
        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, ssrc, device.isSsrcCheck(),  false, 0, false, false, device.getStreamModeForParam());
        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, ssrc, device.isSsrcCheck(),  false, 0, false, !channel.isHasAudio(), false, device.getStreamModeForParam());
        if (ssrcInfo == null) {
            callback.run(InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getMsg(), null);
            inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
@@ -762,6 +762,12 @@
            throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到设备:" + deviceId);
        }
        DeviceChannel channel = channelService.getOne(deviceId, channelId);
        if (channel == null) {
            logger.warn("[录像回放] æœªæ‰¾åˆ°é€šé“ deviceId: {},channelId:{}", deviceId, channelId);
            throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到通道:" + channelId);
        }
        MediaServer newMediaServerItem = getNewMediaServerItem(device);
        if (device.getStreamMode().equalsIgnoreCase("TCP-ACTIVE") && ! newMediaServerItem.isRtpEnable()) {
            logger.warn("[录像回放] å•端口收流时不支持TCP主动方式收流 deviceId: {},channelId:{}", deviceId, channelId);
@@ -774,7 +780,7 @@
                .replace(":", "")
                .replace(" ", "");
        String stream = deviceId + "_" + channelId + "_" + startTimeStr + "_" + endTimeTimeStr;
        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, stream, null, device.isSsrcCheck(),  true, 0, false,  false, device.getStreamModeForParam());
        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, stream, null, device.isSsrcCheck(),  true, 0, false,  !channel.isHasAudio(),  false, device.getStreamModeForParam());
        playBack(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, callback);
    }
@@ -959,6 +965,10 @@
        if (device == null) {
            return;
        }
        DeviceChannel channel = channelService.getOne(deviceId, channelId);
        if (channel == null) {
            return;
        }
        MediaServer newMediaServerItem = this.getNewMediaServerItem(device);
        if (newMediaServerItem == null) {
            callback.run(InviteErrorCode.ERROR_FOR_ASSIST_NOT_READY.getCode(),
@@ -967,7 +977,7 @@
            return;
        }
        // å½•像下载不使用固定流地址,固定流地址会导致如果开始时间与结束时间一致时文件错误的叠加在一起
        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, null, device.isSsrcCheck(),  true, 0, false,false, device.getStreamModeForParam());
        SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, null, device.isSsrcCheck(),  true, 0, false,!channel.isHasAudio(), false, device.getStreamModeForParam());
        download(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, downloadSpeed, callback);
    }
src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java
@@ -24,6 +24,10 @@
            "rtmp_ssl_port,"+
            "rtp_proxy_port,"+
            "rtsp_port,"+
            "flv_port," +
            "flv_ssl_port," +
            "ws_flv_port," +
            "ws_flv_ssl__port," +
            "rtsp_ssl_port,"+
            "auto_config,"+
            "secret,"+
@@ -51,6 +55,10 @@
            "#{rtmpSSlPort}, " +
            "#{rtpProxyPort}, " +
            "#{rtspPort}, " +
            "#{flvPort}, " +
            "#{flvSSLPort}, " +
            "#{wsFlvPort}, " +
            "#{wsFlvSSLPort}, " +
            "#{rtspSSLPort}, " +
            "#{autoConfig}, " +
            "#{secret}, " +
@@ -81,6 +89,10 @@
            "<if test=\"rtpProxyPort != null\">, rtp_proxy_port=#{rtpProxyPort}</if>" +
            "<if test=\"rtspPort != null\">, rtsp_port=#{rtspPort}</if>" +
            "<if test=\"rtspSSLPort != null\">, rtsp_ssl_port=#{rtspSSLPort}</if>" +
            "<if test=\"flvPort != null\">, flv_port=#{flvPort}</if>" +
            "<if test=\"flvSSLPort != null\">, flv_ssl_port=#{flvSSLPort}</if>" +
            "<if test=\"wsFlvPort != null\">, ws_flv_port=#{wsFlvPort}</if>" +
            "<if test=\"wsFlvSSLPort != null\">, ws_flv_ssl_port=#{wsFlvSSLPort}</if>" +
            "<if test=\"autoConfig != null\">, auto_config=#{autoConfig}</if>" +
            "<if test=\"rtpEnable != null\">, rtp_enable=#{rtpEnable}</if>" +
            "<if test=\"rtpPortRange != null\">, rtp_port_range=#{rtpPortRange}</if>" +
@@ -108,6 +120,10 @@
            "<if test=\"rtpProxyPort != null\">, rtp_proxy_port=#{rtpProxyPort}</if>" +
            "<if test=\"rtspPort != null\">, rtsp_port=#{rtspPort}</if>" +
            "<if test=\"rtspSSLPort != null\">, rtsp_ssl_port=#{rtspSSLPort}</if>" +
            "<if test=\"flvPort != null\">, flv_port=#{flvPort}</if>" +
            "<if test=\"flvSSLPort != null\">, flv_ssl_port=#{flvSSLPort}</if>" +
            "<if test=\"wsFlvPort != null\">, ws_flv_port=#{wsFlvPort}</if>" +
            "<if test=\"wsFlvSSLPort != null\">, ws_flv_ssl_port=#{wsFlvSSLPort}</if>" +
            "<if test=\"autoConfig != null\">, auto_config=#{autoConfig}</if>" +
            "<if test=\"rtpEnable != null\">, rtp_enable=#{rtpEnable}</if>" +
            "<if test=\"rtpPortRange != null\">, rtp_port_range=#{rtpPortRange}</if>" +
Êý¾Ý¿â/abl/³õʼ»¯-mysql-2.7.0.sql
@@ -155,6 +155,10 @@
                                  rtp_proxy_port integer,
                                  rtsp_port integer,
                                  rtsp_ssl_port integer,
                                  flv_port integer,
                                  flv_ssl_port integer,
                                  ws_flv_port integer,
                                  ws_flv_ssl_port integer,
                                  auto_config bool default false,
                                  secret character varying(50),
                                  type character varying(50) default 'zlm',
Êý¾Ý¿â/abl/³õʼ»¯-postgresql-kingbase-2.7.0.sql
@@ -155,6 +155,10 @@
                                  rtp_proxy_port integer,
                                  rtsp_port integer,
                                  rtsp_ssl_port integer,
                                  flv_port integer,
                                  flv_ssl_port integer,
                                  ws_flv_port integer,
                                  ws_flv_ssl_port integer,
                                  auto_config bool default false,
                                  secret character varying(50),
                                  type character varying(50) default 'zlm',
Êý¾Ý¿â/abl/¸üÐÂ-mysql-2.7.0.sql
@@ -1,2 +1,11 @@
alter table wvp_media_server
    add  type character varying(50) default 'zlm';
alter table wvp_media_server
    add flv_port integer;
alter table wvp_media_server
    add flv_ssl_port integer;
alter table wvp_media_server
    add ws_flv_port integer;
alter table wvp_media_server
    add ws_flv_ssl_port integer;
Êý¾Ý¿â/abl/¸üÐÂ-postgresql-kingbase-2.7.0.sql
@@ -1,2 +1,11 @@
alter table wvp_media_server
    add  type character varying(50) default 'zlm',;
    add  type character varying(50) default 'zlm';
alter table wvp_media_server
    add flv_port integer;
alter table wvp_media_server
    add flv_ssl_port integer;
alter table wvp_media_server
    add ws_flv_port integer;
alter table wvp_media_server
    add ws_flv_ssl_port integer;