使用异步接口, 更好的并发, 对hook使用订阅机制
替换前段播放器, 支持h265的播放 放弃循环获取编码信息,
This commit is contained in:
@@ -49,6 +49,9 @@ public class ZLMHttpHookListener {
|
||||
@Autowired
|
||||
private ZLMRESTfulUtils zlmresTfulUtils;
|
||||
|
||||
@Autowired
|
||||
private ZLMHttpHookSubscribe subscribe;
|
||||
|
||||
@Value("${media.ip}")
|
||||
private String mediaIp;
|
||||
|
||||
@@ -128,30 +131,38 @@ public class ZLMHttpHookListener {
|
||||
}
|
||||
String app = json.getString("app");
|
||||
String streamId = json.getString("id");
|
||||
if ("rtp".equals(app)) {
|
||||
String ssrc = new DecimalFormat("0000000000").format(Integer.parseInt(streamId, 16));
|
||||
StreamInfo streamInfoForPlay = storager.queryPlayBySSRC(ssrc);
|
||||
if ("rtp".equals(app) && streamInfoForPlay != null ) {
|
||||
MediaServerConfig mediaInfo = storager.getMediaInfo();
|
||||
streamInfoForPlay.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
streamInfoForPlay.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
streamInfoForPlay.setRtmp(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtmpPort(), streamId));
|
||||
streamInfoForPlay.setHls(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
streamInfoForPlay.setRtsp(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtspPort(), streamId));
|
||||
storager.startPlay(streamInfoForPlay);
|
||||
}
|
||||
|
||||
StreamInfo streamInfoForPlayBack = storager.queryPlaybackBySSRC(ssrc);
|
||||
if ("rtp".equals(app) && streamInfoForPlayBack != null ) {
|
||||
MediaServerConfig mediaInfo = storager.getMediaInfo();
|
||||
streamInfoForPlayBack.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
streamInfoForPlayBack.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
streamInfoForPlayBack.setRtmp(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtmpPort(), streamId));
|
||||
streamInfoForPlayBack.setHls(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
streamInfoForPlayBack.setRtsp(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtspPort(), streamId));
|
||||
storager.startPlayback(streamInfoForPlayBack);
|
||||
}
|
||||
}
|
||||
ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, json);
|
||||
if (subscribe != null) subscribe.response(json);
|
||||
|
||||
// if ("rtp".equals(app)) {
|
||||
// String ssrc = new DecimalFormat("0000000000").format(Integer.parseInt(streamId, 16));
|
||||
// StreamInfo streamInfoForPlay = storager.queryPlayBySSRC(ssrc);
|
||||
// if ("rtp".equals(app) && streamInfoForPlay != null ) {
|
||||
// MediaServerConfig mediaInfo = storager.getMediaInfo();
|
||||
// streamInfoForPlay.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
// streamInfoForPlay.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
// streamInfoForPlay.setFmp4(String.format("http://%s:%s/rtp/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
// streamInfoForPlay.setWs_fmp4(String.format("ws://%s:%s/rtp/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
// streamInfoForPlay.setRtmp(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtmpPort(), streamId));
|
||||
// streamInfoForPlay.setHls(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
// streamInfoForPlay.setRtsp(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtspPort(), streamId));
|
||||
// storager.startPlay(streamInfoForPlay);
|
||||
// }
|
||||
//
|
||||
// StreamInfo streamInfoForPlayBack = storager.queryPlaybackBySSRC(ssrc);
|
||||
// if ("rtp".equals(app) && streamInfoForPlayBack != null ) {
|
||||
// MediaServerConfig mediaInfo = storager.getMediaInfo();
|
||||
// streamInfoForPlayBack.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
// streamInfoForPlayBack.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
// streamInfoForPlayBack.setFmp4(String.format("http://%s:%s/rtp/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
// streamInfoForPlayBack.setWs_fmp4(String.format("ws://%s:%s/rtp/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
// streamInfoForPlayBack.setRtmp(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtmpPort(), streamId));
|
||||
// streamInfoForPlayBack.setHls(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId));
|
||||
// streamInfoForPlayBack.setRtsp(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtspPort(), streamId));
|
||||
// storager.startPlayback(streamInfoForPlayBack);
|
||||
// }
|
||||
// }
|
||||
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
package com.genersoft.iot.vmp.media.zlm;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.genersoft.iot.vmp.common.StreamInfo;
|
||||
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
||||
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
|
||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.math.BigInteger;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Description:针对 ZLMediaServer的hook事件订阅
|
||||
* @author: pan
|
||||
* @date: 2020年12月2日 21:17:32
|
||||
*/
|
||||
@Component
|
||||
public class ZLMHttpHookSubscribe {
|
||||
|
||||
private final static Logger logger = LoggerFactory.getLogger(ZLMHttpHookSubscribe.class);
|
||||
|
||||
public enum HookType{
|
||||
on_flow_report,
|
||||
on_http_access,
|
||||
on_play,
|
||||
on_publish,
|
||||
on_record_mp4,
|
||||
on_rtsp_auth,
|
||||
on_rtsp_realm,
|
||||
on_shell_login,
|
||||
on_stream_changed,
|
||||
on_stream_none_reader,
|
||||
on_stream_not_found,
|
||||
on_server_started
|
||||
}
|
||||
|
||||
public interface Event{
|
||||
void response(JSONObject response);
|
||||
}
|
||||
|
||||
private Map<HookType, Map<JSONObject, ZLMHttpHookSubscribe.Event>> allSubscribes = new HashMap<>();
|
||||
|
||||
public void addSubscribe(HookType type, JSONObject hookResponse, ZLMHttpHookSubscribe.Event event) {
|
||||
Map<JSONObject, Event> eventMap = allSubscribes.get(type);
|
||||
if (eventMap == null) {
|
||||
eventMap = new HashMap<JSONObject, Event>();
|
||||
allSubscribes.put(type,eventMap);
|
||||
}
|
||||
eventMap.put(hookResponse, event);
|
||||
}
|
||||
|
||||
public ZLMHttpHookSubscribe.Event getSubscribe(HookType type, JSONObject hookResponse) {
|
||||
ZLMHttpHookSubscribe.Event event= null;
|
||||
Map<JSONObject, Event> eventMap = allSubscribes.get(type);
|
||||
if (eventMap == null) {
|
||||
return null;
|
||||
}
|
||||
for (JSONObject key : eventMap.keySet()) {
|
||||
Boolean result = null;
|
||||
for (String s : key.keySet()) {
|
||||
String string = hookResponse.getString(s);
|
||||
String string1 = key.getString(s);
|
||||
if (result == null) {
|
||||
result = key.getString(s).equals(hookResponse.getString(s));
|
||||
}else {
|
||||
result = result && key.getString(s).equals(hookResponse.getString(s));
|
||||
}
|
||||
|
||||
}
|
||||
if (result) {
|
||||
event = eventMap.get(key);
|
||||
}
|
||||
}
|
||||
return event;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user