Commit 688e222dcccb809cf314e175db944ad25cb9bc1e
1 parent
470be2dc
优化按需拉流配置,拉流代理支持按需拉流
Showing
14 changed files
with
91 additions
and
82 deletions
sql/mysql.sql
| ... | ... | @@ -277,7 +277,6 @@ CREATE TABLE `media_server` ( |
| 277 | 277 | `rtspSSLPort` int NOT NULL, |
| 278 | 278 | `autoConfig` int NOT NULL, |
| 279 | 279 | `secret` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, |
| 280 | - `streamNoneReaderDelayMS` int NOT NULL, | |
| 281 | 280 | `rtpEnable` int NOT NULL, |
| 282 | 281 | `rtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, |
| 283 | 282 | `sendRtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, | ... | ... |
sql/update.sql
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
| ... | ... | @@ -69,9 +69,6 @@ public class MediaConfig{ |
| 69 | 69 | @Value("${media.secret}") |
| 70 | 70 | private String secret; |
| 71 | 71 | |
| 72 | - @Value("${media.stream-none-reader-delay-ms:15000}") | |
| 73 | - private int streamNoneReaderDelayMS = 15000; | |
| 74 | - | |
| 75 | 72 | @Value("${media.rtp.enable}") |
| 76 | 73 | private boolean rtpEnable; |
| 77 | 74 | |
| ... | ... | @@ -151,10 +148,6 @@ public class MediaConfig{ |
| 151 | 148 | return secret; |
| 152 | 149 | } |
| 153 | 150 | |
| 154 | - public int getStreamNoneReaderDelayMS() { | |
| 155 | - return streamNoneReaderDelayMS; | |
| 156 | - } | |
| 157 | - | |
| 158 | 151 | public boolean isRtpEnable() { |
| 159 | 152 | return rtpEnable; |
| 160 | 153 | } |
| ... | ... | @@ -219,7 +212,6 @@ public class MediaConfig{ |
| 219 | 212 | mediaServerItem.setRtspSSLPort(rtspSSLPort); |
| 220 | 213 | mediaServerItem.setAutoConfig(autoConfig); |
| 221 | 214 | mediaServerItem.setSecret(secret); |
| 222 | - mediaServerItem.setStreamNoneReaderDelayMS(streamNoneReaderDelayMS); | |
| 223 | 215 | mediaServerItem.setRtpEnable(rtpEnable); |
| 224 | 216 | mediaServerItem.setRtpPortRange(rtpPortRange); |
| 225 | 217 | mediaServerItem.setSendRtpPortRange(sendRtpPortRange); | ... | ... |
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
| ... | ... | @@ -33,6 +33,8 @@ public class UserSetting { |
| 33 | 33 | |
| 34 | 34 | private Boolean usePushingAsStatus = Boolean.TRUE; |
| 35 | 35 | |
| 36 | + private Boolean streamOnDemand = Boolean.TRUE; | |
| 37 | + | |
| 36 | 38 | private String serverId = "000000"; |
| 37 | 39 | |
| 38 | 40 | private String thirdPartyGBIdReg = "[\\s\\S]*"; |
| ... | ... | @@ -146,4 +148,12 @@ public class UserSetting { |
| 146 | 148 | public void setUsePushingAsStatus(Boolean usePushingAsStatus) { |
| 147 | 149 | this.usePushingAsStatus = usePushingAsStatus; |
| 148 | 150 | } |
| 151 | + | |
| 152 | + public Boolean getStreamOnDemand() { | |
| 153 | + return streamOnDemand; | |
| 154 | + } | |
| 155 | + | |
| 156 | + public void setStreamOnDemand(Boolean streamOnDemand) { | |
| 157 | + this.streamOnDemand = streamOnDemand; | |
| 158 | + } | |
| 149 | 159 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
| ... | ... | @@ -558,9 +558,12 @@ public class ZLMHttpHookListener { |
| 558 | 558 | String app = json.getString("app"); |
| 559 | 559 | JSONObject ret = new JSONObject(); |
| 560 | 560 | ret.put("code", 0); |
| 561 | + // 录像下载 | |
| 562 | + ret.put("close", userSetting.getStreamOnDemand()); | |
| 561 | 563 | if ("rtp".equals(app)){ |
| 562 | - ret.put("close", true); | |
| 564 | + // 国标流, 点播/录像回放/录像下载 | |
| 563 | 565 | StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(streamId); |
| 566 | + // 点播 | |
| 564 | 567 | if (streamInfoForPlayCatch != null) { |
| 565 | 568 | // 收到无人观看说明流也没有在往上级推送 |
| 566 | 569 | if (redisCatchStorage.isChannelSendingRTP(streamInfoForPlayCatch.getChannelId())) { |
| ... | ... | @@ -590,40 +593,39 @@ public class ZLMHttpHookListener { |
| 590 | 593 | |
| 591 | 594 | redisCatchStorage.stopPlay(streamInfoForPlayCatch); |
| 592 | 595 | storager.stopPlay(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId()); |
| 593 | - }else{ | |
| 594 | - StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, streamId, null); | |
| 595 | - if (streamInfoForPlayBackCatch != null ) { | |
| 596 | - if (streamInfoForPlayBackCatch.isPause()) { | |
| 597 | - ret.put("close", false); | |
| 598 | - }else { | |
| 599 | - Device device = deviceService.queryDevice(streamInfoForPlayBackCatch.getDeviceID()); | |
| 600 | - if (device != null) { | |
| 601 | - try { | |
| 602 | - cmder.streamByeCmd(device,streamInfoForPlayBackCatch.getChannelId(), | |
| 603 | - streamInfoForPlayBackCatch.getStream(), null); | |
| 604 | - } catch (InvalidArgumentException | ParseException | SipException | | |
| 605 | - SsrcTransactionNotFoundException e) { | |
| 606 | - logger.error("[无人观看]回放, 发送BYE失败 {}", e.getMessage()); | |
| 607 | - } | |
| 608 | - } | |
| 609 | - redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch.getDeviceID(), | |
| 610 | - streamInfoForPlayBackCatch.getChannelId(), streamInfoForPlayBackCatch.getStream(), null); | |
| 611 | - } | |
| 612 | - | |
| 596 | + return ret; | |
| 597 | + } | |
| 598 | + // 录像回放 | |
| 599 | + StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, streamId, null); | |
| 600 | + if (streamInfoForPlayBackCatch != null ) { | |
| 601 | + if (streamInfoForPlayBackCatch.isPause()) { | |
| 602 | + ret.put("close", false); | |
| 613 | 603 | }else { |
| 614 | - StreamInfo streamInfoForDownload = redisCatchStorage.queryDownload(null, null, streamId, null); | |
| 615 | - // 进行录像下载时无人观看不断流 | |
| 616 | - if (streamInfoForDownload != null) { | |
| 617 | - ret.put("close", false); | |
| 604 | + Device device = deviceService.queryDevice(streamInfoForPlayBackCatch.getDeviceID()); | |
| 605 | + if (device != null) { | |
| 606 | + try { | |
| 607 | + cmder.streamByeCmd(device,streamInfoForPlayBackCatch.getChannelId(), | |
| 608 | + streamInfoForPlayBackCatch.getStream(), null); | |
| 609 | + } catch (InvalidArgumentException | ParseException | SipException | | |
| 610 | + SsrcTransactionNotFoundException e) { | |
| 611 | + logger.error("[无人观看]回放, 发送BYE失败 {}", e.getMessage()); | |
| 612 | + } | |
| 618 | 613 | } |
| 614 | + redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch.getDeviceID(), | |
| 615 | + streamInfoForPlayBackCatch.getChannelId(), streamInfoForPlayBackCatch.getStream(), null); | |
| 619 | 616 | } |
| 617 | + return ret; | |
| 620 | 618 | } |
| 621 | - MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); | |
| 622 | - if (mediaServerItem != null && mediaServerItem.getStreamNoneReaderDelayMS() == -1) { | |
| 619 | + // 录像下载 | |
| 620 | + StreamInfo streamInfoForDownload = redisCatchStorage.queryDownload(null, null, streamId, null); | |
| 621 | + // 进行录像下载时无人观看不断流 | |
| 622 | + if (streamInfoForDownload != null) { | |
| 623 | 623 | ret.put("close", false); |
| 624 | + return ret; | |
| 624 | 625 | } |
| 625 | - return ret; | |
| 626 | 626 | }else { |
| 627 | + // 非国标流 推流/拉流代理 | |
| 628 | + // 拉流代理 | |
| 627 | 629 | StreamProxyItem streamProxyItem = streamProxyService.getStreamProxyByAppAndStream(app, streamId); |
| 628 | 630 | if (streamProxyItem != null ) { |
| 629 | 631 | if (streamProxyItem.isEnable_remove_none_reader()) { |
| ... | ... | @@ -635,12 +637,21 @@ public class ZLMHttpHookListener { |
| 635 | 637 | }else if (streamProxyItem.isEnable_disable_none_reader()) { |
| 636 | 638 | // 无人观看停用 |
| 637 | 639 | ret.put("close", true); |
| 640 | + // 修改数据 | |
| 641 | + streamProxyService.stop(app, streamId); | |
| 638 | 642 | }else { |
| 639 | 643 | ret.put("close", false); |
| 640 | 644 | } |
| 645 | + return ret; | |
| 641 | 646 | } |
| 642 | - return ret; | |
| 647 | + // 推流具有主动性,暂时不做处理 | |
| 648 | +// StreamPushItem streamPushItem = streamPushService.getPush(app, streamId); | |
| 649 | +// if (streamPushItem != null) { | |
| 650 | +// // TODO 发送停止 | |
| 651 | +// | |
| 652 | +// } | |
| 643 | 653 | } |
| 654 | + return ret; | |
| 644 | 655 | } |
| 645 | 656 | |
| 646 | 657 | /** |
| ... | ... | @@ -655,19 +666,27 @@ public class ZLMHttpHookListener { |
| 655 | 666 | } |
| 656 | 667 | String mediaServerId = json.getString("mediaServerId"); |
| 657 | 668 | MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); |
| 658 | - if (userSetting.isAutoApplyPlay() && mediaInfo != null && mediaInfo.isRtpEnable()) { | |
| 669 | + if (userSetting.isAutoApplyPlay() && mediaInfo != null) { | |
| 659 | 670 | String app = json.getString("app"); |
| 660 | 671 | String streamId = json.getString("stream"); |
| 661 | 672 | if ("rtp".equals(app)) { |
| 662 | - String[] s = streamId.split("_"); | |
| 663 | - if (s.length == 2) { | |
| 664 | - String deviceId = s[0]; | |
| 665 | - String channelId = s[1]; | |
| 666 | - Device device = redisCatchStorage.getDevice(deviceId); | |
| 667 | - if (device != null) { | |
| 668 | - playService.play(mediaInfo,deviceId, channelId, null, null, null); | |
| 673 | + if (mediaInfo.isRtpEnable()) { | |
| 674 | + String[] s = streamId.split("_"); | |
| 675 | + if (s.length == 2) { | |
| 676 | + String deviceId = s[0]; | |
| 677 | + String channelId = s[1]; | |
| 678 | + Device device = redisCatchStorage.getDevice(deviceId); | |
| 679 | + if (device != null) { | |
| 680 | + playService.play(mediaInfo,deviceId, channelId, null, null, null); | |
| 681 | + } | |
| 669 | 682 | } |
| 670 | 683 | } |
| 684 | + }else { | |
| 685 | + // 拉流代理 | |
| 686 | + StreamProxyItem streamProxyByAppAndStream = streamProxyService.getStreamProxyByAppAndStream(app, streamId); | |
| 687 | + if (streamProxyByAppAndStream != null && streamProxyByAppAndStream.isEnable_disable_none_reader()) { | |
| 688 | + streamProxyService.start(app, streamId); | |
| 689 | + } | |
| 671 | 690 | } |
| 672 | 691 | } |
| 673 | 692 | ... | ... |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java
| ... | ... | @@ -54,9 +54,6 @@ public class MediaServerItem{ |
| 54 | 54 | @Schema(description = "ZLM鉴权参数") |
| 55 | 55 | private String secret; |
| 56 | 56 | |
| 57 | - @Schema(description = "某个流无人观看时,触发hook.on_stream_none_reader事件的最大等待时间,单位毫秒") | |
| 58 | - private int streamNoneReaderDelayMS; | |
| 59 | - | |
| 60 | 57 | @Schema(description = "keepalive hook触发间隔,单位秒") |
| 61 | 58 | private int hookAliveInterval; |
| 62 | 59 | |
| ... | ... | @@ -119,7 +116,6 @@ public class MediaServerItem{ |
| 119 | 116 | rtspSSLPort = zlmServerConfig.getRtspSSlport(); |
| 120 | 117 | autoConfig = true; // 默认值true; |
| 121 | 118 | secret = zlmServerConfig.getApiSecret(); |
| 122 | - streamNoneReaderDelayMS = zlmServerConfig.getGeneralStreamNoneReaderDelayMS(); | |
| 123 | 119 | hookAliveInterval = zlmServerConfig.getHookAliveInterval(); |
| 124 | 120 | rtpEnable = false; // 默认使用单端口;直到用户自己设置开启多端口 |
| 125 | 121 | rtpPortRange = zlmServerConfig.getPortRange().replace("_",","); // 默认使用30000,30500作为级联时发送流的端口号 |
| ... | ... | @@ -240,14 +236,6 @@ public class MediaServerItem{ |
| 240 | 236 | this.secret = secret; |
| 241 | 237 | } |
| 242 | 238 | |
| 243 | - public int getStreamNoneReaderDelayMS() { | |
| 244 | - return streamNoneReaderDelayMS; | |
| 245 | - } | |
| 246 | - | |
| 247 | - public void setStreamNoneReaderDelayMS(int streamNoneReaderDelayMS) { | |
| 248 | - this.streamNoneReaderDelayMS = streamNoneReaderDelayMS; | |
| 249 | - } | |
| 250 | - | |
| 251 | 239 | public boolean isRtpEnable() { |
| 252 | 240 | return rtpEnable; |
| 253 | 241 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java
| ... | ... | @@ -38,7 +38,7 @@ public class StreamProxyItem extends GbStream { |
| 38 | 38 | @Schema(description = "是否 无人观看时删除") |
| 39 | 39 | private boolean enable_remove_none_reader; |
| 40 | 40 | |
| 41 | - @Schema(description = "是否 无人观看时不启用") | |
| 41 | + @Schema(description = "是否 无人观看时自动停用") | |
| 42 | 42 | private boolean enable_disable_none_reader; |
| 43 | 43 | @Schema(description = "上级平台国标ID") |
| 44 | 44 | private String platformGbId; | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
| ... | ... | @@ -541,7 +541,6 @@ public class MediaServerServiceImpl implements IMediaServerService { |
| 541 | 541 | param.put("hook.on_record_mp4",""); |
| 542 | 542 | } |
| 543 | 543 | param.put("hook.timeoutSec","20"); |
| 544 | - param.put("general.streamNoneReaderDelayMS",mediaServerItem.getStreamNoneReaderDelayMS()==-1?"3600000":mediaServerItem.getStreamNoneReaderDelayMS() ); | |
| 545 | 544 | // 推流断开后可以在超时时间内重新连接上继续推流,这样播放器会接着播放。 |
| 546 | 545 | // 置0关闭此特性(推流断开会导致立即断开播放器) |
| 547 | 546 | // 此参数不应大于播放器超时时间 |
| ... | ... | @@ -606,7 +605,6 @@ public class MediaServerServiceImpl implements IMediaServerService { |
| 606 | 605 | mediaServerItem.setStreamIp(ip); |
| 607 | 606 | mediaServerItem.setHookIp(sipConfig.getIp()); |
| 608 | 607 | mediaServerItem.setSdpIp(ip); |
| 609 | - mediaServerItem.setStreamNoneReaderDelayMS(zlmServerConfig.getGeneralStreamNoneReaderDelayMS()); | |
| 610 | 608 | return mediaServerItem; |
| 611 | 609 | } |
| 612 | 610 | ... | ... |
src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java
| ... | ... | @@ -26,7 +26,6 @@ public interface MediaServerMapper { |
| 26 | 26 | "rtspSSLPort, " + |
| 27 | 27 | "autoConfig, " + |
| 28 | 28 | "secret, " + |
| 29 | - "streamNoneReaderDelayMS, " + | |
| 30 | 29 | "rtpEnable, " + |
| 31 | 30 | "rtpPortRange, " + |
| 32 | 31 | "sendRtpPortRange, " + |
| ... | ... | @@ -51,7 +50,6 @@ public interface MediaServerMapper { |
| 51 | 50 | "${rtspSSLPort}, " + |
| 52 | 51 | "${autoConfig}, " + |
| 53 | 52 | "'${secret}', " + |
| 54 | - "${streamNoneReaderDelayMS}, " + | |
| 55 | 53 | "${rtpEnable}, " + |
| 56 | 54 | "'${rtpPortRange}', " + |
| 57 | 55 | "'${sendRtpPortRange}', " + |
| ... | ... | @@ -77,7 +75,6 @@ public interface MediaServerMapper { |
| 77 | 75 | "<if test=\"rtspPort != null\">, rtspPort=${rtspPort}</if>" + |
| 78 | 76 | "<if test=\"rtspSSLPort != null\">, rtspSSLPort=${rtspSSLPort}</if>" + |
| 79 | 77 | "<if test=\"autoConfig != null\">, autoConfig=${autoConfig}</if>" + |
| 80 | - "<if test=\"streamNoneReaderDelayMS != null\">, streamNoneReaderDelayMS=${streamNoneReaderDelayMS}</if>" + | |
| 81 | 78 | "<if test=\"rtpEnable != null\">, rtpEnable=${rtpEnable}</if>" + |
| 82 | 79 | "<if test=\"rtpPortRange != null\">, rtpPortRange='${rtpPortRange}'</if>" + |
| 83 | 80 | "<if test=\"sendRtpPortRange != null\">, sendRtpPortRange='${sendRtpPortRange}'</if>" + |
| ... | ... | @@ -102,7 +99,6 @@ public interface MediaServerMapper { |
| 102 | 99 | "<if test=\"rtspPort != null\">, rtspPort=${rtspPort}</if>" + |
| 103 | 100 | "<if test=\"rtspSSLPort != null\">, rtspSSLPort=${rtspSSLPort}</if>" + |
| 104 | 101 | "<if test=\"autoConfig != null\">, autoConfig=${autoConfig}</if>" + |
| 105 | - "<if test=\"streamNoneReaderDelayMS != null\">, streamNoneReaderDelayMS=${streamNoneReaderDelayMS}</if>" + | |
| 106 | 102 | "<if test=\"rtpEnable != null\">, rtpEnable=${rtpEnable}</if>" + |
| 107 | 103 | "<if test=\"rtpPortRange != null\">, rtpPortRange='${rtpPortRange}'</if>" + |
| 108 | 104 | "<if test=\"sendRtpPortRange != null\">, sendRtpPortRange='${sendRtpPortRange}'</if>" + | ... | ... |
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java
| ... | ... | @@ -11,10 +11,10 @@ import java.util.List; |
| 11 | 11 | public interface StreamProxyMapper { |
| 12 | 12 | |
| 13 | 13 | @Insert("INSERT INTO stream_proxy (type, name, app, stream,mediaServerId, url, src_url, dst_url, " + |
| 14 | - "timeout_ms, ffmpeg_cmd_key, rtp_type, enable_hls, enable_mp4, enable, status, enable_remove_none_reader, createTime) VALUES" + | |
| 14 | + "timeout_ms, ffmpeg_cmd_key, rtp_type, enable_hls, enable_mp4, enable, status, enable_remove_none_reader, enable_disable_none_reader, createTime) VALUES" + | |
| 15 | 15 | "('${type}','${name}', '${app}', '${stream}', '${mediaServerId}','${url}', '${src_url}', '${dst_url}', " + |
| 16 | 16 | "'${timeout_ms}', '${ffmpeg_cmd_key}', '${rtp_type}', ${enable_hls}, ${enable_mp4}, ${enable}, ${status}, " + |
| 17 | - "${enable_remove_none_reader}, '${createTime}' )") | |
| 17 | + "${enable_remove_none_reader}, ${enable_disable_none_reader}, '${createTime}' )") | |
| 18 | 18 | int add(StreamProxyItem streamProxyDto); |
| 19 | 19 | |
| 20 | 20 | @Update("UPDATE stream_proxy " + |
| ... | ... | @@ -33,6 +33,7 @@ public interface StreamProxyMapper { |
| 33 | 33 | "enable=#{enable}, " + |
| 34 | 34 | "status=#{status}, " + |
| 35 | 35 | "enable_remove_none_reader=#{enable_remove_none_reader}, " + |
| 36 | + "enable_disable_none_reader=#{enable_disable_none_reader}, " + | |
| 36 | 37 | "enable_mp4=#{enable_mp4} " + |
| 37 | 38 | "WHERE app=#{app} AND stream=#{stream}") |
| 38 | 39 | int update(StreamProxyItem streamProxyDto); | ... | ... |
src/main/resources/all-application.yml
| ... | ... | @@ -146,8 +146,6 @@ media: |
| 146 | 146 | auto-config: true |
| 147 | 147 | # [可选] zlm服务器的hook.admin_params=secret |
| 148 | 148 | secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc |
| 149 | - # [可选] zlm服务器的general.streamNoneReaderDelayMS | |
| 150 | - stream-none-reader-delay-ms: 18000 # 无人观看多久自动关闭流, -1表示永不自动关闭,即 关闭按需拉流 | |
| 151 | 149 | # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试 |
| 152 | 150 | rtp: |
| 153 | 151 | # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输 |
| ... | ... | @@ -190,6 +188,8 @@ user-settings: |
| 190 | 188 | logInDatebase: true |
| 191 | 189 | # 使用推流状态作为推流通道状态 |
| 192 | 190 | use-pushing-as-status: true |
| 191 | + # 按需拉流, true:有人观看拉流,无人观看释放, false:拉起后不自动释放 | |
| 192 | + stream-on-demand: true | |
| 193 | 193 | |
| 194 | 194 | # 关闭在线文档(生产环境建议关闭) |
| 195 | 195 | springdoc: | ... | ... |
web_src/src/components/dialog/MediaServerEdit.vue
| ... | ... | @@ -41,10 +41,6 @@ |
| 41 | 41 | <el-input v-if="currentStep === 2" v-model="mediaServerForm.httpPort" disabled :disabled="mediaServerForm.defaultServer"></el-input> |
| 42 | 42 | <el-input v-if="currentStep === 3" v-model="mediaServerForm.httpPort" :disabled="mediaServerForm.defaultServer"></el-input> |
| 43 | 43 | </el-form-item> |
| 44 | - <el-form-item label="SECRET" prop="secret"> | |
| 45 | - <el-input v-if="currentStep === 2" v-model="mediaServerForm.secret" disabled :disabled="mediaServerForm.defaultServer"></el-input> | |
| 46 | - <el-input v-if="currentStep === 3" v-model="mediaServerForm.secret" :disabled="mediaServerForm.defaultServer"></el-input> | |
| 47 | - </el-form-item> | |
| 48 | 44 | <el-form-item label="HOOK IP" prop="ip"> |
| 49 | 45 | <el-input v-model="mediaServerForm.hookIp" placeholder="媒体服务HOOK_IP" clearable :disabled="mediaServerForm.defaultServer"></el-input> |
| 50 | 46 | </el-form-item> |
| ... | ... | @@ -74,6 +70,10 @@ |
| 74 | 70 | <el-form-item label="RTMPS PORT" prop="rtmpSSlPort"> |
| 75 | 71 | <el-input v-model="mediaServerForm.rtmpSSlPort" placeholder="媒体服务RTMPS_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input> |
| 76 | 72 | </el-form-item> |
| 73 | + <el-form-item label="SECRET" prop="secret"> | |
| 74 | + <el-input v-if="currentStep === 2" v-model="mediaServerForm.secret" disabled :disabled="mediaServerForm.defaultServer"></el-input> | |
| 75 | + <el-input v-if="currentStep === 3" v-model="mediaServerForm.secret" :disabled="mediaServerForm.defaultServer"></el-input> | |
| 76 | + </el-form-item> | |
| 77 | 77 | <el-form-item label="自动配置媒体服务" > |
| 78 | 78 | <el-switch v-model="mediaServerForm.autoConfig" :disabled="mediaServerForm.defaultServer"></el-switch> |
| 79 | 79 | </el-form-item> |
| ... | ... | @@ -94,9 +94,6 @@ |
| 94 | 94 | - |
| 95 | 95 | <el-input v-model="sendRtpPortRange2" placeholder="终止" @change="portRangeChange" clearable style="width: 100px" prop="sendRtpPortRange2" :disabled="mediaServerForm.defaultServer"></el-input> |
| 96 | 96 | </el-form-item> |
| 97 | - <el-form-item label="无人观看多久后停止拉流" > | |
| 98 | - <el-input v-model.number="mediaServerForm.streamNoneReaderDelayMS" clearable :disabled="mediaServerForm.defaultServer"></el-input> | |
| 99 | - </el-form-item> | |
| 100 | 97 | <el-form-item label="录像管理服务端口" prop="recordAssistPort"> |
| 101 | 98 | <el-input v-model.number="mediaServerForm.recordAssistPort" :disabled="mediaServerForm.defaultServer"> |
| 102 | 99 | <!-- <el-button v-if="mediaServerForm.recordAssistPort > 0" slot="append" type="primary" @click="checkRecordServer">测试</el-button>--> |
| ... | ... | @@ -172,7 +169,6 @@ export default { |
| 172 | 169 | hookIp: "", |
| 173 | 170 | sdpIp: "", |
| 174 | 171 | streamIp: "", |
| 175 | - streamNoneReaderDelayMS: "", | |
| 176 | 172 | secret: "035c73f7-bb6b-4889-a715-d9eb2d1925cc", |
| 177 | 173 | httpPort: "", |
| 178 | 174 | httpSSlPort: "", |
| ... | ... | @@ -332,7 +328,6 @@ export default { |
| 332 | 328 | hookIp: "", |
| 333 | 329 | sdpIp: "", |
| 334 | 330 | streamIp: "", |
| 335 | - streamNoneReaderDelayMS: "", | |
| 336 | 331 | secret: "035c73f7-bb6b-4889-a715-d9eb2d1925cc", |
| 337 | 332 | httpPort: "", |
| 338 | 333 | httpSSlPort: "", | ... | ... |
web_src/src/components/dialog/StreamProxyEdit.vue
| ... | ... | @@ -105,7 +105,9 @@ |
| 105 | 105 | <el-checkbox label="启用" v-model="proxyParam.enable" ></el-checkbox> |
| 106 | 106 | <el-checkbox label="转HLS" v-model="proxyParam.enable_hls" ></el-checkbox> |
| 107 | 107 | <el-checkbox label="MP4录制" v-model="proxyParam.enable_mp4" ></el-checkbox> |
| 108 | - <el-checkbox label="无人观看自动删除" v-model="proxyParam.enable_remove_none_reader" ></el-checkbox> | |
| 108 | + <el-checkbox label="无人观看自动删除" v-model="proxyParam.enable_remove_none_reader" @change="removeNoneReader"></el-checkbox> | |
| 109 | + <el-checkbox label="无人观看停止拉流" v-model="proxyParam.enable_disable_none_reader" @change="disableNoneReaderHandType"></el-checkbox> | |
| 110 | + | |
| 109 | 111 | </div> |
| 110 | 112 | |
| 111 | 113 | </el-form-item> |
| ... | ... | @@ -170,6 +172,7 @@ export default { |
| 170 | 172 | enable_hls: true, |
| 171 | 173 | enable_mp4: false, |
| 172 | 174 | enable_remove_none_reader: false, |
| 175 | + enable_disable_none_reader: true, | |
| 173 | 176 | platformGbId: null, |
| 174 | 177 | mediaServerId: null, |
| 175 | 178 | }, |
| ... | ... | @@ -276,6 +279,12 @@ export default { |
| 276 | 279 | if (this.platform.enable && this.platform.expires == "0") { |
| 277 | 280 | this.platform.expires = "300"; |
| 278 | 281 | } |
| 282 | + }, | |
| 283 | + removeNoneReader: function(checked) { | |
| 284 | + this.proxyParam.enable_disable_none_reader = !checked; | |
| 285 | + }, | |
| 286 | + disableNoneReaderHandType: function(checked) { | |
| 287 | + this.proxyParam.enable_remove_none_reader = !checked; | |
| 279 | 288 | } |
| 280 | 289 | }, |
| 281 | 290 | }; | ... | ... |
web_src/src/components/setting/Media.vue
| ... | ... | @@ -42,9 +42,6 @@ |
| 42 | 42 | <el-form-item label="接口密钥" prop="secret"> |
| 43 | 43 | <el-input v-model="form.secret" clearable></el-input> |
| 44 | 44 | </el-form-item> |
| 45 | - <el-form-item label="无人观看触发时长"> | |
| 46 | - <el-input v-model.number="form.streamNoneReaderDelayMS" clearable></el-input> | |
| 47 | - </el-form-item> | |
| 48 | 45 | <el-form-item label="自动配置"> |
| 49 | 46 | <el-switch v-model="form.autoConfig"></el-switch> |
| 50 | 47 | </el-form-item> | ... | ... |