fix(play): 修复单端口推流下级自定义 ssrc 时, ssrc 修正不完全的问题

pull/981/head
xiaoQQya 2023-08-02 13:56:07 +08:00
parent 2e399faf41
commit 273ade5f73
2 changed files with 142 additions and 104 deletions

View File

@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.gb28181.session; package com.genersoft.iot.vmp.gb28181.session;
import com.genersoft.iot.vmp.common.InviteInfo;
import com.genersoft.iot.vmp.common.InviteSessionType; import com.genersoft.iot.vmp.common.InviteSessionType;
import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.UserSetting;
@ -22,118 +23,150 @@ import java.util.List;
@Component @Component
public class VideoStreamSessionManager { public class VideoStreamSessionManager {
@Autowired @Autowired
private UserSetting userSetting; private UserSetting userSetting;
@Autowired @Autowired
private RedisTemplate<Object, Object> redisTemplate; private RedisTemplate<Object, Object> redisTemplate;
/** /**
* / * /
* Id/callID * Id/callID
* @param deviceId ID *
* @param channelId ID * @param deviceId ID
* @param callId CallID * @param channelId ID
* @param stream * @param callId CallID
* @param mediaServerId 使ID * @param stream
* @param response * @param mediaServerId 使ID
*/ * @param response
public void put(String deviceId, String channelId, String callId, String stream, String ssrc, String mediaServerId, SIPResponse response, InviteSessionType type){ */
SsrcTransaction ssrcTransaction = new SsrcTransaction(); public void put(String deviceId, String channelId, String callId, String stream, String ssrc, String mediaServerId, SIPResponse response, InviteSessionType type) {
ssrcTransaction.setDeviceId(deviceId); SsrcTransaction ssrcTransaction = new SsrcTransaction();
ssrcTransaction.setChannelId(channelId); ssrcTransaction.setDeviceId(deviceId);
ssrcTransaction.setStream(stream); ssrcTransaction.setChannelId(channelId);
ssrcTransaction.setSipTransactionInfo(new SipTransactionInfo(response)); ssrcTransaction.setStream(stream);
ssrcTransaction.setCallId(callId); ssrcTransaction.setSipTransactionInfo(new SipTransactionInfo(response));
ssrcTransaction.setSsrc(ssrc); ssrcTransaction.setCallId(callId);
ssrcTransaction.setMediaServerId(mediaServerId); ssrcTransaction.setSsrc(ssrc);
ssrcTransaction.setType(type); ssrcTransaction.setMediaServerId(mediaServerId);
ssrcTransaction.setType(type);
redisTemplate.opsForValue().set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() redisTemplate.opsForValue().set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId()
+ "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction); + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction);
} }
public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream){ public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream) {
if (ObjectUtils.isEmpty(deviceId)) { if (ObjectUtils.isEmpty(deviceId)) {
deviceId ="*"; deviceId = "*";
} }
if (ObjectUtils.isEmpty(channelId)) { if (ObjectUtils.isEmpty(channelId)) {
channelId ="*"; channelId = "*";
} }
if (ObjectUtils.isEmpty(callId)) { if (ObjectUtils.isEmpty(callId)) {
callId ="*"; callId = "*";
} }
if (ObjectUtils.isEmpty(stream)) { if (ObjectUtils.isEmpty(stream)) {
stream ="*"; stream = "*";
} }
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream; String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream;
List<Object> scanResult = RedisUtil.scan(redisTemplate, key); List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
if (scanResult.size() == 0) { if (scanResult.size() == 0) {
return null; return null;
} }
return (SsrcTransaction)redisTemplate.opsForValue().get(scanResult.get(0)); return (SsrcTransaction) redisTemplate.opsForValue().get(scanResult.get(0));
} }
public List<SsrcTransaction> getSsrcTransactionForAll(String deviceId, String channelId, String callId, String stream){ /**
if (ObjectUtils.isEmpty(deviceId)) { * .
deviceId ="*"; *
} * @param inviteInfo
if (ObjectUtils.isEmpty(channelId)) { * @param ssrc ssrc
channelId ="*"; */
} public void updateSsrcTransactionForStream(InviteInfo inviteInfo, String ssrc) {
if (ObjectUtils.isEmpty(callId)) { String stream = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
callId ="*";
}
if (ObjectUtils.isEmpty(stream)) {
stream ="*";
}
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream;
List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
if (scanResult.size() == 0) {
return null;
}
List<SsrcTransaction> result = new ArrayList<>();
for (Object keyObj : scanResult) {
result.add((SsrcTransaction)redisTemplate.opsForValue().get(keyObj));
}
return result;
}
public String getMediaServerId(String deviceId, String channelId, String stream){ SsrcTransaction ssrcTransactionInDb = getSsrcTransaction(inviteInfo.getDeviceId(), inviteInfo.getChannelId(),
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); inviteInfo.getType().toString().toLowerCase(), inviteInfo.getStream());
if (ssrcTransaction == null) { if (ObjectUtils.isEmpty(ssrcTransactionInDb)) {
return null; return;
} }
return ssrcTransaction.getMediaServerId();
}
public String getSSRC(String deviceId, String channelId, String stream){ remove(ssrcTransactionInDb.getDeviceId(), ssrcTransactionInDb.getChannelId(),
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); ssrcTransactionInDb.getCallId(), ssrcTransactionInDb.getStream());
if (ssrcTransaction == null) { String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX
return null; + userSetting.getServerId()
} + "_" + ssrcTransactionInDb.getDeviceId()
return ssrcTransaction.getSsrc(); + "_" + ssrcTransactionInDb.getChannelId()
} + "_" + ssrcTransactionInDb.getCallId()
+ "_" + stream;
public void remove(String deviceId, String channelId, String stream) { ssrcTransactionInDb.setSsrc(ssrc);
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); ssrcTransactionInDb.setStream(stream);
if (ssrcTransaction == null) { redisTemplate.opsForValue().set(key, ssrcTransactionInDb);
return; }
}
redisTemplate.delete(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_"
+ deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream());
}
public List<SsrcTransaction> getSsrcTransactionForAll(String deviceId, String channelId, String callId, String stream) {
if (ObjectUtils.isEmpty(deviceId)) {
deviceId = "*";
}
if (ObjectUtils.isEmpty(channelId)) {
channelId = "*";
}
if (ObjectUtils.isEmpty(callId)) {
callId = "*";
}
if (ObjectUtils.isEmpty(stream)) {
stream = "*";
}
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream;
List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
if (scanResult.size() == 0) {
return null;
}
List<SsrcTransaction> result = new ArrayList<>();
for (Object keyObj : scanResult) {
result.add((SsrcTransaction) redisTemplate.opsForValue().get(keyObj));
}
return result;
}
public List<SsrcTransaction> getAllSsrc() { public String getMediaServerId(String deviceId, String channelId, String stream) {
List<Object> ssrcTransactionKeys = RedisUtil.scan(redisTemplate, String.format("%s_*_*_*_*", VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX+ userSetting.getServerId())); SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
List<SsrcTransaction> result= new ArrayList<>(); if (ssrcTransaction == null) {
for (Object ssrcTransactionKey : ssrcTransactionKeys) { return null;
String key = (String) ssrcTransactionKey; }
SsrcTransaction ssrcTransaction = JsonUtil.redisJsonToObject(redisTemplate, key, SsrcTransaction.class); return ssrcTransaction.getMediaServerId();
result.add(ssrcTransaction); }
}
return result; public String getSSRC(String deviceId, String channelId, String stream) {
} SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) {
return null;
}
return ssrcTransaction.getSsrc();
}
public void remove(String deviceId, String channelId, String callId, String stream) {
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callId, stream);
if (ssrcTransaction == null) {
return;
}
redisTemplate.delete(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_"
+ deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream());
}
public void remove(String deviceId, String channelId, String stream) {
remove(deviceId, channelId, null, stream);
}
public List<SsrcTransaction> getAllSsrc() {
List<Object> ssrcTransactionKeys = RedisUtil.scan(redisTemplate, String.format("%s_*_*_*_*", VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId()));
List<SsrcTransaction> result = new ArrayList<>();
for (Object ssrcTransactionKey : ssrcTransactionKeys) {
String key = (String) ssrcTransactionKey;
SsrcTransaction ssrcTransaction = JsonUtil.redisJsonToObject(redisTemplate, key, SsrcTransaction.class);
result.add(ssrcTransaction);
}
return result;
}
} }

View File

@ -335,6 +335,11 @@ public class PlayServiceImpl implements IPlayService {
String stream = String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase(); String stream = String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase();
hookSubscribe.getContent().put("stream", stream); hookSubscribe.getContent().put("stream", stream);
inviteStreamService.updateInviteInfoForStream(inviteInfo, stream); inviteStreamService.updateInviteInfoForStream(inviteInfo, stream);
streamSession.updateSsrcTransactionForStream(inviteInfo, ssrcInResponse);
ssrcInfo.setSsrc(ssrcInResponse);
ssrcInfo.setStream(stream);
inviteInfo.setSsrcInfo(ssrcInfo);
inviteInfo.setStream(stream);
subscribe.addSubscribe(hookSubscribe, (mediaServerItemInUse, hookParam) -> { subscribe.addSubscribe(hookSubscribe, (mediaServerItemInUse, hookParam) -> {
logger.info("[ZLM HOOK] ssrc修正后收到订阅消息 " + hookParam); logger.info("[ZLM HOOK] ssrc修正后收到订阅消息 " + hookParam);
dynamicTask.stop(timeOutTaskKey); dynamicTask.stop(timeOutTaskKey);