From 6e48dd3f327da941ca63e85b97992ff13a148434 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 10 五月 2022 09:46:47 +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