[1078] 支持无人观看自动停流

This commit is contained in:
lin
2025-07-15 18:11:23 +08:00
parent be04660de8
commit 44ed06bcbe
7 changed files with 29 additions and 28 deletions

View File

@@ -234,8 +234,6 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
return;
}
// 设置超时监听
dynamicTask.startDelay(playKey, () -> {
log.info("[JT-点播] 超时, phoneNumber {} channelId {}", phoneNumber, channelId);
@@ -382,7 +380,8 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
}
String app = "1078";
String stream = phoneNumber + "_" + channelId;
String stream = String.format("%s_%s_%s_%s", phoneNumber, channelId,
DateUtil.yyyy_MM_dd_HH_mm_ssToUrl(startTime), DateUtil.yyyy_MM_dd_HH_mm_ssToUrl(endTime));
MediaServer mediaServer = mediaServerService.getMediaServerForMinimumLoad(null);
if (mediaServer == null) {
for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {

View File

@@ -100,15 +100,12 @@ public class jt1078ServiceImpl implements Ijt1078Service {
*/
@Override
public JTMediaStreamType checkStreamFromJt(String stream) {
if (!stream.startsWith("jt_")) {
return null;
}
String[] streamParamArray = stream.split("_");
if (streamParamArray.length == 3) {
if (streamParamArray.length == 2) {
return JTMediaStreamType.PLAY;
}else if (streamParamArray.length == 5) {
return JTMediaStreamType.PLAYBACK;
}else if (streamParamArray.length == 4) {
return JTMediaStreamType.PLAYBACK;
}else if (streamParamArray.length == 5) {
return JTMediaStreamType.TALK;
}else {
return null;

View File

@@ -249,7 +249,7 @@ public class ABLHttpHookListener {
@PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8")
public JSONObject onStreamNoneReader(@RequestBody ABLHookParam param) {
logger.info("[ZLM HOOK]流无人观看:{}->{}/{}", param.getMediaServerId(),
logger.info("[ABL HOOK]流无人观看:{}->{}/{}", param.getMediaServerId(),
param.getApp(), param.getStream());
JSONObject ret = new JSONObject();

View File

@@ -38,7 +38,7 @@ public class ZLMMediaNodeServerService implements IMediaNodeServerService {
@Override
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, disableAudio, reUsePort, tcpMode);
return zlmServerFactory.createRTPServer(mediaServer, "rtp", streamId, ssrc, port, onlyAuto, disableAudio, reUsePort, tcpMode);
}
@Override
@@ -48,7 +48,7 @@ public class ZLMMediaNodeServerService implements IMediaNodeServerService {
@Override
public int createJTTServer(MediaServer mediaServer, String streamId, Integer port, Boolean disableVideo, Boolean disableAudio, Integer tcpMode) {
return zlmServerFactory.createRTPServer(mediaServer, streamId, 0, port, disableVideo, disableAudio, false, tcpMode);
return zlmServerFactory.createRTPServer(mediaServer, "1078", streamId, 0, port, disableVideo, disableAudio, false, tcpMode);
}
@Override

View File

@@ -28,7 +28,7 @@ public class ZLMServerFactory {
* @param tcpMode 0/null udp 模式1 tcp 被动模式, 2 tcp 主动模式。
* @return
*/
public int createRTPServer(MediaServer mediaServerItem, String streamId, long ssrc, Integer port, Boolean onlyAuto, Boolean disableAudio, Boolean reUsePort, Integer tcpMode) {
public int createRTPServer(MediaServer mediaServerItem, String app, String streamId, long ssrc, Integer port, Boolean onlyAuto, Boolean disableAudio, Boolean reUsePort, Integer tcpMode) {
int result = -1;
// 查询此rtp server 是否已经存在
JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, streamId);
@@ -43,7 +43,7 @@ public class ZLMServerFactory {
JSONObject jsonObject = zlmresTfulUtils.closeRtpServer(mediaServerItem, param);
if (jsonObject != null ) {
if (jsonObject.getInteger("code") == 0) {
return createRTPServer(mediaServerItem, streamId, ssrc, port,onlyAuto, reUsePort,disableAudio, tcpMode);
return createRTPServer(mediaServerItem, streamId, app, ssrc, port,onlyAuto, reUsePort,disableAudio, tcpMode);
}else {
log.warn("[开启rtpServer], 重启RtpServer错误");
}
@@ -61,6 +61,7 @@ public class ZLMServerFactory {
tcpMode = 0;
}
param.put("tcp_mode", tcpMode);
param.put("app", app);
param.put("stream_id", streamId);
if (disableAudio != null) {
param.put("only_track", disableAudio?2:0);

View File

@@ -251,21 +251,21 @@ public class MediaServiceImpl implements IMediaService {
}
}
return result;
}else {
// 判断是否是1078点播
JTMediaStreamType jtMediaStreamType = ijt1078Service.checkStreamFromJt(stream);
if (jtMediaStreamType != null) {
String[] streamParamArray = stream.split("_");
if (jtMediaStreamType.equals(JTMediaStreamType.PLAY)) {
jt1078PlayService.stopPlay(streamParamArray[1], Integer.parseInt(streamParamArray[2]));
}else if (jtMediaStreamType.equals(JTMediaStreamType.PLAYBACK)) {
jt1078PlayService.stopPlayback(streamParamArray[1], Integer.parseInt(streamParamArray[2]));
}
}else {
return false;
}
}
} else if ("talk".equals(app) || "broadcast".equals(app)) {
}else if ("1078".equals(app)) {
// 判断是否是1078播放类型
JTMediaStreamType jtMediaStreamType = ijt1078Service.checkStreamFromJt(stream);
if (jtMediaStreamType != null) {
String[] streamParamArray = stream.split("_");
if (jtMediaStreamType.equals(JTMediaStreamType.PLAY)) {
jt1078PlayService.stopPlay(streamParamArray[0], Integer.parseInt(streamParamArray[1]));
}else if (jtMediaStreamType.equals(JTMediaStreamType.PLAYBACK)) {
jt1078PlayService.stopPlayback(streamParamArray[0], Integer.parseInt(streamParamArray[1]));
}
}else {
return false;
}
}else if ("talk".equals(app) || "broadcast".equals(app)) {
return false;
} else {
// 非国标流 推流/拉流代理

View File

@@ -75,6 +75,10 @@ public class DateUtil {
return formatterISO8601.format(formatter.parse(formatTime));
}
public static String yyyy_MM_dd_HH_mm_ssToUrl(@NotNull String formatTime) {
return urlFormatter.format(formatter.parse(formatTime));
}
public static String ISO8601Toyyyy_MM_dd_HH_mm_ss(String formatTime) {
// 三种日期格式都尝试,为了兼容不同厂家的日期格式
if (verification(formatTime, formatterCompatibleISO8601)) {