优化对讲逻辑

结构优化
648540858 2022-07-03 00:44:36 +08:00
parent b6c97528ae
commit 72c1b36d6d
5 changed files with 128 additions and 106 deletions

View File

@ -93,7 +93,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser(); String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(platformGbId, null, null, callIdHeader.getCallId()); SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(platformGbId, null, null, callIdHeader.getCallId());
logger.info("收到bye, [{}/{}]", platformGbId, channelId); logger.info("收到bye, [{}/{}]", platformGbId, channelId);
if (sendRtpItem != null){ if (sendRtpItem != null ){
String streamId = sendRtpItem.getStreamId(); String streamId = sendRtpItem.getStreamId();
Map<String, Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
param.put("vhost","__defaultVhost__"); param.put("vhost","__defaultVhost__");

View File

@ -834,83 +834,87 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
subscribeKey.put("mediaServerId", mediaServerItem.getId()); subscribeKey.put("mediaServerId", mediaServerItem.getId());
String finalSsrc = ssrc; String finalSsrc = ssrc;
// 流已经存在时直接推流 // 流已经存在时直接推流
JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem, app, "rtsp", stream); // JSONObject mediaInfo = zlmresTfulUtils.getMediaList(mediaServerItem, app, stream);
JSONArray tracks = mediaInfo.getJSONArray("tracks"); // System.out.println(mediaInfo != null);
Integer codecId = null; // System.out.println(mediaInfo);
if (tracks != null && tracks.size() > 0) { // if (mediaInfo != null &&
for (int i = 0; i < tracks.size(); i++) { // (mediaInfo.getInteger("code") != null && mediaInfo.getInteger("code") == 0
MediaItem.MediaTrack track = JSON.toJavaObject((JSON)tracks.get(i),MediaItem.MediaTrack.class); // && mediaInfo.getJSONArray("data") != null && mediaInfo.getJSONArray("data").size() > 0)) {
if (track.getCodecType() == 1) { // logger.info("发现已经在推流");
codecId = track.getCodecId(); // JSONArray tracks = mediaInfo.getJSONArray("data").getJSONObject(0).getJSONArray("tracks");
break; // Integer codecId = null;
} // if (tracks != null && tracks.size() > 0) {
} // for (int i = 0; i < tracks.size(); i++) {
} // MediaItem.MediaTrack track = JSON.toJavaObject((JSON)tracks.get(i),MediaItem.MediaTrack.class);
if ((mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online"))) { // if (track.getCodecType() == 1) {
logger.info("发现已经在推流"); // codecId = track.getCodecId();
sendRtpItem.setStatus(2); // break;
redisCatchStorage.updateSendRTPSever(sendRtpItem); // }
StringBuffer content = new StringBuffer(200); // }
content.append("v=0\r\n"); // }
content.append("o="+ config.getId() +" "+ sdp.getOrigin().getSessionId() +" " + sdp.getOrigin().getSessionVersion() + " IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); // sendRtpItem.setStatus(2);
content.append("s=Play\r\n"); // redisCatchStorage.updateSendRTPSever(sendRtpItem);
content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); // StringBuffer content = new StringBuffer(200);
content.append("t=0 0\r\n"); // content.append("v=0\r\n");
if (codecId == null) { // content.append("o="+ config.getId() +" "+ sdp.getOrigin().getSessionId() +" " + sdp.getOrigin().getSessionVersion() + " IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
if (mediaTransmissionTCP) { // content.append("s=Play\r\n");
content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 8\r\n"); // content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
}else { // content.append("t=0 0\r\n");
content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n"); // if (codecId == null) {
} // if (mediaTransmissionTCP) {
// content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 8\r\n");
content.append("a=rtpmap:8 PCMA/8000\r\n"); // }else {
}else { // content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n");
if (codecId == 4) { // }
if (mediaTransmissionTCP) { //
content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 0\r\n"); // content.append("a=rtpmap:8 PCMA/8000\r\n");
}else { // }else {
content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 0\r\n"); // if (codecId == 4) {
} // if (mediaTransmissionTCP) {
content.append("a=rtpmap:0 PCMU/8000\r\n"); // content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 0\r\n");
}else { // }else {
if (mediaTransmissionTCP) { // content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 0\r\n");
content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 8\r\n"); // }
}else { // content.append("a=rtpmap:0 PCMU/8000\r\n");
content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n"); // }else {
} // if (mediaTransmissionTCP) {
content.append("a=rtpmap:8 PCMA/8000\r\n"); // content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 8\r\n");
} // }else {
} // content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n");
if (sendRtpItem.isTcp()) { // }
content.append("a=connection:new\r\n"); // content.append("a=rtpmap:8 PCMA/8000\r\n");
if (!sendRtpItem.isTcpActive()) { // }
content.append("a=setup:active\r\n"); // }
}else { // if (sendRtpItem.isTcp()) {
content.append("a=setup:passive\r\n"); // content.append("a=connection:new\r\n");
} // if (!sendRtpItem.isTcpActive()) {
} // content.append("a=setup:active\r\n");
content.append("a=sendonly\r\n"); // }else {
content.append("y="+ finalSsrc + "\r\n"); // content.append("a=setup:passive\r\n");
content.append("f=v/////a/1/8/1\r\n"); // }
// }
ParentPlatform parentPlatform = new ParentPlatform(); // content.append("a=sendonly\r\n");
parentPlatform.setServerIP(device.getIp()); // content.append("y="+ finalSsrc + "\r\n");
parentPlatform.setServerPort(device.getPort()); // content.append("f=v/////a/1/8/1\r\n");
parentPlatform.setServerGBId(device.getDeviceId()); //
try { // ParentPlatform parentPlatform = new ParentPlatform();
responseSdpAck(evt, content.toString(), parentPlatform); // parentPlatform.setServerIP(device.getIp());
Dialog dialog = evt.getDialog(); // parentPlatform.setServerPort(device.getPort());
audioBroadcastCatch.setDialog((SIPDialog) dialog); // parentPlatform.setServerGBId(device.getDeviceId());
audioBroadcastCatch.setRequest((SIPRequest) request); // try {
audioBroadcastManager.update(audioBroadcastCatch); // responseSdpAck(evt, content.toString(), parentPlatform);
} catch (SipException e) { // Dialog dialog = evt.getDialog();
throw new RuntimeException(e); // audioBroadcastCatch.setDialog((SIPDialog) dialog);
} catch (InvalidArgumentException e) { // audioBroadcastCatch.setRequest((SIPRequest) request);
throw new RuntimeException(e); // audioBroadcastManager.update(audioBroadcastCatch);
} catch (ParseException e) { // } catch (SipException e) {
throw new RuntimeException(e); // throw new RuntimeException(e);
} // } catch (InvalidArgumentException e) {
}else { // throw new RuntimeException(e);
// } catch (ParseException e) {
// throw new RuntimeException(e);
// }
// }else {
// 流不存在时监听流上线 // 流不存在时监听流上线
// 设置等待推流的超时; 默认20s // 设置等待推流的超时; 默认20s
String waiteStreamTimeoutTaskKey = "waite-stream-" + device.getDeviceId() + audioBroadcastCatch.getChannelId(); String waiteStreamTimeoutTaskKey = "waite-stream-" + device.getDeviceId() + audioBroadcastCatch.getChannelId();
@ -1012,7 +1016,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
throw new RuntimeException(e); throw new RuntimeException(e);
} }
}); });
} // }
String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + device.getDeviceId(); String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + device.getDeviceId();
WVPResult<AudioBroadcastResult> wvpResult = new WVPResult<>(); WVPResult<AudioBroadcastResult> wvpResult = new WVPResult<>();
wvpResult.setCode(0); wvpResult.setCode(0);

View File

@ -294,11 +294,11 @@ public class ZLMRTPServerFactory {
return 0; return 0;
} }
Integer code = mediaInfo.getInteger("code"); Integer code = mediaInfo.getInteger("code");
if ( code < 0) { if (code < 0) {
logger.warn("查询流({}/{})是否有其它观看者时得到: {}", app, streamId, mediaInfo.getString("msg")); logger.warn("查询流({}/{})是否有其它观看者时得到: {}", app, streamId, mediaInfo.getString("msg"));
return -1; return -1;
} }
if ( code == 0 && ! mediaInfo.getBoolean("online")) { if ( code == 0 && mediaInfo.getBoolean("online") != null && ! mediaInfo.getBoolean("online")) {
logger.warn("查询流({}/{})是否有其它观看者时得到: {}", app, streamId, mediaInfo.getString("msg")); logger.warn("查询流({}/{})是否有其它观看者时得到: {}", app, streamId, mediaInfo.getString("msg"));
return -1; return -1;
} }

View File

@ -15,6 +15,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils; import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
@ -75,6 +76,9 @@ public class PlayServiceImpl implements IPlayService {
@Autowired @Autowired
private IRedisCatchStorage redisCatchStorage; private IRedisCatchStorage redisCatchStorage;
@Autowired
private ZLMRTPServerFactory zlmrtpServerFactory;
@Autowired @Autowired
private DeferredResultHolder resultHolder; private DeferredResultHolder resultHolder;
@ -678,9 +682,14 @@ public class PlayServiceImpl implements IPlayService {
if (audioBroadcastManager.exit(device.getDeviceId(), channelId)) { if (audioBroadcastManager.exit(device.getDeviceId(), channelId)) {
SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(device.getDeviceId(), channelId, null, null); SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(device.getDeviceId(), channelId, null, null);
if (sendRtpItem != null && sendRtpItem.isOnlyAudio()) { if (sendRtpItem != null && sendRtpItem.isOnlyAudio()) {
logger.warn("语音广播已经开启: {}", channelId); // 查询流是否存在,不存在则认为是异常状态
event.call("语音广播已经开启"); MediaServerItem mediaServerItem = mediaServerService.getOne(sendRtpItem.getMediaServerId());
return; Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, sendRtpItem.getApp(), sendRtpItem.getStreamId());
if (streamReady) {
logger.warn("语音广播已经开启: {}", channelId);
event.call("语音广播已经开启");
return;
}
} }
} }
@ -712,10 +721,13 @@ public class PlayServiceImpl implements IPlayService {
param.put("app", sendRtpItem.getApp()); param.put("app", sendRtpItem.getApp());
param.put("stream", sendRtpItem.getStreamId()); param.put("stream", sendRtpItem.getStreamId());
zlmresTfulUtils.stopSendRtp(mediaInfo, param); zlmresTfulUtils.stopSendRtp(mediaInfo, param);
// 立刻结束设备的推流,等待自行结束太慢
// zlmresTfulUtils.closeStreams(mediaInfo, sendRtpItem.getApp(), sendRtpItem.getStreamId());
} }
if (audioBroadcastCatch.getStatus() == AudioBroadcastCatchStatus.Ok) { if (audioBroadcastCatch.getStatus() == AudioBroadcastCatchStatus.Ok) {
cmder.streamByeCmd(audioBroadcastCatch.getDialog(), audioBroadcastCatch.getRequest(), null); cmder.streamByeCmd(audioBroadcastCatch.getDialog(), audioBroadcastCatch.getRequest(), null);
} }
} catch (SipException e) { } catch (SipException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (ParseException e) { } catch (ParseException e) {

View File

@ -537,6 +537,9 @@ export default {
this.stopPlayRecord(); this.stopPlayRecord();
} }
this.recordPlay = '' this.recordPlay = ''
if (this.broadcastStatus === 1) {
this.stopBroadcast()
}
}, },
copySharedInfo: function (data) { copySharedInfo: function (data) {
@ -849,24 +852,7 @@ export default {
} }
}); });
}else if (this.broadcastStatus === 1) { }else if (this.broadcastStatus === 1) {
this.broadcastRtc.close() this.stopBroadcast()
this.broadcastRtc = null;
this.$axios({
method: 'get',
url: '/api/play/broadcast/stop/' + this.deviceId + '/' + this.channelId
}).then( (res)=> {
if (res.data.code == 0) {
let streamInfo = res.data.data.streamInfo;
this.startBroadcast(streamInfo.rtc)
}else {
this.$message({
showClose: true,
message: res.data.msg,
type: "error",
});
}
});
this.broadcastStatus = -1;
} }
}, },
startBroadcast(url){ startBroadcast(url){
@ -920,12 +906,12 @@ export default {
}); });
this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_ON_CONNECTION_STATE_CHANGE,(e)=>{// offer anwser this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_ON_CONNECTION_STATE_CHANGE,(e)=>{// offer anwser
console.log('状态改变',e) console.log('状态改变',e)
if (e === "failed") { if (e === "connecting") {
this.broadcastStatus = -1;
}else if (e === "connecting") {
this.broadcastStatus = 0; this.broadcastStatus = 0;
}else{ }else if (e === "connected") {
this.broadcastStatus = 1; this.broadcastStatus = 1;
}else {
this.broadcastStatus = -1;
} }
}); });
this.broadcastRtc.on(ZLMRTCClient.Events.CAPTURE_STREAM_FAILED,(e)=>{// offer anwser this.broadcastRtc.on(ZLMRTCClient.Events.CAPTURE_STREAM_FAILED,(e)=>{// offer anwser
@ -936,6 +922,26 @@ export default {
type: 'error' type: 'error'
}); });
}); });
},
stopBroadcast(){
this.broadcastRtc.close()
this.broadcastRtc = null;
this.$axios({
method: 'get',
url: '/api/play/broadcast/stop/' + this.deviceId + '/' + this.channelId
}).then( (res)=> {
if (res.data.code == 0) {
// this.broadcastStatus = -1;
}else {
this.$message({
showClose: true,
message: res.data.msg,
type: "error",
});
}
});
} }
} }
}; };