| | |
| | | private String endTime; |
| | | private double progress; |
| | | |
| | | private boolean pause; |
| | | |
| | | public static class TransactionInfo{ |
| | | public String callId; |
| | | public String localTag; |
| | |
| | | public void setRtcs(String rtcs) { |
| | | this.rtcs = rtcs; |
| | | } |
| | | |
| | | public boolean isPause() { |
| | | return pause; |
| | | } |
| | | |
| | | public void setPause(boolean pause) { |
| | | this.pause = pause; |
| | | } |
| | | } |
New file |
| | |
| | | package com.genersoft.iot.vmp.conf.exception; |
| | | |
| | | /** |
| | | * @author lin |
| | | */ |
| | | public class ServiceException extends Exception{ |
| | | private String msg; |
| | | |
| | | |
| | | |
| | | public ServiceException(String msg) { |
| | | this.msg = msg; |
| | | } |
| | | |
| | | public String getMsg() { |
| | | return msg; |
| | | } |
| | | |
| | | public void setMsg(String msg) { |
| | | this.msg = msg; |
| | | } |
| | | |
| | | @Override |
| | | public String getMessage() { |
| | | return msg; |
| | | } |
| | | } |
| | |
| | | @Override |
| | | public String getMessage() { |
| | | StringBuffer msg = new StringBuffer(); |
| | | msg.append(StringFormatter.format("缓存事务信息未找到,device:%s channel: %s ", deviceId, channelId)); |
| | | msg.append(String.format("缓存事务信息未找到,device:%s channel: %s ", deviceId, channelId)); |
| | | if (callId != null) { |
| | | msg.append("callId: " + callId); |
| | | msg.append(",callId: " + callId); |
| | | } |
| | | if (stream != null) { |
| | | msg.append("stream: " + stream); |
| | | msg.append(",stream: " + stream); |
| | | } |
| | | return msg.toString(); |
| | | } |
| | |
| | | * 视频流停止
|
| | | */
|
| | | void streamByeCmd(Device device, String channelId, String stream, String callId, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException, SsrcTransactionNotFoundException;
|
| | |
|
| | | void streamByeCmd(Device device, String channelId, String stream, String callId) throws InvalidArgumentException, ParseException, SipException, SsrcTransactionNotFoundException;
|
| | |
|
| | | /**
|
| | |
| | | if (sendRtpItem.getApp().equals(app)) {
|
| | | String platformId = sendRtpItem.getPlatformId();
|
| | | ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId);
|
| | | Device device = deviceService.queryDevice(platformId);
|
| | |
|
| | | try {
|
| | | commanderFroPlatform.streamByeCmd(platform, sendRtpItem);
|
| | | } catch (SipException | InvalidArgumentException | ParseException e) {
|
| | | if (platform != null) {
|
| | | commanderFroPlatform.streamByeCmd(platform, sendRtpItem);
|
| | | }else {
|
| | | cmder.streamByeCmd(device, sendRtpItem.getChannelId(), stream, sendRtpItem.getCallId());
|
| | | }
|
| | | } catch (SipException | InvalidArgumentException | ParseException | SsrcTransactionNotFoundException e) {
|
| | | logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage());
|
| | | }
|
| | | }
|
| | |
| | | storager.stopPlay(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId());
|
| | | }else{
|
| | | StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, streamId, null);
|
| | | if (streamInfoForPlayBackCatch != null) {
|
| | | Device device = deviceService.queryDevice(streamInfoForPlayCatch.getDeviceID());
|
| | | if (device != null) {
|
| | | try {
|
| | | cmder.streamByeCmd(device,streamInfoForPlayBackCatch.getChannelId(),
|
| | | streamInfoForPlayBackCatch.getStream(), null);
|
| | | } catch (InvalidArgumentException | ParseException | SipException |
|
| | | SsrcTransactionNotFoundException e) {
|
| | | logger.error("[无人观看]回放, 发送BYE失败 {}", e.getMessage());
|
| | | if (streamInfoForPlayBackCatch != null ) {
|
| | | if (streamInfoForPlayBackCatch.isPause()) {
|
| | | ret.put("close", false);
|
| | | }else {
|
| | | Device device = deviceService.queryDevice(streamInfoForPlayBackCatch.getDeviceID());
|
| | | if (device != null) {
|
| | | try {
|
| | | cmder.streamByeCmd(device,streamInfoForPlayBackCatch.getChannelId(),
|
| | | streamInfoForPlayBackCatch.getStream(), null);
|
| | | } catch (InvalidArgumentException | ParseException | SipException |
|
| | | SsrcTransactionNotFoundException e) {
|
| | | logger.error("[无人观看]回放, 发送BYE失败 {}", e.getMessage());
|
| | | }
|
| | | }
|
| | | redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch.getDeviceID(),
|
| | | streamInfoForPlayBackCatch.getChannelId(), streamInfoForPlayBackCatch.getStream(), null);
|
| | | }
|
| | | redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch.getDeviceID(),
|
| | | streamInfoForPlayBackCatch.getChannelId(), streamInfoForPlayBackCatch.getStream(), null);
|
| | |
|
| | | }else {
|
| | | StreamInfo streamInfoForDownload = redisCatchStorage.queryDownload(null, null, streamId, null);
|
| | | // 进行录像下载时无人观看不断流
|
| | |
| | | |
| | | private final static Logger logger = LoggerFactory.getLogger(ZLMRESTfulUtils.class); |
| | | |
| | | |
| | | |
| | | |
| | | public interface RequestCallback{ |
| | | void run(JSONObject response); |
| | | } |
| | |
| | | } |
| | | |
| | | public void getSnap(MediaServerItem mediaServerItem, String flvUrl, int timeout_sec, int expire_sec, String targetPath, String fileName) { |
| | | Map<String, Object> param = new HashMap<>(); |
| | | Map<String, Object> param = new HashMap<>(3); |
| | | param.put("url", flvUrl); |
| | | param.put("timeout_sec", timeout_sec); |
| | | param.put("expire_sec", expire_sec); |
| | | sendGetForImg(mediaServerItem, "getSnap", param, targetPath, fileName); |
| | | } |
| | | |
| | | public JSONObject pauseRtpCheck(MediaServerItem mediaServerItem, String streamId) { |
| | | Map<String, Object> param = new HashMap<>(1); |
| | | param.put("stream_id", streamId); |
| | | return sendPost(mediaServerItem, "pauseRtpCheck",param, null); |
| | | } |
| | | |
| | | public JSONObject resumeRtpCheck(MediaServerItem mediaServerItem, String streamId) { |
| | | Map<String, Object> param = new HashMap<>(1); |
| | | param.put("stream_id", streamId); |
| | | return sendPost(mediaServerItem, "resumeRtpCheck",param, null); |
| | | } |
| | | } |
| | |
| | | param.put("stream_id", streamId); |
| | | JSONObject jsonObject = zlmresTfulUtils.closeRtpServer(mediaServerItem, param); |
| | | if (jsonObject != null ) { |
| | | System.out.println(jsonObject); |
| | | if (jsonObject.getInteger("code") == 0) { |
| | | return createRTPServer(mediaServerItem, streamId, ssrc, port); |
| | | }else { |
| | |
| | | param.put("stream_id", streamId); |
| | | JSONObject jsonObject = zlmresTfulUtils.closeRtpServer(serverItem, param); |
| | | if (jsonObject != null ) { |
| | | System.out.println(jsonObject); |
| | | if (jsonObject.getInteger("code") == 0) { |
| | | result = jsonObject.getInteger("hit") == 1; |
| | | }else { |
| | |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.genersoft.iot.vmp.common.StreamInfo; |
| | | import com.genersoft.iot.vmp.conf.exception.ServiceException; |
| | | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| | | import com.genersoft.iot.vmp.gb28181.bean.InviteStreamCallback; |
| | | import com.genersoft.iot.vmp.gb28181.bean.InviteStreamInfo; |
| | |
| | | import com.genersoft.iot.vmp.vmanager.bean.WVPResult; |
| | | import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult; |
| | | import org.springframework.web.context.request.async.DeferredResult; |
| | | |
| | | import javax.sip.InvalidArgumentException; |
| | | import javax.sip.SipException; |
| | | import java.text.ParseException; |
| | | |
| | | /** |
| | | * 点播处理 |
| | |
| | | StreamInfo getDownLoadInfo(String deviceId, String channelId, String stream); |
| | | |
| | | void zlmServerOnline(String mediaServerId); |
| | | |
| | | void pauseRtp(String streamId) throws ServiceException, InvalidArgumentException, ParseException, SipException; |
| | | |
| | | void resumeRtp(String streamId) throws ServiceException, InvalidArgumentException, ParseException, SipException; |
| | | } |
| | |
| | | import javax.sip.ResponseEvent; |
| | | import javax.sip.SipException; |
| | | |
| | | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| | | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| | | import com.genersoft.iot.vmp.conf.exception.ServiceException; |
| | | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; |
| | | import com.genersoft.iot.vmp.gb28181.bean.*; |
| | | import com.genersoft.iot.vmp.service.IDeviceService; |
| | | import com.genersoft.iot.vmp.utils.redis.RedisUtil; |
| | | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | |
| | | // } |
| | | // })); |
| | | } |
| | | |
| | | @Override |
| | | public void pauseRtp(String streamId) throws ServiceException, InvalidArgumentException, ParseException, SipException { |
| | | String key = redisCatchStorage.queryPlaybackForKey(null, null, streamId, null); |
| | | StreamInfo streamInfo = redisCatchStorage.queryPlayback(null, null, streamId, null); |
| | | if (null == streamInfo) { |
| | | logger.warn("streamId不存在!"); |
| | | throw new ServiceException("streamId不存在"); |
| | | } |
| | | streamInfo.setPause(true); |
| | | RedisUtil.set(key, streamInfo); |
| | | MediaServerItem mediaServerItem = mediaServerService.getOne(streamInfo.getMediaServerId()); |
| | | if (null == mediaServerItem) { |
| | | logger.warn("mediaServer 不存在!"); |
| | | throw new ServiceException("mediaServer不存在"); |
| | | } |
| | | // zlm 暂停RTP超时检查 |
| | | JSONObject jsonObject = zlmresTfulUtils.pauseRtpCheck(mediaServerItem, streamId); |
| | | if (jsonObject == null || jsonObject.getInteger("code") != 0) { |
| | | throw new ServiceException("暂停RTP接收失败"); |
| | | } |
| | | Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); |
| | | cmder.playPauseCmd(device, streamInfo); |
| | | } |
| | | |
| | | @Override |
| | | public void resumeRtp(String streamId) throws ServiceException, InvalidArgumentException, ParseException, SipException { |
| | | String key = redisCatchStorage.queryPlaybackForKey(null, null, streamId, null); |
| | | StreamInfo streamInfo = redisCatchStorage.queryPlayback(null, null, streamId, null); |
| | | if (null == streamInfo) { |
| | | logger.warn("streamId不存在!"); |
| | | throw new ServiceException("streamId不存在"); |
| | | } |
| | | streamInfo.setPause(false); |
| | | RedisUtil.set(key, streamInfo); |
| | | MediaServerItem mediaServerItem = mediaServerService.getOne(streamInfo.getMediaServerId()); |
| | | if (null == mediaServerItem) { |
| | | logger.warn("mediaServer 不存在!"); |
| | | throw new ServiceException("mediaServer不存在"); |
| | | } |
| | | // zlm 暂停RTP超时检查 |
| | | JSONObject jsonObject = zlmresTfulUtils.resumeRtpCheck(mediaServerItem, streamId); |
| | | if (jsonObject == null || jsonObject.getInteger("code") != 0) { |
| | | throw new ServiceException("继续RTP接收失败"); |
| | | } |
| | | Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); |
| | | cmder.playResumeCmd(device, streamInfo); |
| | | } |
| | | } |
| | |
| | | |
| | | StreamInfo queryPlayback(String deviceId, String channelID, String stream, String callId); |
| | | |
| | | String queryPlaybackForKey(String deviceId, String channelId, String stream, String callId); |
| | | |
| | | void updatePlatformCatchInfo(ParentPlatformCatch parentPlatformCatch); |
| | | |
| | | ParentPlatformCatch queryPlatformCatchInfo(String platformGbId); |
| | |
| | | import com.genersoft.iot.vmp.gb28181.bean.*; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.OnPublishHookParam; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; |
| | | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; |
| | | import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; |
| | |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.DependsOn; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.*; |
| | |
| | | } |
| | | @Override |
| | | public StreamInfo queryPlayByStreamId(String streamId) { |
| | | System.out.println(String.format("%S_%s_%s_*", VideoManagerConstants.PLAYER_PREFIX, userSetting.getServerId(), streamId)); |
| | | List<Object> playLeys = RedisUtil.scan(String.format("%S_%s_%s_*", VideoManagerConstants.PLAYER_PREFIX, userSetting.getServerId(), streamId)); |
| | | if (playLeys == null || playLeys.size() == 0) { |
| | | return null; |
| | |
| | | |
| | | @Override |
| | | public boolean startPlayback(StreamInfo stream, String callId) { |
| | | System.out.println(String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, |
| | | userSetting.getServerId(), stream.getDeviceID(), stream.getChannelId(), stream.getStream(), callId)); |
| | | return RedisUtil.set(String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, |
| | | userSetting.getServerId(), stream.getDeviceID(), stream.getChannelId(), stream.getStream(), callId), stream); |
| | | } |
| | |
| | | } |
| | | |
| | | @Override |
| | | public String queryPlaybackForKey(String deviceId, String channelId, String stream, String callId) { |
| | | if (stream == null && callId == null) { |
| | | return null; |
| | | } |
| | | if (deviceId == null) { |
| | | deviceId = "*"; |
| | | } |
| | | if (channelId == null) { |
| | | channelId = "*"; |
| | | } |
| | | if (stream == null) { |
| | | stream = "*"; |
| | | } |
| | | if (callId == null) { |
| | | callId = "*"; |
| | | } |
| | | String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, |
| | | userSetting.getServerId(), |
| | | deviceId, |
| | | channelId, |
| | | stream, |
| | | callId |
| | | ); |
| | | List<Object> streamInfoScan = RedisUtil.scan(key); |
| | | return (String) streamInfoScan.get(0); |
| | | } |
| | | |
| | | @Override |
| | | public void updatePlatformCatchInfo(ParentPlatformCatch parentPlatformCatch) { |
| | | String key = VideoManagerConstants.PLATFORM_CATCH_PREFIX + userSetting.getServerId() + "_" + parentPlatformCatch.getId(); |
| | | RedisUtil.set(key, parentPlatformCatch); |
| | |
| | | |
| | | import com.genersoft.iot.vmp.common.StreamInfo; |
| | | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| | | import com.genersoft.iot.vmp.conf.exception.ServiceException; |
| | | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
| | | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; |
| | | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| | | import com.genersoft.iot.vmp.service.IPlayService; |
| | | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| | |
| | | |
| | | @Autowired |
| | | private SIPCommander cmder; |
| | | |
| | | @Autowired |
| | | private ZLMRTPServerFactory zlmrtpServerFactory; |
| | | |
| | | @Autowired |
| | | private IVideoManagerStorage storager; |
| | |
| | | @GetMapping("/pause/{streamId}") |
| | | public void playPause(@PathVariable String streamId) { |
| | | logger.info("playPause: "+streamId); |
| | | StreamInfo streamInfo = redisCatchStorage.queryPlayback(null, null, streamId, null); |
| | | if (null == streamInfo) { |
| | | logger.warn("streamId不存在!"); |
| | | throw new ControllerException(ErrorCode.ERROR400.getCode(), "streamId不存在"); |
| | | } |
| | | Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); |
| | | |
| | | try { |
| | | cmder.playPauseCmd(device, streamInfo); |
| | | playService.pauseRtp(streamId); |
| | | } catch (ServiceException e) { |
| | | throw new ControllerException(ErrorCode.ERROR400.getCode(), e.getMessage()); |
| | | } catch (InvalidArgumentException | ParseException | SipException e) { |
| | | throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); |
| | | } |
| | |
| | | @GetMapping("/resume/{streamId}") |
| | | public void playResume(@PathVariable String streamId) { |
| | | logger.info("playResume: "+streamId); |
| | | StreamInfo streamInfo = redisCatchStorage.queryPlayback(null, null, streamId, null); |
| | | if (null == streamInfo) { |
| | | logger.warn("streamId不存在!"); |
| | | throw new ControllerException(ErrorCode.ERROR400.getCode(), "streamId不存在"); |
| | | } |
| | | Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); |
| | | try { |
| | | cmder.playResumeCmd(device, streamInfo); |
| | | playService.resumeRtp(streamId); |
| | | } catch (ServiceException e) { |
| | | throw new ControllerException(ErrorCode.ERROR400.getCode(), e.getMessage()); |
| | | } catch (InvalidArgumentException | ParseException | SipException e) { |
| | | throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); |
| | | } |