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;
@ -31,6 +32,7 @@ public class VideoStreamSessionManager {
/** /**
* / * /
* Id/callID * Id/callID
*
* @param deviceId ID * @param deviceId ID
* @param channelId ID * @param channelId ID
* @param callId CallID * @param callId CallID
@ -75,6 +77,34 @@ public class VideoStreamSessionManager {
return (SsrcTransaction) redisTemplate.opsForValue().get(scanResult.get(0)); return (SsrcTransaction) redisTemplate.opsForValue().get(scanResult.get(0));
} }
/**
* .
*
* @param inviteInfo
* @param ssrc ssrc
*/
public void updateSsrcTransactionForStream(InviteInfo inviteInfo, String ssrc) {
String stream = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
SsrcTransaction ssrcTransactionInDb = getSsrcTransaction(inviteInfo.getDeviceId(), inviteInfo.getChannelId(),
inviteInfo.getType().toString().toLowerCase(), inviteInfo.getStream());
if (ObjectUtils.isEmpty(ssrcTransactionInDb)) {
return;
}
remove(ssrcTransactionInDb.getDeviceId(), ssrcTransactionInDb.getChannelId(),
ssrcTransactionInDb.getCallId(), ssrcTransactionInDb.getStream());
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX
+ userSetting.getServerId()
+ "_" + ssrcTransactionInDb.getDeviceId()
+ "_" + ssrcTransactionInDb.getChannelId()
+ "_" + ssrcTransactionInDb.getCallId()
+ "_" + stream;
ssrcTransactionInDb.setSsrc(ssrc);
ssrcTransactionInDb.setStream(stream);
redisTemplate.opsForValue().set(key, ssrcTransactionInDb);
}
public List<SsrcTransaction> getSsrcTransactionForAll(String deviceId, String channelId, String callId, String stream) { public List<SsrcTransaction> getSsrcTransactionForAll(String deviceId, String channelId, String callId, String stream) {
if (ObjectUtils.isEmpty(deviceId)) { if (ObjectUtils.isEmpty(deviceId)) {
deviceId = "*"; deviceId = "*";
@ -116,8 +146,8 @@ public class VideoStreamSessionManager {
return ssrcTransaction.getSsrc(); return ssrcTransaction.getSsrc();
} }
public void remove(String deviceId, String channelId, String stream) { public void remove(String deviceId, String channelId, String callId, String stream) {
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callId, stream);
if (ssrcTransaction == null) { if (ssrcTransaction == null) {
return; return;
} }
@ -125,6 +155,9 @@ public class VideoStreamSessionManager {
+ deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream()); + deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream());
} }
public void remove(String deviceId, String channelId, String stream) {
remove(deviceId, channelId, null, stream);
}
public List<SsrcTransaction> getAllSsrc() { public List<SsrcTransaction> getAllSsrc() {
List<Object> ssrcTransactionKeys = RedisUtil.scan(redisTemplate, String.format("%s_*_*_*_*", VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId())); List<Object> ssrcTransactionKeys = RedisUtil.scan(redisTemplate, String.format("%s_*_*_*_*", VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId()));

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