修复非默认媒体节点状态异常

This commit is contained in:
lin
2026-01-04 15:20:55 +08:00
parent 3c4cc4c98e
commit ae44feef5b
5 changed files with 37 additions and 24 deletions

View File

@@ -339,23 +339,23 @@ public class MediaServerServiceImpl implements IMediaServerService {
} }
@Override @Override
public void update(MediaServer mediaSerItem) { public void update(MediaServer mediaServer) {
if (mediaServerMapper.queryOne(mediaSerItem.getId(), userSetting.getServerId()) != null) { if (mediaServerMapper.queryOne(mediaServer.getId()) != null) {
mediaServerMapper.update(mediaSerItem); mediaServerMapper.update(mediaServer);
}else { }else {
mediaServerMapper.add(mediaSerItem); mediaServerMapper.add(mediaServer);
} }
MediaServer mediaServerInRedis = getOne(mediaSerItem.getId()); MediaServer mediaServerInRedis = getOne(mediaServer.getId());
if (mediaServerInRedis == null || !ssrcFactory.hasMediaServerSSRC(mediaSerItem.getId())) { if (mediaServerInRedis == null || !ssrcFactory.hasMediaServerSSRC(mediaServer.getId())) {
ssrcFactory.initMediaServerSSRC(mediaSerItem.getId(),null); ssrcFactory.initMediaServerSSRC(mediaServer.getId(),null);
} }
String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId(); String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId();
redisTemplate.opsForHash().put(key, mediaSerItem.getId(), mediaSerItem); redisTemplate.opsForHash().put(key, mediaServer.getId(), mediaServer);
if (mediaSerItem.isStatus()) { if (mediaServer.isStatus()) {
resetOnlineServerItem(mediaSerItem); resetOnlineServerItem(mediaServer);
} }
} }
@@ -441,7 +441,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
MediaServer mediaServer = (MediaServer) redisTemplate.opsForHash().get(key, mediaServerId); MediaServer mediaServer = (MediaServer) redisTemplate.opsForHash().get(key, mediaServerId);
if (mediaServer == null) { if (mediaServer == null) {
// 尝试从数据库获取 // 尝试从数据库获取
mediaServer = mediaServerMapper.queryOne(mediaServerId, userSetting.getServerId()); mediaServer = mediaServerMapper.queryOneWithServerId(mediaServerId, userSetting.getServerId());
if (mediaServer != null) { if (mediaServer != null) {
redisTemplate.opsForHash().put(key, mediaServer.getId(), mediaServer); redisTemplate.opsForHash().put(key, mediaServer.getId(), mediaServer);
} }
@@ -488,7 +488,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
log.info("[添加媒体节点] 失败, mediaServer的类型为空"); log.info("[添加媒体节点] 失败, mediaServer的类型为空");
return; return;
} }
if (mediaServerMapper.queryOne(mediaServer.getId(), userSetting.getServerId()) != null) { if (mediaServerMapper.queryOne(mediaServer.getId()) != null) {
log.info("[添加媒体节点] 失败, 媒体服务ID已存在请修改媒体服务器配置, {}", mediaServer.getId()); log.info("[添加媒体节点] 失败, 媒体服务ID已存在请修改媒体服务器配置, {}", mediaServer.getId());
throw new ControllerException(ErrorCode.ERROR100.getCode(),"保存失败媒体服务ID [ " + mediaServer.getId() + " ] 已存在,请修改媒体服务器配置"); throw new ControllerException(ErrorCode.ERROR100.getCode(),"保存失败媒体服务ID [ " + mediaServer.getId() + " ] 已存在,请修改媒体服务器配置");
} }
@@ -597,7 +597,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
} }
MediaServer mediaServer = mediaNodeServerService.checkMediaServer(ip, port, secret); MediaServer mediaServer = mediaNodeServerService.checkMediaServer(ip, port, secret);
if (mediaServer != null) { if (mediaServer != null) {
if (mediaServerMapper.queryOne(mediaServer.getId(), userSetting.getServerId()) != null) { if (mediaServerMapper.queryOne(mediaServer.getId()) != null) {
throw new ControllerException(ErrorCode.ERROR100.getCode(), "媒体服务ID [" + mediaServer.getId() + " ] 已存在,请修改媒体服务器配置"); throw new ControllerException(ErrorCode.ERROR100.getCode(), "媒体服务ID [" + mediaServer.getId() + " ] 已存在,请修改媒体服务器配置");
} }
} }
@@ -637,7 +637,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
@Override @Override
public MediaServer getOneFromDatabase(String mediaServerId) { public MediaServer getOneFromDatabase(String mediaServerId) {
return mediaServerMapper.queryOne(mediaServerId, userSetting.getServerId()); return mediaServerMapper.queryOne(mediaServerId);
} }
@Override @Override

View File

@@ -180,8 +180,8 @@ public class ZLMMediaServerStatusManager {
} }
private void online(MediaServer mediaServer, ZLMServerConfig config) { private void online(MediaServer mediaServer, ZLMServerConfig config) {
MediaServer mediaServerInDb = mediaServerService.getOneFromDatabase(mediaServer.getId()); MediaServer mediaServerInDb = mediaServerService.getOne(mediaServer.getId());
if (mediaServerInDb == null || mediaServerService.getOne(mediaServer.getId()) == null) { if (mediaServerInDb == null || !mediaServerInDb.isStatus()) {
log.info("[ZLM-连接成功] ID{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort()); log.info("[ZLM-连接成功] ID{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort());
if (config == null) { if (config == null) {
ZLMResult<List<JSONObject>> mediaServerConfig = zlmresTfulUtils.getMediaServerConfig(mediaServer); ZLMResult<List<JSONObject>> mediaServerConfig = zlmresTfulUtils.getMediaServerConfig(mediaServer);
@@ -200,7 +200,7 @@ public class ZLMMediaServerStatusManager {
mediaServer.setHookAliveInterval(config.getHookAliveInterval()); mediaServer.setHookAliveInterval(config.getHookAliveInterval());
initPort(mediaServer, config); initPort(mediaServer, config);
mediaServerService.update(mediaServer); mediaServerService.update(mediaServer);
setZLMConfig(mediaServer, true); setZLMConfig(mediaServer, false);
} }
offlineZlmPrimaryMap.remove(mediaServer.getId()); offlineZlmPrimaryMap.remove(mediaServer.getId());
offlineZlmsecondaryMap.remove(mediaServer.getId()); offlineZlmsecondaryMap.remove(mediaServer.getId());
@@ -233,7 +233,7 @@ public class ZLMMediaServerStatusManager {
mediaServerItem.setTranscodeSuffix(zlmServerConfig.getTranscodeSuffix()); mediaServerItem.setTranscodeSuffix(zlmServerConfig.getTranscodeSuffix());
} }
mediaServerItem.setRtpProxyPort(zlmServerConfig.getRtpProxyPort()); mediaServerItem.setRtpProxyPort(zlmServerConfig.getRtpProxyPort());
mediaServerItem.setHookAliveInterval(10F); mediaServerItem.setHookAliveInterval(zlmServerConfig.getHookAliveInterval());
} }
public void setZLMConfig(MediaServer mediaServerItem, boolean restart) { public void setZLMConfig(MediaServer mediaServerItem, boolean restart) {
@@ -264,7 +264,6 @@ public class ZLMMediaServerStatusManager {
param.put("hook.on_rtp_server_timeout",String.format("%s/on_rtp_server_timeout", hookPrefix)); param.put("hook.on_rtp_server_timeout",String.format("%s/on_rtp_server_timeout", hookPrefix));
param.put("hook.on_record_mp4",String.format("%s/on_record_mp4", hookPrefix)); param.put("hook.on_record_mp4",String.format("%s/on_record_mp4", hookPrefix));
param.put("hook.timeoutSec","30"); param.put("hook.timeoutSec","30");
param.put("hook.alive_interval", mediaServerItem.getHookAliveInterval());
// 推流断开后可以在超时时间内重新连接上继续推流,这样播放器会接着播放。 // 推流断开后可以在超时时间内重新连接上继续推流,这样播放器会接着播放。
// 置0关闭此特性(推流断开会导致立即断开播放器) // 置0关闭此特性(推流断开会导致立即断开播放器)
// 此参数不应大于播放器超时时间 // 此参数不应大于播放器超时时间

View File

@@ -134,8 +134,11 @@ public interface MediaServerMapper {
" </script>"}) " </script>"})
int updateByHostAndPort(MediaServer mediaServerItem); int updateByHostAndPort(MediaServer mediaServerItem);
@Select("SELECT * FROM wvp_media_server WHERE id=#{id}")
MediaServer queryOne(@Param("id") String id);
@Select("SELECT * FROM wvp_media_server WHERE id=#{id} and server_id = #{serverId}") @Select("SELECT * FROM wvp_media_server WHERE id=#{id} and server_id = #{serverId}")
MediaServer queryOne(@Param("id") String id, @Param("serverId") String serverId); MediaServer queryOneWithServerId(@Param("id") String id, @Param("serverId") String serverId);
@Select("SELECT * FROM wvp_media_server where server_id = #{serverId}") @Select("SELECT * FROM wvp_media_server where server_id = #{serverId}")
List<MediaServer> queryAll(@Param("serverId") String serverId); List<MediaServer> queryAll(@Param("serverId") String serverId);

View File

@@ -257,6 +257,13 @@ export default {
this.sendRtpPortRange2 = 60000 this.sendRtpPortRange2 = 60000
this.serverCheck = 1 this.serverCheck = 1
}) })
.catch(() => {
this.$message({
showClose: true,
message: '测试失败,请检查媒体服务地址及端口是否正确!',
type: 'warning'
})
})
}, },
next: function() { next: function() {
this.currentStep = 2 this.currentStep = 2

View File

@@ -10,9 +10,12 @@
<div v-if="item.type === 'abl'" class="card-img-abl" /> <div v-if="item.type === 'abl'" class="card-img-abl" />
<div style="padding: 14px;text-align: left"> <div style="padding: 14px;text-align: left">
<span style="font-size: 16px">{{ item.id }}</span> <span style="font-size: 16px">{{ item.id }}</span>
<el-button v-if="!item.defaultServer" icon="el-icon-edit" style="padding: 0;float: right;" type="text" @click="edit(item)">编辑</el-button> <div style="float: right">
<el-button v-if="item.defaultServer" icon="el-icon-edit" style="padding: 0;float: right;" type="text" @click="edit(item)">查看</el-button> <el-button v-if="!item.defaultServer" icon="el-icon-delete" circle size="mini" @click="del(item)"></el-button>
<el-button v-if="!item.defaultServer" icon="el-icon-delete" style="margin-right: 10px;padding: 0;float: right;" type="text" @click="del(item)">移除</el-button> <el-button v-if="!item.defaultServer" icon="el-icon-edit" circle size="mini" @click="edit(item)"></el-button>
<el-button v-if="item.defaultServer" icon="el-icon-edit" circle size="mini" @click="edit(item)"></el-button>
</div>
<div style="margin-top: 13px; line-height: 12px; "> <div style="margin-top: 13px; line-height: 12px; ">
<span style="font-size: 14px; color: #999; margin-top: 5px; ">{{ item.ip }}</span> <span style="font-size: 14px; color: #999; margin-top: 5px; ">{{ item.ip }}</span>
<span style="font-size: 14px; color: #999; margin-top: 5px; float: right;">{{ item.createTime }}</span> <span style="font-size: 14px; color: #999; margin-top: 5px; float: right;">{{ item.createTime }}</span>
@@ -87,6 +90,7 @@ export default {
type: 'success', type: 'success',
message: '删除成功!' message: '删除成功!'
}) })
this.getServerList()
}) })
}).catch(() => { }).catch(() => {
}) })
@@ -94,7 +98,7 @@ export default {
getNumberByWidth() { getNumberByWidth() {
const candidateNums = [1, 2, 3, 4, 6, 8, 12, 24] const candidateNums = [1, 2, 3, 4, 6, 8, 12, 24]
const clientWidth = window.innerWidth - 30 const clientWidth = window.innerWidth - 30
const interval = 20 const interval = 40
const itemWidth = 360 const itemWidth = 360
const num = (clientWidth + interval) / (itemWidth + interval) const num = (clientWidth + interval) / (itemWidth + interval)
const result = Math.ceil(24 / num) const result = Math.ceil(24 / num)