From f6320c7dd3dfd25e98bb63f41d79a33af5009a93 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 17 十月 2022 17:02:16 +0800
Subject: [PATCH] 合并主线

---
 src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java |  332 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 196 insertions(+), 136 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 68055a4..e24fa63 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
@@ -10,19 +10,26 @@
 import javax.sip.SipException;
 
 import com.genersoft.iot.vmp.gb28181.bean.*;
+import com.genersoft.iot.vmp.common.VideoManagerConstants;
 import com.genersoft.iot.vmp.conf.exception.ControllerException;
+import com.genersoft.iot.vmp.conf.exception.ServiceException;
 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
+import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
 import com.genersoft.iot.vmp.service.IDeviceService;
 import com.genersoft.iot.vmp.vmanager.bean.AudioBroadcastResult;
+import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
 import org.springframework.web.context.request.async.DeferredResult;
 
 import com.alibaba.fastjson.JSON;
@@ -136,7 +143,7 @@
         String uuid = UUID.randomUUID().toString();
         msg.setId(uuid);
         playResult.setUuid(uuid);
-        DeferredResult<WVPResult<String>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
+        DeferredResult<WVPResult<StreamInfo>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
         playResult.setResult(result);
         // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ
         resultHolder.put(key, uuid, result);
@@ -156,6 +163,7 @@
                     StreamInfo streamInfoForSuccess = (StreamInfo) wvpResult.getData();
                     MediaServerItem mediaInfo = mediaServerService.getOne(streamInfoForSuccess.getMediaServerId());
                     String streamUrl = streamInfoForSuccess.getFmp4();
+
                     // 璇锋眰鎴浘
                     logger.info("[璇锋眰鎴浘]: " + fileName);
                     zlmresTfulUtils.getSnap(mediaInfo, streamUrl, 15, 1, path, fileName);
@@ -290,150 +298,155 @@
             logger.info("[瀵硅] 绔彛鍒嗛厤寮傚父锛宒eviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, ssrcInfo);
             return;
         }
-        try {
-            String callId = SipUtils.getNewCallId();
-            cmder.talkStreamCmd(mediaServerItem, ssrcInfo, device, channelId, callId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
-                logger.info("[瀵硅] 娴佸凡鐢熸垚锛� 寮�濮嬫帹娴侊細 " + response.toJSONString());
-                dynamicTask.stop(timeOutTaskKey);
-                // TODO 鏆備笉鍋氬鐞�
-            }, (MediaServerItem mediaServerItemInuse, JSONObject json) -> {
-                logger.info("[瀵硅] 寮�濮嬫帹娴侊細 " + json.toJSONString());
-                dynamicTask.stop(timeOutTaskKey);
-                // 鑾峰彇杩滅▼IP绔彛 浣滀负鍥炲璇煶娴佺殑鍦板潃
-                String ip = json.getString("ip");
-                Integer port = json.getInteger("port");
-                logger.info("[杩滅璁惧寮�濮嬫帹娴乚{}/{}, 鏉ヨ嚜ip锛歿}, 绔彛锛歿}", device.getDeviceId(), channelId, ip, port);
-                // 鏌ョ湅骞冲彴鎺ㄦ祦鏄惁灏辩华
-                Boolean ready = zlmrtpServerFactory.isStreamReady(mediaServerItemInuse, "talk", stream);
-                if (!ready) {
-                    try {
-                        cmder.streamByeCmd(device, channelId, finalSsrcInfo.getStream(), null);
-                    } catch (InvalidArgumentException | ParseException | SipException e) {
-                        logger.error("[瀵硅瓒呮椂]锛� 鍙戦�丅YE澶辫触 {}", e.getMessage());
-                    } catch (SsrcTransactionNotFoundException e) {
-                        timeoutCallback.run();
-                        mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
-                        mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
-                        streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
-                    }
-                }else {
-                    SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, ip, port, ssrcInfo.getSsrc(), device.getDeviceId(),
-                            device.getDeviceId(), channelId,
-                            false);
 
-                    sendRtpItem.setTcpActive(false);
-                    if (sendRtpItem == null || sendRtpItem.getLocalPort() == 0) {
-                        logger.warn("鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
-                        try {
-                            cmder.streamByeCmd(device, channelId, finalSsrcInfo.getStream(), null);
-                        } catch (InvalidArgumentException | ParseException | SipException e) {
-                            logger.error("[瀵硅瓒呮椂]锛� 鍙戦�丅YE澶辫触 {}", e.getMessage());
-                        } catch (SsrcTransactionNotFoundException e) {
-                            timeoutCallback.run();
-                            mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
-                            mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
-                            streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
-                        }
-                        return;
-                    }
-                    sendRtpItem.setCallId(callId);
-                    sendRtpItem.setPlayType(InviteStreamType.TALK);
-                    sendRtpItem.setStatus(1);
-                    sendRtpItem.setIp(ip);
-                    sendRtpItem.setPort(port);
-                    sendRtpItem.setTcpActive(false);
-                    sendRtpItem.setStreamId(ssrcInfo.getStream());
-                    sendRtpItem.setApp("talk");
-                    sendRtpItem.setSsrc(ssrc);
-                    redisCatchStorage.updateSendRTPSever(sendRtpItem);
-
-                    Map<String, Object> param = new HashMap<>(12);
-                    param.put("vhost","__defaultVhost__");
-                    param.put("app",sendRtpItem.getApp());
-                    param.put("stream",sendRtpItem.getStreamId());
-                    param.put("ssrc", sendRtpItem.getSsrc());
-                    param.put("src_port", sendRtpItem.getLocalPort());
-                    param.put("pt", sendRtpItem.getPt());
-                    param.put("use_ps", sendRtpItem.isUsePs() ? "1" : "0");
-                    param.put("only_audio", sendRtpItem.isOnlyAudio() ? "1" : "0");
-                    JSONObject jsonObject = zlmrtpServerFactory.startSendRtpStream(mediaServerItemInuse, param);
-                    System.out.println(11111);
-                    System.out.println(jsonObject);
-                }
-
-            }, (event) -> {
-//                ResponseEvent responseEvent = (ResponseEvent) event.event;
-//                String contentString = new String(responseEvent.getResponse().getRawContent());
-//                // 鑾峰彇ssrc
-//                int ssrcIndex = contentString.indexOf("y=");
-//                // 妫�鏌ユ槸鍚︽湁y瀛楁
-//                if (ssrcIndex >= 0) {
-//                    //ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈� TODO 鍚庣画瀵逛笉瑙勮寖鐨勯潪10浣峴src鍏煎
-//                    String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12);
-//                    // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞�
-//                    if (ssrc.equals(ssrcInResponse)) {
-//                        return;
-//                    }
-//                    logger.info("[瀵硅娑堟伅] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse);
-//                    if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
-//                        logger.info("[瀵硅娑堟伅] SSRC淇 {}->{}", ssrc, ssrcInResponse);
+        String callId = SipUtils.getNewCallId();
+        boolean pushing = false;
+        // 鏌ョ湅璁惧鏄惁宸茬粡鍦ㄦ帹娴�
+//        MediaItem mediaItem = zlmrtpServerFactory.getMediaInfo(mediaServerItem, "rtp",ssrcInfo.getStream());
+//        if (mediaItem != null) {
+//            SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem,
+//                    mediaItem.getOriginSock().getPeer_ip(), mediaItem.getOriginSock().getPeer_port(), ssrcInfo.getSsrc(), device.getDeviceId(),
+//                    device.getDeviceId(), channelId,
+//                    false);
 //
-//                        if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) {
-//                            // ssrc 涓嶅彲鐢�
-//                            // 閲婃斁ssrc
+//            sendRtpItem.setTcpActive(false);
+//            sendRtpItem.setCallId(callId);
+//            sendRtpItem.setPlayType(InviteStreamType.TALK);
+//            sendRtpItem.setStatus(1);
+//            sendRtpItem.setIp(mediaItem.getOriginSock().getPeer_ip());
+//            sendRtpItem.setPort(mediaItem.getOriginSock().getPeer_port());
+//            sendRtpItem.setTcpActive(false);
+//            sendRtpItem.setStreamId(ssrcInfo.getStream());
+//            sendRtpItem.setApp("1000");
+//            sendRtpItem.setStreamId("1000");
+//            sendRtpItem.setSsrc(ssrc);
+//            sendRtpItem.setOnlyAudio(true);
+//            redisCatchStorage.updateSendRTPSever(sendRtpItem);
+//
+//            Map<String, Object> param = new HashMap<>(12);
+//            param.put("vhost","__defaultVhost__");
+//            param.put("app",sendRtpItem.getApp());
+//            param.put("stream",sendRtpItem.getStreamId());
+//            param.put("ssrc", sendRtpItem.getSsrc());
+//            param.put("dst_url", sendRtpItem.getIp());
+//            param.put("dst_port", sendRtpItem.getPort());
+//            param.put("src_port", sendRtpItem.getLocalPort());
+//            param.put("pt", sendRtpItem.getPt());
+//            param.put("use_ps", sendRtpItem.isUsePs() ? "1" : "0");
+//            param.put("is_udp", sendRtpItem.isTcp() ? "0" : "1");
+//            param.put("only_audio", sendRtpItem.isOnlyAudio() ? "1" : "0");
+//            JSONObject jsonObject = zlmrtpServerFactory.startSendRtpStream(mediaServerItem, param);
+//            System.out.println(2222);
+//            System.out.println(jsonObject);
+//        }else {
+            try {
+                cmder.talkStreamCmd(mediaServerItem, ssrcInfo, device, channelId, callId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
+                    logger.info("[瀵硅] 娴佸凡鐢熸垚锛� 寮�濮嬫帹娴侊細 " + response.toJSONString());
+                    dynamicTask.stop(timeOutTaskKey);
+                    // TODO 鏆備笉鍋氬鐞�
+                }, (MediaServerItem mediaServerItemInuse, JSONObject json) -> {
+                    logger.info("[瀵硅] 璁惧寮�濮嬫帹娴侊細 " + json.toJSONString());
+                    dynamicTask.stop(timeOutTaskKey);
+                    // 鑾峰彇杩滅▼IP绔彛 浣滀负鍥炲璇煶娴佺殑鍦板潃
+                    String ip = json.getString("ip");
+                    Integer port = json.getInteger("port");
+                    logger.info("[璁惧寮�濮嬫帹娴乚{}/{}, 鏉ヨ嚜ip锛歿}, 绔彛锛歿}", device.getDeviceId(), channelId, ip, port);
+                    // 鏌ョ湅骞冲彴鎺ㄦ祦鏄惁灏辩华
+//                    Boolean ready = zlmrtpServerFactory.isStreamReady(mediaServerItemInuse, "talk", stream);
+//                    if (!ready) {
+//                        try {
+//                            cmder.streamByeCmd(device, channelId, finalSsrcInfo.getStream(), null);
+//                        } catch (InvalidArgumentException | ParseException | SipException e) {
+//                            logger.error("[瀵硅瓒呮椂]锛� 鍙戦�丅YE澶辫触 {}", e.getMessage());
+//                        } catch (SsrcTransactionNotFoundException e) {
+//                            timeoutCallback.run();
 //                            mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
+//                            mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
 //                            streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
-//                            event.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�";
-//                            event.statusCode = 400;
-//                            errorEvent.response(event);
+//                        }
+//                    }else {
+//                        try {
+//                            Thread.sleep(1000);
+//                        } catch (InterruptedException e) {
+//                            throw new RuntimeException(e);
+//                        }
+                        SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, ip, port, ssrcInfo.getSsrc(), device.getDeviceId(),
+                                device.getDeviceId(), channelId,
+                                false);
+
+
+//                        if (sendRtpItem.getLocalPort() == 0) {
+//                            logger.warn("鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
+//                            try {
+//                                cmder.streamByeCmd(device, channelId, finalSsrcInfo.getStream(), null);
+//                            } catch (InvalidArgumentException | ParseException | SipException e) {
+//                                logger.error("[瀵硅瓒呮椂]锛� 鍙戦�丅YE澶辫触 {}", e.getMessage());
+//                            } catch (SsrcTransactionNotFoundException e) {
+//                                timeoutCallback.run();
+//                                mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
+//                                mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
+//                                streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
+//                            }
 //                            return;
 //                        }
-//
-//                        // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚�
-//                        if (!mediaServerItem.isRtpEnable()) {
-//                            // 娣诲姞璁㈤槄
-//                            HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId());
-//                            subscribe.removeSubscribe(hookSubscribe);
-//                            hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase());
-//                            subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response) -> {
-//                                logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + response.toJSONString());
-//                                dynamicTask.stop(timeOutTaskKey);
-//                                // hook鍝嶅簲
-//                                onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid);
-//                                hookEvent.response(mediaServerItemInUse, response);
-//                            });
-//                        }
-//                        // 鍏抽棴rtp server
-//                        mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
-//                        // 閲嶆柊寮�鍚痵src server
-//                        mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, finalSsrcInfo.getPort());
-//
+                        sendRtpItem.setTcpActive(false);
+                        sendRtpItem.setCallId(callId);
+                        sendRtpItem.setPlayType(InviteStreamType.TALK);
+                        sendRtpItem.setStatus(1);
+                        sendRtpItem.setIp(ip);
+                        sendRtpItem.setPort(port);
+                        sendRtpItem.setTcpActive(false);
+                        sendRtpItem.setApp("1000");
+                        sendRtpItem.setStreamId("1000");
+                        sendRtpItem.setSsrc(ssrc);
+                        sendRtpItem.setOnlyAudio(true);
+                        redisCatchStorage.updateSendRTPSever(sendRtpItem);
+
+                        Map<String, Object> param = new HashMap<>(12);
+                        param.put("vhost","__defaultVhost__");
+                        param.put("app",sendRtpItem.getApp());
+                        param.put("stream",sendRtpItem.getStreamId());
+                        param.put("ssrc", sendRtpItem.getSsrc());
+                        param.put("dst_url", sendRtpItem.getIp());
+                        param.put("dst_port", sendRtpItem.getPort());
+                        param.put("src_port", sendRtpItem.getLocalPort());
+                        param.put("pt", sendRtpItem.getPt());
+                        param.put("use_ps", sendRtpItem.isUsePs() ? "1" : "0");
+                        param.put("is_udp", sendRtpItem.isTcp() ? "0" : "1");
+                        param.put("only_audio", sendRtpItem.isOnlyAudio() ? "1" : "0");
+                        JSONObject jsonObject = zlmrtpServerFactory.startSendRtpStream(mediaServerItemInuse, param);
+                        System.out.println(11111);
+                        System.out.println(sendRtpItem.getIp() + ":" + sendRtpItem.getPort());
+//                        System.out.println(jsonObject);
 //                    }
-//                }
-            }, (event) -> {
+
+                }, (event) -> {
+
+                }, (event) -> {
+                    dynamicTask.stop(timeOutTaskKey);
+                    mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
+                    // 閲婃斁ssrc
+                    mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
+
+                    streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
+                    errorEvent.response(event);
+                });
+            } catch (InvalidArgumentException | SipException | ParseException e) {
+
+                logger.error("[鍛戒护鍙戦�佸け璐 瀵硅娑堟伅: {}", e.getMessage());
                 dynamicTask.stop(timeOutTaskKey);
                 mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
                 // 閲婃斁ssrc
                 mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
 
                 streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
-                errorEvent.response(event);
-            });
-        } catch (InvalidArgumentException | SipException | ParseException e) {
+                SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null));
+                eventResult.msg = "鍛戒护鍙戦�佸け璐�";
+                errorEvent.response(eventResult);
+            }
+//        }
 
-            logger.error("[鍛戒护鍙戦�佸け璐 瀵硅娑堟伅: {}", e.getMessage());
-            dynamicTask.stop(timeOutTaskKey);
-            mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
-            // 閲婃斁ssrc
-            mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
-
-            streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
-            SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null));
-            eventResult.msg = "鍛戒护鍙戦�佸け璐�";
-            errorEvent.response(eventResult);
-        }
     }
-
 
     @Override
     public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
@@ -593,12 +606,11 @@
         if (device == null) {
             return null;
         }
-        String mediaServerId = device.getMediaServerId();
         MediaServerItem mediaServerItem;
-        if (mediaServerId == null) {
+        if (ObjectUtils.isEmpty(device.getMediaServerId()) || "auto".equals(device.getMediaServerId())) {
             mediaServerItem = mediaServerService.getMediaServerForMinimumLoad();
         } else {
-            mediaServerItem = mediaServerService.getOne(mediaServerId);
+            mediaServerItem = mediaServerService.getOne(device.getMediaServerId());
         }
         if (mediaServerItem == null) {
             logger.warn("鐐规挱鏃舵湭鎵惧埌鍙娇鐢ㄧ殑ZLM...");
@@ -953,7 +965,7 @@
                         cmder.streamByeCmd(device, ssrcTransaction.getChannelId(),
                                 ssrcTransaction.getStream(), null);
                     } catch (InvalidArgumentException | ParseException | SipException |
-                             SsrcTransactionNotFoundException e) {
+                            SsrcTransactionNotFoundException e) {
                         logger.error("[zlm绂荤嚎]涓烘鍦ㄤ娇鐢ㄦzlm鐨勮澶囷紝 鍙戦�丅YE澶辫触 {}", e.getMessage());
                     }
                 }
@@ -973,9 +985,9 @@
             return null;
         }
         MediaServerItem mediaServerItem = mediaServerService.getMediaServerForMinimumLoad();
-//        String app = "broadcast";
+        String app = "broadcast";
         // TODO 浠巗ip user agent涓垽鏂槸浠�涔堝搧鐗岃澶囷紝澶у崕榛樿浣跨敤talk妯″紡锛屽叾浠栦娇鐢╞roadcast妯″紡
-        String app = "talk";
+//        String app = "talk";
         String stream = device.getDeviceId() + "_" + channelId;
         StreamInfo broadcast = mediaService.getStreamInfoByAppAndStream(mediaServerItem, "broadcast", stream, null, null, null, false);
         AudioBroadcastResult audioBroadcastResult = new AudioBroadcastResult();
@@ -1109,4 +1121,52 @@
 //            }
 //        }));
     }
+
+    @Override
+    public void pauseRtp(String streamId) throws ServiceException, InvalidArgumentException, ParseException, SipException {
+        String key = redisCatchStorage.queryPlaybackForKey(null, null, streamId, null);
+        StreamInfo streamInfo = redisCatchStorage.queryPlayback(null, null, streamId, null);
+        if (null == streamInfo) {
+            logger.warn("streamId涓嶅瓨鍦�!");
+            throw new ServiceException("streamId涓嶅瓨鍦�");
+        }
+        streamInfo.setPause(true);
+        RedisUtil.set(key, streamInfo);
+        MediaServerItem mediaServerItem = mediaServerService.getOne(streamInfo.getMediaServerId());
+        if (null == mediaServerItem) {
+            logger.warn("mediaServer 涓嶅瓨鍦�!");
+            throw new ServiceException("mediaServer涓嶅瓨鍦�");
+        }
+        // zlm 鏆傚仠RTP瓒呮椂妫�鏌�
+        JSONObject jsonObject = zlmresTfulUtils.pauseRtpCheck(mediaServerItem, streamId);
+        if (jsonObject == null || jsonObject.getInteger("code") != 0) {
+            throw new ServiceException("鏆傚仠RTP鎺ユ敹澶辫触");
+        }
+        Device device = storager.queryVideoDevice(streamInfo.getDeviceID());
+        cmder.playPauseCmd(device, streamInfo);
+    }
+
+    @Override
+    public void resumeRtp(String streamId) throws ServiceException, InvalidArgumentException, ParseException, SipException {
+        String key = redisCatchStorage.queryPlaybackForKey(null, null, streamId, null);
+        StreamInfo streamInfo = redisCatchStorage.queryPlayback(null, null, streamId, null);
+        if (null == streamInfo) {
+            logger.warn("streamId涓嶅瓨鍦�!");
+            throw new ServiceException("streamId涓嶅瓨鍦�");
+        }
+        streamInfo.setPause(false);
+        RedisUtil.set(key, streamInfo);
+        MediaServerItem mediaServerItem = mediaServerService.getOne(streamInfo.getMediaServerId());
+        if (null == mediaServerItem) {
+            logger.warn("mediaServer 涓嶅瓨鍦�!");
+            throw new ServiceException("mediaServer涓嶅瓨鍦�");
+        }
+        // zlm 鏆傚仠RTP瓒呮椂妫�鏌�
+        JSONObject jsonObject = zlmresTfulUtils.resumeRtpCheck(mediaServerItem, streamId);
+        if (jsonObject == null || jsonObject.getInteger("code") != 0) {
+            throw new ServiceException("缁х画RTP鎺ユ敹澶辫触");
+        }
+        Device device = storager.queryVideoDevice(streamInfo.getDeviceID());
+        cmder.playResumeCmd(device, streamInfo);
+    }
 }

--
Gitblit v1.8.0