From 65fa75fb448fe9ab7bec84559616006730149509 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 10 五月 2022 11:02:02 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/wvp-28181-2.0' into commercial
---
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 191 ++++++++++++++++++++++++++++++-----------------
1 files changed, 120 insertions(+), 71 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index 00daf10..a647c84 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -4,9 +4,11 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
+import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
+import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
@@ -25,7 +27,9 @@
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
+import com.genersoft.iot.vmp.vmanager.bean.AudioBroadcastResult;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
+import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.AudioBroadcastEvent;
import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult;
import com.genersoft.iot.vmp.service.IMediaService;
import com.genersoft.iot.vmp.service.IPlayService;
@@ -57,6 +61,9 @@
private SIPCommander cmder;
@Autowired
+ private AudioBroadcastManager audioBroadcastManager;
+
+ @Autowired
private SIPCommanderFroPlatform sipCommanderFroPlatform;
@Autowired
@@ -86,6 +93,9 @@
@Autowired
private UserSetting userSetting;
+ @Autowired
+ private DynamicTask dynamicTask;
+
@@ -100,7 +110,7 @@
String uuid = UUID.randomUUID().toString();
msg.setId(uuid);
playResult.setUuid(uuid);
- DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(userSetting.getPlayTimeout());
+ DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
playResult.setResult(result);
// 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ
resultHolder.put(key, uuid, result);
@@ -237,30 +247,27 @@
}
// 瓒呮椂澶勭悊
- Timer timer = new Timer();
+ String timeOutTaskKey = UUID.randomUUID().toString();
SSRCInfo finalSsrcInfo = ssrcInfo;
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- logger.warn(String.format("璁惧鐐规挱瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", device.getDeviceId(), channelId));
+ dynamicTask.startDelay( timeOutTaskKey,()->{
+ logger.warn(String.format("璁惧鐐规挱瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", device.getDeviceId(), channelId));
- SIPDialog dialog = streamSession.getDialogByStream(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
- if (dialog != null) {
- timeoutCallback.run(1, "鏀舵祦瓒呮椂");
- // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
- cmder.streamByeCmd(device.getDeviceId(), channelId, finalSsrcInfo.getStream(), null);
- }else {
- timeoutCallback.run(0, "鐐规挱瓒呮椂");
- mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
- mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
- streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
- }
+ SIPDialog dialog = streamSession.getDialogByStream(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
+ if (dialog != null) {
+ timeoutCallback.run(1, "鏀舵祦瓒呮椂");
+ // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
+ cmder.streamByeCmd(device.getDeviceId(), channelId, finalSsrcInfo.getStream(), null);
+ }else {
+ timeoutCallback.run(0, "鐐规挱瓒呮椂");
+ mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
+ mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
+ streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
}
- }, userSetting.getPlayTimeout());
+ }, userSetting.getPlayTimeout()*1000);
final String ssrc = ssrcInfo.getSsrc();
cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString());
- timer.cancel();
+ dynamicTask.stop(timeOutTaskKey);
// hook鍝嶅簲
onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid);
hookEvent.response(mediaServerItemInuse, response);
@@ -292,7 +299,7 @@
}
}
}, (event) -> {
- timer.cancel();
+ dynamicTask.stop(timeOutTaskKey);
mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
// 閲婃斁ssrc
mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
@@ -334,7 +341,9 @@
@Override
public MediaServerItem getNewMediaServerItem(Device device) {
- if (device == null) return null;
+ if (device == null) {
+ return null;
+ }
String mediaServerId = device.getMediaServerId();
MediaServerItem mediaServerItem;
if (mediaServerId == null) {
@@ -353,7 +362,9 @@
String endTime,InviteStreamCallback inviteStreamCallback,
PlayBackCallback callback) {
Device device = storager.queryVideoDevice(deviceId);
- if (device == null) return null;
+ if (device == null) {
+ return null;
+ }
MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true);
@@ -365,7 +376,9 @@
String deviceId, String channelId, String startTime,
String endTime, InviteStreamCallback infoCallBack,
PlayBackCallback playBackCallback) {
- if (mediaServerItem == null || ssrcInfo == null) return null;
+ if (mediaServerItem == null || ssrcInfo == null) {
+ return null;
+ }
String uuid = UUID.randomUUID().toString();
String key = DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId;
DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(30000L);
@@ -380,34 +393,31 @@
msg.setId(uuid);
msg.setKey(key);
PlayBackResult<RequestMessage> playBackResult = new PlayBackResult<>();
-
- Timer timer = new Timer();
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- logger.warn(String.format("璁惧鍥炴斁瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId));
- playBackResult.setCode(-1);
- playBackResult.setData(msg);
- playBackCallback.call(playBackResult);
- SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream());
+ String playBackTimeOutTaskKey = UUID.randomUUID().toString();
+ dynamicTask.startDelay(playBackTimeOutTaskKey, ()->{
+ logger.warn(String.format("璁惧鍥炴斁瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId));
+ playBackResult.setCode(-1);
+ playBackResult.setData(msg);
+ playBackCallback.call(playBackResult);
+ SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream());
+ // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
+ if (dialog != null) {
// 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
- if (dialog != null) {
- // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
- cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
- }else {
- mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
- mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream());
- streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
- }
cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
- // 鍥炲涔嬪墠鎵�鏈夌殑鐐规挱璇锋眰
- playBackCallback.call(playBackResult);
+ }else {
+ mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
+ mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream());
+ streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
}
- }, userSetting.getPlayTimeout());
+ cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
+ // 鍥炲涔嬪墠鎵�鏈夌殑鐐规挱璇锋眰
+ playBackCallback.call(playBackResult);
+ }, userSetting.getPlayTimeout()*1000);
+
cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack,
(InviteStreamInfo inviteStreamInfo) -> {
logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + inviteStreamInfo.getResponse().toJSONString());
- timer.cancel();
+ dynamicTask.stop(playBackTimeOutTaskKey);
StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
if (streamInfo == null) {
logger.warn("璁惧鍥炴斁API璋冪敤澶辫触锛�");
@@ -425,7 +435,7 @@
playBackResult.setResponse(inviteStreamInfo.getResponse());
playBackCallback.call(playBackResult);
}, event -> {
- timer.cancel();
+ dynamicTask.stop(playBackTimeOutTaskKey);
msg.setData(String.format("鍥炴斁澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg));
playBackResult.setCode(-1);
playBackResult.setData(msg);
@@ -439,7 +449,9 @@
@Override
public DeferredResult<ResponseEntity<String>> download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
Device device = storager.queryVideoDevice(deviceId);
- if (device == null) return null;
+ if (device == null) {
+ return null;
+ }
MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true);
@@ -448,7 +460,9 @@
@Override
public DeferredResult<ResponseEntity<String>> download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
- if (mediaServerItem == null || ssrcInfo == null) return null;
+ if (mediaServerItem == null || ssrcInfo == null) {
+ return null;
+ }
String uuid = UUID.randomUUID().toString();
String key = DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId;
DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(30000L);
@@ -467,34 +481,31 @@
PlayBackResult<RequestMessage> downloadResult = new PlayBackResult<>();
downloadResult.setData(msg);
- Timer timer = new Timer();
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- logger.warn(String.format("褰曞儚涓嬭浇璇锋眰瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId));
- wvpResult.setCode(-1);
- wvpResult.setMsg("褰曞儚涓嬭浇璇锋眰瓒呮椂");
- downloadResult.setCode(-1);
- hookCallBack.call(downloadResult);
- SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream());
+ String downLoadTimeOutTaskKey = UUID.randomUUID().toString();
+ dynamicTask.startDelay(downLoadTimeOutTaskKey, ()->{
+ logger.warn(String.format("褰曞儚涓嬭浇璇锋眰瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId));
+ wvpResult.setCode(-1);
+ wvpResult.setMsg("褰曞儚涓嬭浇璇锋眰瓒呮椂");
+ downloadResult.setCode(-1);
+ hookCallBack.call(downloadResult);
+ SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream());
+ // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
+ if (dialog != null) {
// 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
- if (dialog != null) {
- // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
- cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
- }else {
- mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
- mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream());
- streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
- }
cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
- // 鍥炲涔嬪墠鎵�鏈夌殑鐐规挱璇锋眰
- hookCallBack.call(downloadResult);
+ }else {
+ mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
+ mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream());
+ streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
}
- }, userSetting.getPlayTimeout());
+ cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
+ // 鍥炲涔嬪墠鎵�鏈夌殑鐐规挱璇锋眰
+ hookCallBack.call(downloadResult);
+ }, userSetting.getPlayTimeout()*1000);
cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack,
inviteStreamInfo -> {
logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + inviteStreamInfo.getResponse().toJSONString());
- timer.cancel();
+ dynamicTask.stop(downLoadTimeOutTaskKey);
StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
streamInfo.setStartTime(startTime);
streamInfo.setEndTime(endTime);
@@ -515,7 +526,7 @@
downloadResult.setResponse(inviteStreamInfo.getResponse());
hookCallBack.call(downloadResult);
}, event -> {
- timer.cancel();
+ dynamicTask.stop(downLoadTimeOutTaskKey);
downloadResult.setCode(-1);
wvpResult.setCode(-1);
wvpResult.setMsg(String.format("褰曞儚涓嬭浇澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg));
@@ -616,4 +627,42 @@
}
}
}
+
+ @Override
+ public void audioBroadcast(Device device, String channelId, int timeout, AudioBroadcastEvent event) {
+ if (device == null || channelId == null) {
+ return;
+ }
+ DeviceChannel deviceChannel = storager.queryChannel(device.getDeviceId(), channelId);
+ if (deviceChannel == null) {
+ logger.warn("寮�鍚闊冲箍鎾殑鏃跺�欐湭鎵惧埌閫氶亾锛� {}", channelId);
+ event.call("寮�鍚闊冲箍鎾殑鏃跺�欐湭鎵惧埌閫氶亾");
+ return;
+ }
+ // 鏌ヨ閫氶亾浣跨敤鐘舵��
+ if (audioBroadcastManager.exit(device.getDeviceId(), channelId)) {
+ logger.warn("璇煶骞挎挱宸茬粡寮�鍚細 {}", channelId);
+ event.call("璇煶骞挎挱宸茬粡寮�鍚�");
+ return;
+ }
+ String timeOutTaskKey = "audio-broadcast-" + device.getDeviceId() + channelId;
+ dynamicTask.startDelay(timeOutTaskKey, ()->{
+ logger.error("璇煶骞挎挱鍙戦�佽秴鏃讹細 {}:{}", device.getDeviceId(), channelId);
+ event.call("璇煶骞挎挱鍙戦�佽秴鏃�");
+ audioBroadcastManager.del(device.getDeviceId(), channelId);
+ }, timeout * 1000);
+
+ // 鍙戦�侀�氱煡
+ cmder.audioBroadcastCmd(device, channelId, eventResultForOk -> {
+ // 鍙戦�佹垚鍔�
+ AudioBroadcastCatch audioBroadcastCatch = new AudioBroadcastCatch(device.getDeviceId(), channelId, AudioBroadcastCatchStatus.Ready);
+ audioBroadcastManager.add(audioBroadcastCatch);
+ }, eventResultForError -> {
+ dynamicTask.stop(timeOutTaskKey);
+ // 鍙戦�佸け璐�
+ logger.error("璇煶骞挎挱鍙戦�佸け璐ワ細 {}:{}", channelId, eventResultForError.msg);
+ event.call("璇煶骞挎挱鍙戦�佸け璐�");
+ audioBroadcastManager.del(device.getDeviceId(), channelId);
+ });
+ }
}
--
Gitblit v1.8.0