使用设备Id+通道Id作为session的识别标识,解决点播异常时无法释放session的问题
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* 语音广播
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user