From e1af52fb5eaf0bcac221ba11cc90da7cd50d2895 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期五, 30 九月 2022 15:51:28 +0800
Subject: [PATCH] 更新文档

---
 src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java |  263 +++++++++++++++++++++++++++-------------------------
 1 files changed, 135 insertions(+), 128 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..4d814c6 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
@@ -14,6 +14,7 @@
 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.vmanager.bean.ErrorCode;
@@ -290,148 +291,154 @@
             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);
-        }
     }
 
 

--
Gitblit v1.8.0