diff --git a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
index f4774393f..96a987c94 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
@@ -87,6 +87,9 @@ public class StreamInfo implements Serializable, Cloneable{
@Schema(description = "产生源类型,包括 unknown = 0,rtmp_push=1,rtsp_push=2,rtp_push=3,pull=4,ffmpeg_pull=5,mp4_vod=6,device_chn=7")
private int originType;
+ @Schema(description = "转码后的视频流")
+ private StreamInfo transcodeStream;
+
public void setFlv(StreamURL flv) {
this.flv = flv;
}
@@ -533,6 +536,14 @@ public class StreamInfo implements Serializable, Cloneable{
this.transactionInfo = transactionInfo;
}
+ public StreamInfo getTranscodeStream() {
+ return transcodeStream;
+ }
+
+ public void setTranscodeStream(StreamInfo transcodeStream) {
+ this.transcodeStream = transcodeStream;
+ }
+
@Override
public StreamInfo clone() {
StreamInfo instance = null;
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
index 007c72a32..18114c5a4 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
@@ -21,7 +21,7 @@ public class UserSetting {
private Boolean seniorSdp = Boolean.FALSE;
- private Integer playTimeout = 18000;
+ private Integer playTimeout = 10000;
private int platformPlayTimeout = 20000;
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
index fe827f5ad..4763f0fef 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -27,6 +27,9 @@ import com.genersoft.iot.vmp.media.event.hook.HookType;
import com.genersoft.iot.vmp.media.service.IMediaServerService;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxy;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPush;
+import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
+import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
+import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
import com.genersoft.iot.vmp.service.IPlayService;
import com.genersoft.iot.vmp.service.IStreamProxyService;
import com.genersoft.iot.vmp.service.IStreamPushService;
@@ -593,12 +596,11 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
sendRtpItem.setPlayType(InviteStreamType.PUSH);
if (streamPushItem != null) {
// 从redis查询是否正在接收这个推流
- StreamPush pushListItem = redisCatchStorage.getPushListItem(gbStream.getApp(), gbStream.getStream());
+ OnStreamChangedHookParam pushListItem = redisCatchStorage.getPushListItem(gbStream.getApp(), gbStream.getStream());
if (pushListItem != null) {
- sendRtpItem.setServerId(pushListItem.getServerId());
+ sendRtpItem.setServerId(pushListItem.getSeverId());
sendRtpItem.setMediaServerId(pushListItem.getMediaServerId());
- pushListItem.setSelf(userSetting.getServerId().equals(pushListItem.getServerId()));
redisCatchStorage.updateSendRTPSever(sendRtpItem);
// 开始推流
sendPushStream(sendRtpItem, mediaServerItem, platform, request);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
index f90b93fcf..37587b2dc 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
@@ -318,8 +318,8 @@ public class NotifyRequestForCatalogProcessor extends SIPRequestProcessorParent
}
}
- @Scheduled(fixedRate = 10000) //每1秒执行一次
- public void execute(){
- log.info("[待处理Notify-目录订阅消息数量]: {}", taskQueue.size());
- }
+// @Scheduled(fixedRate = 10000) //每1秒执行一次
+// public void execute(){
+// logger.info("[待处理Notify-目录订阅消息数量]: {}", taskQueue.size());
+// }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForMobilePositionProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForMobilePositionProcessor.java
index 52fc7a3fc..9c414a855 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForMobilePositionProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForMobilePositionProcessor.java
@@ -188,8 +188,8 @@ public class NotifyRequestForMobilePositionProcessor extends SIPRequestProcessor
}
taskQueue.clear();
}
- @Scheduled(fixedRate = 10000)
- public void execute(){
- logger.info("[待处理Notify-移动位置订阅消息数量]: {}", taskQueue.size());
- }
+// @Scheduled(fixedRate = 10000)
+// public void execute(){
+// logger.debug("[待处理Notify-移动位置订阅消息数量]: {}", taskQueue.size());
+// }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/media/event/media/MediaArrivalEvent.java b/src/main/java/com/genersoft/iot/vmp/media/event/media/MediaArrivalEvent.java
index 2379321a4..2f51a3e21 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/event/media/MediaArrivalEvent.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/event/media/MediaArrivalEvent.java
@@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.event.media;
import com.genersoft.iot.vmp.media.bean.MediaInfo;
import com.genersoft.iot.vmp.media.bean.MediaServer;
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
+import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
/**
* 流到来事件
@@ -19,7 +20,8 @@ public class MediaArrivalEvent extends MediaEvent {
mediaArrivalEvent.setStream(hookParam.getStream());
mediaArrivalEvent.setMediaServer(mediaServer);
mediaArrivalEvent.setSchema(hookParam.getSchema());
- mediaArrivalEvent.setCallId(hookParam.getCallId());
+ mediaArrivalEvent.setSchema(hookParam.getSchema());
+ mediaArrivalEvent.setHookParam(hookParam);
return mediaArrivalEvent;
}
@@ -27,6 +29,10 @@ public class MediaArrivalEvent extends MediaEvent {
private String callId;
+ private OnStreamChangedHookParam hookParam;
+
+ private StreamContent streamInfo;
+
public MediaInfo getMediaInfo() {
return mediaInfo;
}
@@ -43,4 +49,20 @@ public class MediaArrivalEvent extends MediaEvent {
public void setCallId(String callId) {
this.callId = callId;
}
+
+ public OnStreamChangedHookParam getHookParam() {
+ return hookParam;
+ }
+
+ public void setHookParam(OnStreamChangedHookParam hookParam) {
+ this.hookParam = hookParam;
+ }
+
+ public StreamContent getStreamInfo() {
+ return streamInfo;
+ }
+
+ public void setStreamInfo(StreamContent streamInfo) {
+ this.streamInfo = streamInfo;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java
index a0b334137..d8f5ba955 100755
--- a/src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java
@@ -809,6 +809,13 @@ public class MediaServerServiceImpl implements IMediaServerService {
streamInfoResult.setRtc(addr, mediaServer.getHttpPort(),mediaServer.getHttpSSlPort(), app, stream, callIdParam, isPlay);
streamInfoResult.setMediaInfo(mediaInfo);
+
+ if (!"broadcast".equalsIgnoreCase(app) && !ObjectUtils.isEmpty(mediaServer.getTranscodeSuffix()) && !"null".equalsIgnoreCase(mediaServer.getTranscodeSuffix())) {
+ String newStream = stream + "_" + mediaServer.getTranscodeSuffix();
+ mediaServer.setTranscodeSuffix(null);
+ StreamInfo transcodeStreamInfo = getStreamInfoByAppAndStream(mediaServer, app, newStream, null, addr, callId, isPlay);
+ streamInfoResult.setTranscodeStream(transcodeStreamInfo);
+ }
return streamInfoResult;
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
index c73b055c8..15285dd75 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -26,6 +26,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.dao.*;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
+import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
@@ -120,9 +121,13 @@ public class StreamPushServiceImpl implements IStreamPushService {
streamPushMapper.update(transform);
gbStreamMapper.updateMediaServer(event.getApp(), event.getStream(), event.getMediaServer().getId());
}
-
// 冗余数据,自己系统中自用
- redisCatchStorage.addPushListItem(event.getApp(), event.getStream(), event);
+ if (!"broadcast".equals(event.getApp()) && !"talk".equals(event.getApp())) {
+ StreamInfo streamInfo = mediaServerService.getStreamInfoByAppAndStream(
+ event.getMediaServer(), event.getApp(), event.getStream(), event.getMediaInfo(), event.getCallId());
+ event.getHookParam().setStreamInfo(new StreamContent(streamInfo));
+ redisCatchStorage.addPushListItem(event.getApp(), event.getStream(), event);
+ }
// 发送流变化redis消息
JSONObject jsonObject = new JSONObject();
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
index 76da4dc96..383234b32 100755
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.media.bean.MediaServer;
import com.genersoft.iot.vmp.media.event.media.MediaArrivalEvent;
import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPush;
+import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
import com.genersoft.iot.vmp.storager.dao.dto.PlatformRegisterInfo;
@@ -216,7 +217,7 @@ public interface IRedisCatchStorage {
void addPushListItem(String app, String stream, MediaArrivalEvent param);
- StreamPush getPushListItem(String app, String stream);
+ OnStreamChangedHookParam getPushListItem(String app, String stream);
void removePushListItem(String app, String stream, String mediaServerId);
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java
index a654ea06b..af1b42426 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java
@@ -53,7 +53,7 @@ public interface CloudRecordServiceMapper {
" and id in " +
" #{item}" +
" " +
- " order by start_time DESC" +
+ " order by start_time ASC" +
" ")
List getList(@Param("query") String query, @Param("app") String app, @Param("stream") String stream,
@Param("startTimeStamp")Long startTimeStamp, @Param("endTimeStamp")Long endTimeStamp,
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index 429d341b7..9fe7d112c 100755
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -5,15 +5,13 @@ import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.common.SystemAllInfo;
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.UserSetting;
-import com.genersoft.iot.vmp.gb28181.bean.AlarmChannelMessage;
-import com.genersoft.iot.vmp.gb28181.bean.Device;
-import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
-import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
+import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.media.bean.MediaInfo;
import com.genersoft.iot.vmp.media.bean.MediaServer;
import com.genersoft.iot.vmp.media.event.media.MediaArrivalEvent;
-import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
+import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
+import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPush;
import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
@@ -698,14 +696,13 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
@Override
public void addPushListItem(String app, String stream, MediaArrivalEvent event) {
String key = VideoManagerConstants.PUSH_STREAM_LIST + app + "_" + stream;
- StreamPush streamPushItem = StreamPush.getInstance(event, userSetting.getServerId());
- redisTemplate.opsForValue().set(key, streamPushItem);
+ redisTemplate.opsForValue().set(key, event.getHookParam());
}
@Override
- public StreamPush getPushListItem(String app, String stream) {
+ public OnStreamChangedHookParam getPushListItem(String app, String stream) {
String key = VideoManagerConstants.PUSH_STREAM_LIST + app + "_" + stream;
- return (StreamPush)redisTemplate.opsForValue().get(key);
+ return (OnStreamChangedHookParam)redisTemplate.opsForValue().get(key);
}
@Override
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamContent.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamContent.java
index 193c95d4a..ce7425127 100755
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamContent.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamContent.java
@@ -98,6 +98,9 @@ public class StreamContent {
@Schema(description = "文件下载地址(录像下载使用)")
private DownloadFileInfo downLoadFilePath;
+ @Schema(description = "转码后的视频流")
+ private StreamContent transcodeStream;
+
private double progress;
public StreamContent(StreamInfo streamInfo) {
@@ -179,6 +182,17 @@ public class StreamContent {
if (streamInfo.getDownLoadFilePath() != null) {
this.downLoadFilePath = streamInfo.getDownLoadFilePath();
}
+ if (streamInfo.getTranscodeStream() != null) {
+ this.transcodeStream = new StreamContent(streamInfo.getTranscodeStream());
+ }
+ }
+
+ public StreamContent getTranscodeStream() {
+ return transcodeStream;
+ }
+
+ public void setTranscodeStream(StreamContent transcodeStream) {
+ this.transcodeStream = transcodeStream;
}
public String getApp() {
diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
index be740c193..8937fd86e 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
@@ -126,13 +126,32 @@ public class ApiStreamController {
resultJjson.put("ChannelID", code);
resultJjson.put("ChannelName", deviceChannel.getName());
resultJjson.put("ChannelCustomName", "");
- resultJjson.put("FLV", streamInfo.getFlv().getUrl());
- if(streamInfo.getHttps_flv() != null) {
- resultJjson.put("HTTPS_FLV", streamInfo.getHttps_flv().getUrl());
+ if (streamInfo.getTranscodeStream() != null) {
+ resultJjson.put("FLV", streamInfo.getTranscodeStream().getFlv().getUrl());
+ }else {
+ resultJjson.put("FLV", streamInfo.getFlv().getUrl());
+
}
- resultJjson.put("WS_FLV", streamInfo.getWs_flv().getUrl());
+ if(streamInfo.getHttps_flv() != null) {
+ if (streamInfo.getTranscodeStream() != null) {
+ resultJjson.put("HTTPS_FLV", streamInfo.getTranscodeStream().getHttps_flv().getUrl());
+ }else {
+ resultJjson.put("HTTPS_FLV", streamInfo.getHttps_flv().getUrl());
+ }
+ }
+
+ if (streamInfo.getTranscodeStream() != null) {
+ resultJjson.put("WS_FLV", streamInfo.getTranscodeStream().getWs_flv().getUrl());
+ }else {
+ resultJjson.put("WS_FLV", streamInfo.getWs_flv().getUrl());
+ }
+
if(streamInfo.getWss_flv() != null) {
- resultJjson.put("WSS_FLV", streamInfo.getWss_flv().getUrl());
+ if (streamInfo.getTranscodeStream() != null) {
+ resultJjson.put("WSS_FLV", streamInfo.getTranscodeStream().getWss_flv().getUrl());
+ }else {
+ resultJjson.put("WSS_FLV", streamInfo.getWss_flv().getUrl());
+ }
}
resultJjson.put("RTMP", streamInfo.getRtmp().getUrl());
if (streamInfo.getRtmps() != null) {
diff --git a/web_src/src/components/dialog/devicePlayer.vue b/web_src/src/components/dialog/devicePlayer.vue
index 1c9705bc5..e0a1d01da 100755
--- a/web_src/src/components/dialog/devicePlayer.vue
+++ b/web_src/src/components/dialog/devicePlayer.vue
@@ -473,10 +473,14 @@ export default {
},
getUrlByStreamInfo() {
console.log(this.streamInfo)
+ let streamInfo = this.streamInfo
+ if (this.streamInfo.transcodeStream) {
+ streamInfo = this.streamInfo.transcodeStream;
+ }
if (location.protocol === "https:") {
- this.videoUrl = this.streamInfo[this.player[this.activePlayer][1]]
+ this.videoUrl = streamInfo[this.player[this.activePlayer][1]]
} else {
- this.videoUrl = this.streamInfo[this.player[this.activePlayer][0]]
+ this.videoUrl = streamInfo[this.player[this.activePlayer][0]]
}
return this.videoUrl;