old mode 100644
new mode 100755
| | |
| | | package com.genersoft.iot.vmp.service.impl; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.baomidou.dynamic.datasource.annotation.DS; |
| | | import com.genersoft.iot.vmp.common.InviteInfo; |
| | | import com.genersoft.iot.vmp.common.InviteSessionStatus; |
| | | import com.genersoft.iot.vmp.common.InviteSessionType; |
| | | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| | | import com.genersoft.iot.vmp.media.event.media.MediaArrivalEvent; |
| | | import com.genersoft.iot.vmp.media.event.media.MediaDepartureEvent; |
| | | import com.genersoft.iot.vmp.service.IInviteStreamService; |
| | | import com.genersoft.iot.vmp.service.bean.ErrorCallback; |
| | | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
| | | import com.genersoft.iot.vmp.utils.redis.RedisUtil; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.event.EventListener; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.List; |
| | |
| | | import java.util.concurrent.CopyOnWriteArrayList; |
| | | |
| | | @Service |
| | | @DS("master") |
| | | public class InviteStreamServiceImpl implements IInviteStreamService { |
| | | |
| | | private final Logger logger = LoggerFactory.getLogger(InviteStreamServiceImpl.class); |
| | |
| | | |
| | | @Autowired |
| | | private RedisTemplate<Object, Object> redisTemplate; |
| | | |
| | | @Autowired |
| | | private IVideoManagerStorage storage; |
| | | |
| | | /** |
| | | * 流到来的处理 |
| | | */ |
| | | @Async("taskExecutor") |
| | | @org.springframework.context.event.EventListener |
| | | public void onApplicationEvent(MediaArrivalEvent event) { |
| | | // if ("rtsp".equals(event.getSchema()) && "rtp".equals(event.getApp())) { |
| | | // |
| | | // } |
| | | } |
| | | |
| | | /** |
| | | * 流离开的处理 |
| | | */ |
| | | @Async("taskExecutor") |
| | | @EventListener |
| | | public void onApplicationEvent(MediaDepartureEvent event) { |
| | | if ("rtsp".equals(event.getSchema()) && "rtp".equals(event.getApp())) { |
| | | InviteInfo inviteInfo = getInviteInfoByStream(null, event.getStream()); |
| | | if (inviteInfo != null && (inviteInfo.getType() == InviteSessionType.PLAY || inviteInfo.getType() == InviteSessionType.PLAYBACK)) { |
| | | removeInviteInfo(inviteInfo); |
| | | storage.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void updateInviteInfo(InviteInfo inviteInfo) { |
| | |
| | | ":" + inviteInfoForUpdate.getType() + |
| | | ":" + inviteInfoForUpdate.getDeviceId() + |
| | | ":" + inviteInfoForUpdate.getChannelId() + |
| | | ":" + inviteInfoForUpdate.getStream(); |
| | | ":" + inviteInfoForUpdate.getStream()+ |
| | | ":" + inviteInfoForUpdate.getSsrcInfo().getSsrc(); |
| | | redisTemplate.opsForValue().set(key, inviteInfoForUpdate); |
| | | } |
| | | |
| | |
| | | ":" + inviteInfo.getType() + |
| | | ":" + inviteInfo.getDeviceId() + |
| | | ":" + inviteInfo.getChannelId() + |
| | | ":" + stream; |
| | | ":" + stream + |
| | | ":" + inviteInfo.getSsrcInfo().getSsrc(); |
| | | inviteInfoInDb.setStream(stream); |
| | | if (inviteInfoInDb.getSsrcInfo() != null) { |
| | | inviteInfoInDb.getSsrcInfo().setStream(stream); |
| | |
| | | ":" + (type != null ? type : "*") + |
| | | ":" + (deviceId != null ? deviceId : "*") + |
| | | ":" + (channelId != null ? channelId : "*") + |
| | | ":" + (stream != null ? stream : "*"); |
| | | ":" + (stream != null ? stream : "*") |
| | | + ":*"; |
| | | List<Object> scanResult = RedisUtil.scan(redisTemplate, key); |
| | | if (scanResult.size() != 1) { |
| | | if (scanResult.isEmpty()) { |
| | | return null; |
| | | } |
| | | if (scanResult.size() != 1) { |
| | | logger.warn("[获取InviteInfo] 发现 key: {}存在多条", key); |
| | | } |
| | | |
| | | return (InviteInfo) redisTemplate.opsForValue().get(scanResult.get(0)); |
| | |
| | | ":" + (type != null ? type : "*") + |
| | | ":" + (deviceId != null ? deviceId : "*") + |
| | | ":" + (channelId != null ? channelId : "*") + |
| | | ":" + (stream != null ? stream : "*"); |
| | | ":" + (stream != null ? stream : "*") + |
| | | ":*"; |
| | | List<Object> scanResult = RedisUtil.scan(redisTemplate, scanKey); |
| | | if (scanResult.size() > 0) { |
| | | for (Object keyObj : scanResult) { |
| | |
| | | @Override |
| | | public int getStreamInfoCount(String mediaServerId) { |
| | | int count = 0; |
| | | String key = VideoManagerConstants.INVITE_PREFIX + ":*:*:*:*"; |
| | | String key = VideoManagerConstants.INVITE_PREFIX + ":*:*:*:*:*"; |
| | | List<Object> scanResult = RedisUtil.scan(redisTemplate, key); |
| | | if (scanResult.size() == 0) { |
| | | return 0; |
| | |
| | | } |
| | | return key; |
| | | } |
| | | |
| | | @Override |
| | | public InviteInfo getInviteInfoBySSRC(String ssrc) { |
| | | String key = VideoManagerConstants.INVITE_PREFIX + ":*:*:*:*:" + ssrc; |
| | | List<Object> scanResult = RedisUtil.scan(redisTemplate, key); |
| | | if (scanResult.size() != 1) { |
| | | return null; |
| | | } |
| | | |
| | | return (InviteInfo) redisTemplate.opsForValue().get(scanResult.get(0)); |
| | | } |
| | | |
| | | @Override |
| | | public InviteInfo updateInviteInfoForSSRC(InviteInfo inviteInfo, String ssrc) { |
| | | InviteInfo inviteInfoInDb = getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream()); |
| | | if (inviteInfoInDb == null) { |
| | | return null; |
| | | } |
| | | removeInviteInfo(inviteInfoInDb); |
| | | String key = VideoManagerConstants.INVITE_PREFIX + |
| | | ":" + inviteInfo.getType() + |
| | | ":" + inviteInfo.getDeviceId() + |
| | | ":" + inviteInfo.getChannelId() + |
| | | ":" + inviteInfo.getStream() + |
| | | ":" + ssrc; |
| | | if (inviteInfoInDb.getSsrcInfo() != null) { |
| | | inviteInfoInDb.getSsrcInfo().setSsrc(ssrc); |
| | | } |
| | | redisTemplate.opsForValue().set(key, inviteInfoInDb); |
| | | return inviteInfoInDb; |
| | | } |
| | | } |