更改 play playback 使用的 sip 请求构造方式

This commit is contained in:
shikong 2023-10-05 12:55:23 +08:00
parent 9a1d2a53b5
commit aa15ffd1a7
2 changed files with 36 additions and 18 deletions

View File

@ -5,14 +5,13 @@ import cn.hutool.core.date.DateUtil;
import cn.skcks.docking.gb28181.common.json.JsonResponse; import cn.skcks.docking.gb28181.common.json.JsonResponse;
import cn.skcks.docking.gb28181.common.json.JsonUtils; import cn.skcks.docking.gb28181.common.json.JsonUtils;
import cn.skcks.docking.gb28181.common.redis.RedisUtil; import cn.skcks.docking.gb28181.common.redis.RedisUtil;
import cn.skcks.docking.gb28181.config.sip.SipConfig;
import cn.skcks.docking.gb28181.core.sip.dto.SipTransactionInfo; import cn.skcks.docking.gb28181.core.sip.dto.SipTransactionInfo;
import cn.skcks.docking.gb28181.core.sip.gb28181.cache.CacheUtil; import cn.skcks.docking.gb28181.core.sip.gb28181.cache.CacheUtil;
import cn.skcks.docking.gb28181.core.sip.message.subscribe.GenericTimeoutSubscribe;
import cn.skcks.docking.gb28181.sdp.GB28181Description;
import cn.skcks.docking.gb28181.core.sip.message.processor.MessageProcessor;
import cn.skcks.docking.gb28181.core.sip.message.request.SipRequestBuilder; import cn.skcks.docking.gb28181.core.sip.message.request.SipRequestBuilder;
import cn.skcks.docking.gb28181.core.sip.message.sender.SipMessageSender; import cn.skcks.docking.gb28181.core.sip.message.sender.SipMessageSender;
import cn.skcks.docking.gb28181.core.sip.message.subscribe.GenericSubscribe; import cn.skcks.docking.gb28181.core.sip.message.subscribe.GenericSubscribe;
import cn.skcks.docking.gb28181.core.sip.message.subscribe.GenericTimeoutSubscribe;
import cn.skcks.docking.gb28181.core.sip.message.subscribe.SipSubscribe; import cn.skcks.docking.gb28181.core.sip.message.subscribe.SipSubscribe;
import cn.skcks.docking.gb28181.core.sip.service.SipService; import cn.skcks.docking.gb28181.core.sip.service.SipService;
import cn.skcks.docking.gb28181.media.config.ZlmMediaConfig; import cn.skcks.docking.gb28181.media.config.ZlmMediaConfig;
@ -23,10 +22,12 @@ import cn.skcks.docking.gb28181.media.dto.rtp.OpenRtpServerResp;
import cn.skcks.docking.gb28181.media.dto.status.ResponseStatus; import cn.skcks.docking.gb28181.media.dto.status.ResponseStatus;
import cn.skcks.docking.gb28181.media.proxy.ZlmMediaService; import cn.skcks.docking.gb28181.media.proxy.ZlmMediaService;
import cn.skcks.docking.gb28181.orm.mybatis.dynamic.model.DockingDevice; import cn.skcks.docking.gb28181.orm.mybatis.dynamic.model.DockingDevice;
import cn.skcks.docking.gb28181.sdp.GB28181Description;
import cn.skcks.docking.gb28181.sdp.GB28181SDPBuilder; import cn.skcks.docking.gb28181.sdp.GB28181SDPBuilder;
import cn.skcks.docking.gb28181.sdp.media.MediaStreamMode; import cn.skcks.docking.gb28181.sdp.media.MediaStreamMode;
import cn.skcks.docking.gb28181.service.docking.device.DockingDeviceService; import cn.skcks.docking.gb28181.service.docking.device.DockingDeviceService;
import cn.skcks.docking.gb28181.service.ssrc.SsrcService; import cn.skcks.docking.gb28181.service.ssrc.SsrcService;
import cn.skcks.docking.gb28181.sip.method.invite.request.InviteRequestBuilder;
import cn.skcks.docking.gb28181.sip.method.invite.response.InviteResponseBuilder; import cn.skcks.docking.gb28181.sip.method.invite.response.InviteResponseBuilder;
import cn.skcks.docking.gb28181.sip.utils.SipUtil; import cn.skcks.docking.gb28181.sip.utils.SipUtil;
import gov.nist.javax.sip.message.SIPRequest; import gov.nist.javax.sip.message.SIPRequest;
@ -60,6 +61,7 @@ public class PlayService {
private final SipService sipService; private final SipService sipService;
private final SipMessageSender sender; private final SipMessageSender sender;
private final SipSubscribe subscribe; private final SipSubscribe subscribe;
private final SipConfig sipConfig;
private String videoUrl(String streamId) { private String videoUrl(String streamId) {
return StringUtils.joinWith("/", zlmMediaConfig.getUrl(), "rtp", streamId + ".live.flv"); return StringUtils.joinWith("/", zlmMediaConfig.getUrl(), "rtp", streamId + ".live.flv");
@ -144,14 +146,22 @@ public class PlayService {
} }
String ssrc = ssrcService.getPlaySsrc(); String ssrc = ssrcService.getPlaySsrc();
GB28181Description description = GB28181SDPBuilder.Receiver.play(deviceId, channelId, Connection.IP4, ip, port, ssrc, MediaStreamMode.of(device.getStreamMode()));
String transport = device.getTransport(); String transport = device.getTransport();
String senderIp = device.getLocalIp(); String senderIp = device.getLocalIp();
SipProvider provider = sipService.getProvider(transport, senderIp); SipProvider provider = sipService.getProvider(transport, senderIp);
CallIdHeader callId = provider.getNewCallId(); CallIdHeader callIdHeader = provider.getNewCallId();
Request request = SipRequestBuilder.createInviteRequest(device, channelId, description.toString(), SipUtil.generateViaTag(), SipUtil.generateFromTag(), null, ssrc, callId); String callId = callIdHeader.getCallId();
String subscribeKey = GenericSubscribe.Helper.getKey(Request.INVITE, callId.getCallId()); InviteRequestBuilder inviteRequestBuilder = InviteRequestBuilder.builder()
.localId(sipConfig.getId())
.localPort(sipConfig.getPort())
.localIp(device.getLocalIp())
.targetId(deviceId)
.targetIp(device.getIp())
.targetPort(device.getPort())
.transport(device.getTransport())
.build();
Request request = inviteRequestBuilder.createPlayInviteRequest(callId, SipRequestBuilder.getCSeq(),channelId,ip,port,ssrc,MediaStreamMode.of(device.getStreamMode()));
String subscribeKey = GenericSubscribe.Helper.getKey(Request.INVITE, callIdHeader.getCallId());
subscribe.getSipResponseSubscribe().addPublisher(subscribeKey); subscribe.getSipResponseSubscribe().addPublisher(subscribeKey);
Flow.Subscriber<SIPResponse> subscriber = new Flow.Subscriber<>() { Flow.Subscriber<SIPResponse> subscriber = new Flow.Subscriber<>() {
private Flow.Subscription subscription; private Flow.Subscription subscription;
@ -194,7 +204,7 @@ public class PlayService {
subscribe.getSipResponseSubscribe().delPublisher(subscribeKey); subscribe.getSipResponseSubscribe().delPublisher(subscribeKey);
} }
}; };
byeSubscribe(callId.getCallId(),3600,()->{ byeSubscribe(callId,3600,()->{
RedisUtil.KeyOps.delete(key); RedisUtil.KeyOps.delete(key);
}); });
subscribe.getSipResponseSubscribe().addSubscribe(subscribeKey, subscriber); subscribe.getSipResponseSubscribe().addSubscribe(subscribeKey, subscriber);
@ -243,16 +253,23 @@ public class PlayService {
return result; return result;
} }
String ssrc = ssrcService.getPlaySsrc(); String ssrc = ssrcService.getPlayBackSsrc();
GB28181Description description = GB28181SDPBuilder.Receiver.playback(deviceId, channelId, Connection.IP4, ip, port, ssrc, MediaStreamMode.of(device.getStreamMode()), startTime, endTime);
String transport = device.getTransport(); String transport = device.getTransport();
String senderIp = device.getLocalIp(); String senderIp = device.getLocalIp();
SipProvider provider = sipService.getProvider(transport, senderIp); SipProvider provider = sipService.getProvider(transport, senderIp);
CallIdHeader callId = provider.getNewCallId(); CallIdHeader callIdHeader = provider.getNewCallId();
String callId = callIdHeader.getCallId();
Request request = SipRequestBuilder.createInviteRequest(device, channelId, description.toString(), SipUtil.generateViaTag(), SipUtil.generateFromTag(), null, ssrc, callId); InviteRequestBuilder inviteRequestBuilder = InviteRequestBuilder.builder()
String subscribeKey = GenericSubscribe.Helper.getKey(Request.INVITE, callId.getCallId()); .localId(sipConfig.getId())
.localPort(sipConfig.getPort())
.localIp(device.getLocalIp())
.targetId(deviceId)
.targetIp(device.getIp())
.targetPort(device.getPort())
.transport(device.getTransport())
.build();
Request request = inviteRequestBuilder.createPlaybackInviteRequest(callId, SipRequestBuilder.getCSeq(),channelId,ip,port,ssrc,MediaStreamMode.of(device.getStreamMode()),startTime,endTime);
String subscribeKey = GenericSubscribe.Helper.getKey(Request.INVITE, callIdHeader.getCallId());
subscribe.getSipResponseSubscribe().addPublisher(subscribeKey); subscribe.getSipResponseSubscribe().addPublisher(subscribeKey);
Flow.Subscriber<SIPResponse> subscriber = new Flow.Subscriber<>() { Flow.Subscriber<SIPResponse> subscriber = new Flow.Subscriber<>() {
private Flow.Subscription subscription; private Flow.Subscription subscription;
@ -296,7 +313,7 @@ public class PlayService {
subscribe.getRecordInfoSubscribe().delPublisher(subscribeKey); subscribe.getRecordInfoSubscribe().delPublisher(subscribeKey);
} }
}; };
byeSubscribe(callId.getCallId(),DateUtil.between(startTime,endTime,DateUnit.SECOND),()->{ byeSubscribe(callId,DateUtil.between(startTime,endTime,DateUnit.SECOND),()->{
RedisUtil.KeyOps.delete(key); RedisUtil.KeyOps.delete(key);
}); });
subscribe.getSipResponseSubscribe().addSubscribe(subscribeKey, subscriber); subscribe.getSipResponseSubscribe().addSubscribe(subscribeKey, subscriber);
@ -327,6 +344,7 @@ public class PlayService {
Response byeResponse = InviteResponseBuilder.builder().build().createByeResponse(item, SipUtil.nanoId()); Response byeResponse = InviteResponseBuilder.builder().build().createByeResponse(item, SipUtil.nanoId());
sipService.getProvider(transport,hostAddress).sendResponse(byeResponse); sipService.getProvider(transport,hostAddress).sendResponse(byeResponse);
cb.run(); cb.run();
subscribe.getRecordInfoSubscribe().complete(subscribeKey);
} }
@Override @Override

View File

@ -81,7 +81,7 @@ public class SsrcService {
/** /**
* 获取录像回放的SSRC值,第一位固定为1 * 获取录像回放的SSRC值,第一位固定为1
*/ */
public String getPlayBackSsrc(String mediaServerI) { public String getPlayBackSsrc() {
return "1" + getSN(); return "1" + getSN();
} }