支持多WVP的推流播放
This commit is contained in:
@@ -3,10 +3,12 @@ package com.genersoft.iot.vmp.media.bean;
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
|
||||
import com.genersoft.iot.vmp.utils.MediaServerUtils;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 视频信息
|
||||
@@ -51,10 +53,15 @@ public class MediaInfo {
|
||||
private Long bytesSpeed;
|
||||
@Schema(description = "鉴权参数")
|
||||
private String callId;
|
||||
@Schema(description = "额外参数")
|
||||
private Map<String, String> paramMap;
|
||||
@Schema(description = "服务ID")
|
||||
private String serverId;
|
||||
|
||||
public static MediaInfo getInstance(JSONObject jsonObject, MediaServer mediaServer) {
|
||||
public static MediaInfo getInstance(JSONObject jsonObject, MediaServer mediaServer, String serverId) {
|
||||
MediaInfo mediaInfo = new MediaInfo();
|
||||
mediaInfo.setMediaServer(mediaServer);
|
||||
mediaInfo.setServerId(serverId);
|
||||
String app = jsonObject.getString("app");
|
||||
mediaInfo.setApp(app);
|
||||
String stream = jsonObject.getString("stream");
|
||||
@@ -66,6 +73,7 @@ public class MediaInfo {
|
||||
Integer originType = jsonObject.getInteger("originType");
|
||||
String originUrl = jsonObject.getString("originUrl");
|
||||
Long aliveSecond = jsonObject.getLong("aliveSecond");
|
||||
String params = jsonObject.getString("params");
|
||||
Long bytesSpeed = jsonObject.getLong("bytesSpeed");
|
||||
if (totalReaderCount != null) {
|
||||
mediaInfo.setReaderCount(totalReaderCount);
|
||||
@@ -86,6 +94,12 @@ public class MediaInfo {
|
||||
if (bytesSpeed != null) {
|
||||
mediaInfo.setBytesSpeed(bytesSpeed);
|
||||
}
|
||||
if (params != null) {
|
||||
mediaInfo.setParamMap(MediaServerUtils.urlParamToMap(params));
|
||||
if(mediaInfo.getCallId() == null) {
|
||||
mediaInfo.setCallId(mediaInfo.getParamMap().get("callId"));
|
||||
}
|
||||
}
|
||||
JSONArray jsonArray = jsonObject.getJSONArray("tracks");
|
||||
if (jsonArray.isEmpty()) {
|
||||
return null;
|
||||
@@ -137,7 +151,7 @@ public class MediaInfo {
|
||||
return mediaInfo;
|
||||
}
|
||||
|
||||
public static MediaInfo getInstance(OnStreamChangedHookParam param, MediaServer mediaServer) {
|
||||
public static MediaInfo getInstance(OnStreamChangedHookParam param, MediaServer mediaServer, String serverId) {
|
||||
|
||||
MediaInfo mediaInfo = new MediaInfo();
|
||||
mediaInfo.setApp(param.getApp());
|
||||
@@ -150,6 +164,11 @@ public class MediaInfo {
|
||||
mediaInfo.setOriginUrl(param.getOriginUrl());
|
||||
mediaInfo.setAliveSecond(param.getAliveSecond());
|
||||
mediaInfo.setBytesSpeed(param.getBytesSpeed());
|
||||
mediaInfo.setParamMap(param.getParamMap());
|
||||
if(mediaInfo.getCallId() == null) {
|
||||
mediaInfo.setCallId(param.getParamMap().get("callId"));
|
||||
}
|
||||
mediaInfo.setServerId(serverId);
|
||||
List<OnStreamChangedHookParam.MediaTrack> tracks = param.getTracks();
|
||||
if (tracks == null || tracks.isEmpty()) {
|
||||
return mediaInfo;
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package com.genersoft.iot.vmp.media.event.hook;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* zlm hook事件的参数
|
||||
* @author lin
|
||||
*/
|
||||
@Data
|
||||
public class Hook {
|
||||
|
||||
private HookType hookType;
|
||||
@@ -12,60 +15,21 @@ public class Hook {
|
||||
|
||||
private String stream;
|
||||
|
||||
private String mediaServerId;
|
||||
|
||||
private Long expireTime;
|
||||
|
||||
|
||||
public static Hook getInstance(HookType hookType, String app, String stream, String mediaServerId) {
|
||||
public static Hook getInstance(HookType hookType, String app, String stream) {
|
||||
Hook hookSubscribe = new Hook();
|
||||
hookSubscribe.setApp(app);
|
||||
hookSubscribe.setStream(stream);
|
||||
hookSubscribe.setHookType(hookType);
|
||||
hookSubscribe.setMediaServerId(mediaServerId);
|
||||
hookSubscribe.setExpireTime(System.currentTimeMillis() + 5 * 60 * 1000);
|
||||
return hookSubscribe;
|
||||
}
|
||||
|
||||
public HookType getHookType() {
|
||||
return hookType;
|
||||
}
|
||||
|
||||
public void setHookType(HookType hookType) {
|
||||
this.hookType = hookType;
|
||||
}
|
||||
|
||||
public String getApp() {
|
||||
return app;
|
||||
}
|
||||
|
||||
public void setApp(String app) {
|
||||
this.app = app;
|
||||
}
|
||||
|
||||
public String getStream() {
|
||||
return stream;
|
||||
}
|
||||
|
||||
public void setStream(String stream) {
|
||||
this.stream = stream;
|
||||
}
|
||||
|
||||
|
||||
public Long getExpireTime() {
|
||||
return expireTime;
|
||||
}
|
||||
|
||||
public void setExpireTime(Long expireTime) {
|
||||
this.expireTime = expireTime;
|
||||
}
|
||||
|
||||
public String getMediaServerId() {
|
||||
return mediaServerId;
|
||||
}
|
||||
|
||||
public void setMediaServerId(String mediaServerId) {
|
||||
this.mediaServerId = mediaServerId;
|
||||
public static Hook getInstance(HookType hookType, String app, String stream, String mediaServer) {
|
||||
// TODO 后续修改所有方法
|
||||
return Hook.getInstance(hookType, app, stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -74,8 +38,7 @@ public class Hook {
|
||||
Hook param = (Hook) obj;
|
||||
return param.getHookType().equals(this.hookType)
|
||||
&& param.getApp().equals(this.app)
|
||||
&& param.getStream().equals(this.stream)
|
||||
&& param.getMediaServerId().equals(this.mediaServerId);
|
||||
&& param.getStream().equals(this.stream);
|
||||
}else {
|
||||
return false;
|
||||
}
|
||||
@@ -83,6 +46,6 @@ public class Hook {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.getHookType() + this.getApp() + this.getStream() + this.getMediaServerId();
|
||||
return this.getHookType() + this.getApp() + this.getStream();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,11 +70,13 @@ public class HookSubscribe {
|
||||
private final Map<String, Hook> allHook = new ConcurrentHashMap<>();
|
||||
|
||||
private void sendNotify(HookType hookType, MediaEvent event) {
|
||||
Hook paramHook = Hook.getInstance(hookType, event.getApp(), event.getStream(), event.getMediaServer().getId());
|
||||
Hook paramHook = Hook.getInstance(hookType, event.getApp(), event.getStream());
|
||||
Event hookSubscribeEvent = allSubscribes.get(paramHook.toString());
|
||||
if (hookSubscribeEvent != null) {
|
||||
HookData data = HookData.getInstance(event);
|
||||
hookSubscribeEvent.response(data);
|
||||
}else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@ 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;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@@ -19,15 +18,14 @@ public class MediaArrivalEvent extends MediaEvent {
|
||||
super(source);
|
||||
}
|
||||
|
||||
public static MediaArrivalEvent getInstance(Object source, OnStreamChangedHookParam hookParam, MediaServer mediaServer){
|
||||
public static MediaArrivalEvent getInstance(Object source, OnStreamChangedHookParam hookParam, MediaServer mediaServer, String serverId){
|
||||
MediaArrivalEvent mediaArrivalEvent = new MediaArrivalEvent(source);
|
||||
mediaArrivalEvent.setMediaInfo(MediaInfo.getInstance(hookParam, mediaServer));
|
||||
mediaArrivalEvent.setMediaInfo(MediaInfo.getInstance(hookParam, mediaServer, serverId));
|
||||
mediaArrivalEvent.setApp(hookParam.getApp());
|
||||
mediaArrivalEvent.setStream(hookParam.getStream());
|
||||
mediaArrivalEvent.setMediaServer(mediaServer);
|
||||
mediaArrivalEvent.setSchema(hookParam.getSchema());
|
||||
mediaArrivalEvent.setSchema(hookParam.getSchema());
|
||||
mediaArrivalEvent.setHookParam(hookParam);
|
||||
mediaArrivalEvent.setParamMap(hookParam.getParamMap());
|
||||
return mediaArrivalEvent;
|
||||
}
|
||||
@@ -40,10 +38,6 @@ public class MediaArrivalEvent extends MediaEvent {
|
||||
@Setter
|
||||
private String callId;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
private OnStreamChangedHookParam hookParam;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
private StreamContent streamInfo;
|
||||
|
||||
@@ -156,7 +156,7 @@ public class ZLMHttpHookListener {
|
||||
}else {
|
||||
param.setParamMap(new HashMap<>());
|
||||
}
|
||||
MediaArrivalEvent mediaArrivalEvent = MediaArrivalEvent.getInstance(this, param, mediaServer);
|
||||
MediaArrivalEvent mediaArrivalEvent = MediaArrivalEvent.getInstance(this, param, mediaServer, userSetting.getServerId());
|
||||
applicationEventPublisher.publishEvent(mediaArrivalEvent);
|
||||
} else {
|
||||
log.info("[ZLM HOOK] 流注销, {}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream());
|
||||
|
||||
@@ -5,6 +5,7 @@ import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.genersoft.iot.vmp.common.CommonCallback;
|
||||
import com.genersoft.iot.vmp.common.StreamInfo;
|
||||
import com.genersoft.iot.vmp.conf.UserSetting;
|
||||
import com.genersoft.iot.vmp.conf.exception.ControllerException;
|
||||
import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
|
||||
import com.genersoft.iot.vmp.media.bean.MediaInfo;
|
||||
@@ -35,6 +36,9 @@ public class ZLMMediaNodeServerService implements IMediaNodeServerService {
|
||||
@Autowired
|
||||
private ZLMServerFactory zlmServerFactory;
|
||||
|
||||
@Autowired
|
||||
private UserSetting userSetting;
|
||||
|
||||
@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, reUsePort, tcpMode);
|
||||
@@ -181,7 +185,7 @@ public class ZLMMediaNodeServerService implements IMediaNodeServerService {
|
||||
return null;
|
||||
}
|
||||
JSONObject mediaJSON = data.getJSONObject(0);
|
||||
MediaInfo mediaInfo = MediaInfo.getInstance(mediaJSON, mediaServer);
|
||||
MediaInfo mediaInfo = MediaInfo.getInstance(mediaJSON, mediaServer, userSetting.getServerId());
|
||||
StreamInfo streamInfo = getStreamInfoByAppAndStream(mediaServer, app, stream, mediaInfo, callId, true);
|
||||
if (streamInfo != null) {
|
||||
streamInfoList.add(streamInfo);
|
||||
@@ -234,7 +238,7 @@ public class ZLMMediaNodeServerService implements IMediaNodeServerService {
|
||||
if (jsonObject.getInteger("code") != 0) {
|
||||
return null;
|
||||
}
|
||||
return MediaInfo.getInstance(jsonObject, mediaServer);
|
||||
return MediaInfo.getInstance(jsonObject, mediaServer, userSetting.getServerId());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user