支持多WVP的推流播放

This commit is contained in:
648540858
2024-08-09 16:27:08 +08:00
parent 7f8a15f017
commit 16708e385b
22 changed files with 203 additions and 129 deletions

View File

@@ -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;

View File

@@ -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();
}
}

View File

@@ -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 {
}
}

View File

@@ -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;

View File

@@ -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());

View File

@@ -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