新增设备主子码流选择,默认为不开启
This commit is contained in:
@@ -195,6 +195,8 @@ public class Device {
|
||||
private SipTransactionInfo sipTransactionInfo;
|
||||
|
||||
|
||||
|
||||
|
||||
public String getDeviceId() {
|
||||
return deviceId;
|
||||
}
|
||||
@@ -461,4 +463,20 @@ public class Device {
|
||||
public void setSipTransactionInfo(SipTransactionInfo sipTransactionInfo) {
|
||||
this.sipTransactionInfo = sipTransactionInfo;
|
||||
}
|
||||
|
||||
/*======================设备主子码流逻辑START=========================*/
|
||||
@Schema(description = "开启主子码流切换的开关(false-不开启,true-开启)")
|
||||
private boolean switchPrimarySubStream;
|
||||
|
||||
public boolean isSwitchPrimarySubStream() {
|
||||
return switchPrimarySubStream;
|
||||
}
|
||||
|
||||
public void setSwitchPrimarySubStream(boolean switchPrimarySubStream) {
|
||||
this.switchPrimarySubStream = switchPrimarySubStream;
|
||||
}
|
||||
|
||||
/*======================设备主子码流逻辑END=========================*/
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -153,4 +153,30 @@ public class DeferredResultHolder {
|
||||
map.remove(msg.getKey());
|
||||
}
|
||||
}
|
||||
|
||||
/*============================设备主子码流逻辑START========================*/
|
||||
public static String getPlayKey(String deviceId,String channelId,boolean deviceSwitchSubStream,boolean isSubStream){
|
||||
String key = null;
|
||||
if(deviceSwitchSubStream){
|
||||
key = CALLBACK_CMD_PLAY + isSubStream + deviceId + channelId;
|
||||
}else {
|
||||
key = CALLBACK_CMD_PLAY +deviceId + channelId;
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
public static String getSnapKey(String deviceId,String channelId,boolean deviceSwitchSubStream,boolean isSubStream){
|
||||
String key = null;
|
||||
if(deviceSwitchSubStream){
|
||||
key = CALLBACK_CMD_SNAP + isSubStream + deviceId + channelId;
|
||||
}else {
|
||||
key = CALLBACK_CMD_SNAP +deviceId + channelId;
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
|
||||
/*============================设备主子码流逻辑END========================*/
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ public interface ISIPCommander {
|
||||
* @param device 视频设备
|
||||
* @param channelId 预览通道
|
||||
*/
|
||||
void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
|
||||
void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,boolean isSubStream, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
|
||||
|
||||
/**
|
||||
* 请求回放视频流
|
||||
|
||||
@@ -266,7 +266,7 @@ public class SIPCommander implements ISIPCommander {
|
||||
* @param errorEvent sip错误订阅
|
||||
*/
|
||||
@Override
|
||||
public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
|
||||
public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,boolean isSubStream,
|
||||
ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
|
||||
String stream = ssrcInfo.getStream();
|
||||
|
||||
@@ -341,6 +341,22 @@ public class SIPCommander implements ISIPCommander {
|
||||
}
|
||||
}
|
||||
|
||||
if( device.isSwitchPrimarySubStream() ){
|
||||
if("TP-LINK".equals(device.getManufacturer())){
|
||||
if (isSubStream){
|
||||
content.append("a=streamMode:sub\r\n");
|
||||
}else {
|
||||
content.append("a=streamMode:main\r\n");
|
||||
}
|
||||
}else {
|
||||
if (isSubStream){
|
||||
content.append("a=streamprofile:1\r\n");
|
||||
}else {
|
||||
content.append("a=streamprofile:0\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
|
||||
// f字段:f= v/编码格式/分辨率/帧率/码率类型/码率大小a/编码格式/码率大小/采样率
|
||||
// content.append("f=v/2/5/25/1/4000a/1/8/1" + "\r\n"); // 未发现支持此特性的设备
|
||||
@@ -356,7 +372,11 @@ public class SIPCommander implements ISIPCommander {
|
||||
// 这里为例避免一个通道的点播只有一个callID这个参数使用一个固定值
|
||||
ResponseEvent responseEvent = (ResponseEvent) e.event;
|
||||
SIPResponse response = (SIPResponse) responseEvent.getResponse();
|
||||
streamSession.put(device.getDeviceId(), channelId, "play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, InviteSessionType.PLAY);
|
||||
if(device.isSwitchPrimarySubStream()){
|
||||
streamSession.put(device.getDeviceId(), channelId, "switch-play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, InviteSessionType.PLAY);
|
||||
}else {
|
||||
streamSession.put(device.getDeviceId(), channelId, "play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, InviteSessionType.PLAY);
|
||||
}
|
||||
okEvent.response(e);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -142,8 +142,13 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
|
||||
// 可能是设备主动停止
|
||||
Device device = storager.queryVideoDeviceByChannelId(platformGbId);
|
||||
if (device != null) {
|
||||
storager.stopPlay(device.getDeviceId(), channelId);
|
||||
SsrcTransaction ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null);
|
||||
SsrcTransaction ssrcTransactionForPlay = null;
|
||||
if (device.isSwitchPrimarySubStream() ) {
|
||||
ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "switch-play", null);
|
||||
} else {
|
||||
storager.stopPlay(device.getDeviceId(), channelId);
|
||||
ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null);
|
||||
}
|
||||
if (ssrcTransactionForPlay != null){
|
||||
if (ssrcTransactionForPlay.getCallId().equals(callIdHeader.getCallId())){
|
||||
// 释放ssrc
|
||||
@@ -153,10 +158,17 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
|
||||
}
|
||||
streamSession.remove(device.getDeviceId(), channelId, ssrcTransactionForPlay.getStream());
|
||||
}
|
||||
InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
|
||||
|
||||
if (inviteInfo != null) {
|
||||
InviteInfo inviteInfo = null;
|
||||
if (device.isSwitchPrimarySubStream() ) {
|
||||
String streamType = ssrcTransactionForPlay.getStream().split("_")[0];
|
||||
boolean isSubStream = "sub".equals(streamType);
|
||||
inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream);
|
||||
inviteStreamService.removeInviteInfo(inviteInfo.getType(),inviteInfo.getDeviceId(),inviteInfo.getChannelId(),isSubStream,inviteInfo.getStream());
|
||||
}else {
|
||||
inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
|
||||
inviteStreamService.removeInviteInfo(inviteInfo);
|
||||
}
|
||||
if (inviteInfo != null) {
|
||||
if (inviteInfo.getStreamInfo() != null) {
|
||||
mediaServerService.closeRTPServer(inviteInfo.getStreamInfo().getMediaServerId(), inviteInfo.getStream());
|
||||
}
|
||||
|
||||
@@ -497,7 +497,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
|
||||
}
|
||||
sendRtpItem.setStreamId(streamId);
|
||||
redisCatchStorage.updateSendRTPSever(sendRtpItem);
|
||||
playService.play(mediaServerItem, device.getDeviceId(), channelId, ((code, msg, data) -> {
|
||||
playService.play(mediaServerItem, device.getDeviceId(), channelId,false, ((code, msg, data) -> {
|
||||
if (code == InviteErrorCode.SUCCESS.getCode()){
|
||||
hookEvent.run(code, msg, data);
|
||||
}else if (code == InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode() || code == InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode()){
|
||||
|
||||
Reference in New Issue
Block a user