使用设备Id+通道Id作为session的识别标识,解决点播异常时无法释放session的问题

This commit is contained in:
panlinlin
2021-04-16 17:52:30 +08:00
parent 760f1f4d94
commit 2b3b7dbc79
15 changed files with 87 additions and 78 deletions

View File

@@ -16,6 +16,7 @@ public class VideoStreamSessionManager {
private ConcurrentHashMap<String, ClientTransaction> sessionMap = new ConcurrentHashMap<>();
private ConcurrentHashMap<String, String> ssrcMap = new ConcurrentHashMap<>();
private ConcurrentHashMap<String, String> streamIdMap = new ConcurrentHashMap<>();
public String createPlaySsrc(){
return SsrcUtil.getPlaySsrc();
@@ -25,18 +26,23 @@ public class VideoStreamSessionManager {
return SsrcUtil.getPlayBackSsrc();
}
public void put(String streamId,String ssrc,ClientTransaction transaction){
sessionMap.put(streamId, transaction);
ssrcMap.put(streamId, ssrc);
public void put(String deviceId, String channelId ,String ssrc, String streamId, ClientTransaction transaction){
sessionMap.put(deviceId + "_" + channelId, transaction);
ssrcMap.put(deviceId + "_" + channelId, ssrc);
streamIdMap.put(deviceId + "_" + channelId, streamId);
}
public ClientTransaction get(String streamId){
return sessionMap.get(streamId);
public ClientTransaction getTransaction(String deviceId, String channelId){
return sessionMap.get(deviceId + "_" + channelId);
}
public String getStreamId(String deviceId, String channelId){
return streamIdMap.get(deviceId + "_" + channelId);
}
public void remove(String streamId) {
sessionMap.remove(streamId);
SsrcUtil.releaseSsrc(ssrcMap.get(streamId));
ssrcMap.remove(streamId);
public void remove(String deviceId, String channelId) {
sessionMap.remove(deviceId + "_" + channelId);
SsrcUtil.releaseSsrc(ssrcMap.get(deviceId + "_" + channelId));
ssrcMap.remove(deviceId + "_" + channelId);
}
}

View File

@@ -87,7 +87,6 @@ public interface ISIPCommander {
/**
* 请求预览视频流
*
* @param device 视频设备
* @param channelId 预览通道
*/
@@ -108,8 +107,8 @@ public interface ISIPCommander {
*
* @param ssrc ssrc
*/
void streamByeCmd(String ssrc, SipSubscribe.Event okEvent);
void streamByeCmd(String ssrc);
void streamByeCmd(String deviceId, String channelId, SipSubscribe.Event okEvent);
void streamByeCmd(String deviceId, String channelId);
/**
* 语音广播

View File

@@ -332,17 +332,17 @@ public class SIPCommander implements ISIPCommander {
/**
* 请求预览视频流
* @param device 视频设备
* @param channelId 预览通道
* @param event hook订阅
* @param errorEvent sip错误订阅
*/
* @param device 视频设备
* @param channelId 预览通道
* @param event hook订阅
* @param errorEvent sip错误订阅
*/
@Override
public void playStreamCmd(Device device, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent) {
String streamId = null;
try {
if (device == null) return;
String ssrc = streamSession.createPlaySsrc();
String streamId = null;
if (rtpEnable) {
streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
}else {
@@ -444,9 +444,12 @@ public class SIPCommander implements ISIPCommander {
Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "FromInvt" + tm, null, ssrc, callIdHeader);
ClientTransaction transaction = transmitRequest(device, request, errorEvent);
streamSession.put(streamId,ssrc, transaction);
ClientTransaction transaction = transmitRequest(device, request, (e -> {
streamSession.remove(device.getDeviceId(), channelId);
errorEvent.response(e);
}));
streamSession.put(device.getDeviceId(), channelId ,ssrc,streamId, transaction);
} catch ( SipException | ParseException | InvalidArgumentException e) {
e.printStackTrace();
}
@@ -552,7 +555,7 @@ public class SIPCommander implements ISIPCommander {
Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader);
ClientTransaction transaction = transmitRequest(device, request, errorEvent);
streamSession.put(streamId, ssrc, transaction);
streamSession.put(device.getDeviceId(), channelId, ssrc, streamId, transaction);
} catch ( SipException | ParseException | InvalidArgumentException e) {
e.printStackTrace();
@@ -566,17 +569,17 @@ public class SIPCommander implements ISIPCommander {
*
*/
@Override
public void streamByeCmd(String ssrc) {
streamByeCmd(ssrc, null);
public void streamByeCmd(String deviceId, String channelId) {
streamByeCmd(deviceId, channelId, null);
}
@Override
public void streamByeCmd(String streamId, SipSubscribe.Event okEvent) {
public void streamByeCmd(String deviceId, String channelId, SipSubscribe.Event okEvent) {
try {
ClientTransaction transaction = streamSession.get(streamId);
ClientTransaction transaction = streamSession.getTransaction(deviceId, channelId);
// 服务重启后
if (transaction == null) {
StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
if (streamInfo != null) {
}
@@ -613,14 +616,9 @@ public class SIPCommander implements ISIPCommander {
}
dialog.sendRequest(clientTransaction);
streamSession.remove(streamId);
zlmrtpServerFactory.closeRTPServer(streamId);
} catch (TransactionDoesNotExistException e) {
e.printStackTrace();
} catch (SipException e) {
e.printStackTrace();
} catch (ParseException e) {
zlmrtpServerFactory.closeRTPServer(streamSession.getStreamId(deviceId, channelId));
streamSession.remove(deviceId, channelId);
} catch (SipException | ParseException e) {
e.printStackTrace();
}
}
@@ -641,7 +639,6 @@ public class SIPCommander implements ISIPCommander {
* 语音广播
*
* @param device 视频设备
* @param channelId 预览通道
*/
@Override
public boolean audioBroadcastCmd(Device device) {
@@ -1140,7 +1137,7 @@ public class SIPCommander implements ISIPCommander {
* @param device 视频设备
* @param startPriority 报警起始级别(可选)
* @param endPriority 报警终止级别(可选)
* @param alarmMethods 报警方式条件(可选)
* @param alarmMethod 报警方式条件(可选)
* @param alarmType 报警类型
* @param startTime 报警发生起始时间(可选)
* @param endTime 报警发生终止时间(可选)
@@ -1428,5 +1425,6 @@ public class SIPCommander implements ISIPCommander {
String streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
zlmrtpServerFactory.closeRTPServer(streamId);
}
streamSession.remove(device.getDeviceId(), channelId);
}
}

View File

@@ -58,7 +58,7 @@ public class ByeRequestProcessor extends SIPRequestAbstractProcessor {
redisCatchStorage.deleteSendRTPServer(platformGbId, channelId);
if (zlmrtpServerFactory.totalReaderCount(sendRtpItem.getApp(), streamId) == 0) {
System.out.println(streamId + "无其它观看者,通知设备停止推流");
cmder.streamByeCmd(streamId);
cmder.streamByeCmd(sendRtpItem.getDeviceId(), channelId);
}
}
} catch (SipException e) {

View File

@@ -922,7 +922,7 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
StreamInfo streamInfo = redisCatchStorage.queryPlaybackByDevice(deviceId, "*");
if (streamInfo != null) {
redisCatchStorage.stopPlayback(streamInfo);
cmder.streamByeCmd(streamInfo.getStreamId());
cmder.streamByeCmd(streamInfo.getDeviceID(), streamInfo.getChannelId());
}
}
} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {