Quellcode durchsuchen

fix:
1. 语音对讲正确配置延时功能

kindring vor 2 Jahren
Ursprung
Commit
c1cf073292

+ 7 - 18
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java

@@ -377,6 +377,7 @@ public class ZLMRTPServerFactory {
      * 调用zlm RESTFUL API --- startSendRtpPassive
      * @param mediaServerItem
      * @param param
+     * @param timeout 超时时间 单位秒
      * @return
      */
     public JSONObject startSendRtpPassive(MediaServerItem mediaServerItem, Map<String, Object>param,int timeout) {
@@ -395,25 +396,13 @@ public class ZLMRTPServerFactory {
      * @param dst_port
      * @return
      */
-    public Map<String, Object> createStartSendRtpStreamAudioData(MediaServerItem serverItem,String app, String recv_stream_id,String audioStreamId,String ssrc,String dst_url,int dst_port){
-//        String sendRtpPortRange = serverItem.getSendRtpPortRange();
-//        if (ObjectUtils.isEmpty(sendRtpPortRange)) {
-//            logger.error("无法随机获取rtp端口");
-////            return null;
-//            sendRtpPortRange="30000,35000";
-//        }
-//
-//        String[] portRangeStrArray = sendRtpPortRange.split(",");
+    public Map<String, Object> createStartSendRtpStreamAudioData(MediaServerItem serverItem,String app, String recv_stream_id,String audioStreamId,String ssrc,String dst_url,int dst_port,int waitTime){
+
         int localPort = -1;
-//        if (portRangeStrArray.length != 2) {
-//            localPort = getFreePort(serverItem, 30000, 30500, null);
-//        }else {
-//            localPort = getFreePort(serverItem, Integer.parseInt(portRangeStrArray[0]),  Integer.parseInt(portRangeStrArray[1]), null);
-//        }
-//        if (localPort == -1) {
-//            logger.error("没有可用的端口");
-//            return null;
-//        }
+        // waitTime 默认值为10000
+        if (waitTime == 0) {
+            waitTime = 10000;
+        }
         // startSendRtp CHECK_ARGS("vhost", "app", "stream", "ssrc", "dst_url", "dst_port", "is_udp");
         Map<String, Object> param = new HashMap<>();
         param.put("vhost", "__defaultVhost__");

+ 14 - 1
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java

@@ -60,7 +60,20 @@ public interface IMediaServerService {
 //    SSRCInfo startSendRtpServer(MediaServerItem mediaServerItem, String streamId,boolean ssrcCheck, boolean isPlayback);
 //    SSRCInfo startSendRtpServer(MediaServerItem mediaServerItem, String streamId, String presetSsrc, boolean ssrcCheck, boolean isPlayback, Integer port);
 //    SSRCInfo startSendRtpServer(MediaServerItem mediaServerItem, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback);
-    SSRCInfo startSendRtpServer(MediaServerItem mediaServerItem,String app, String streamId,String audioStreamId,String addr,String port,String ssrc);
+
+    /**
+     * 开启发送rtp流服务
+     * @param mediaServerItem
+     * @param app
+     * @param streamId
+     * @param audioStreamId
+     * @param addr
+     * @param port
+     * @param ssrc
+     * @param waitTime 等待时间 单位毫秒
+     * @return
+     */
+    SSRCInfo startSendRtpServer(MediaServerItem mediaServerItem,String app, String streamId,String audioStreamId,String addr,String port,String ssrc,int waitTime);
 
     void closeSendRtpServer(MediaServerItem mediaServerItem, String streamId);
 

+ 5 - 7
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java

@@ -179,11 +179,12 @@ public class MediaServerServiceImpl implements IMediaServerService {
 
     @Override
     public SSRCInfo startSendRtpServer(MediaServerItem mediaServerItem,String app, String recv_stream_id,String audioStreamId,
-                                       String addr,String port,String _ssrc) {
+                                       String addr,String port,String _ssrc,int waitTime) {
         if (mediaServerItem == null || mediaServerItem.getId() == null) {
             logger.warn("无法连接至zlm!!!!!!!");
             return null;
         }
+
         // 获取mediaServer可用的ssrc
         String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId();
 
@@ -200,19 +201,16 @@ public class MediaServerServiceImpl implements IMediaServerService {
 //            }
             int rtpServerPort;
             // 创建
-            Map<String, Object> rtpParam = zlmrtpServerFactory.createStartSendRtpStreamAudioData(mediaServerItem,app, recv_stream_id,audioStreamId,_ssrc,addr, Integer.parseInt(port));
+            Map<String, Object> rtpParam = zlmrtpServerFactory.createStartSendRtpStreamAudioData(mediaServerItem,app, recv_stream_id,audioStreamId,_ssrc,addr, Integer.parseInt(port),waitTime);
             logger.info("[wvp ==> zlm:{}] {}",mediaServerItem.getId(),rtpParam.toString());
             if (mediaServerItem == null || mediaServerItem.getId() == null) {
                 logger.warn("无法连接至zlm!!!!!!!");
                 return null;
             }
-            JSONObject result = zlmrtpServerFactory.startSendRtpPassive(mediaServerItem,rtpParam,30);
+            // 等待zlm回复时间为 waitTime+5 秒 毫秒转换为秒
+            JSONObject result = zlmrtpServerFactory.startSendRtpPassive(mediaServerItem,rtpParam,(waitTime / 1000) + 5);
 //            JSONObject result = zlmrtpServerFactory.startSendRtpStream(mediaServerItem,rtpParam);
             logger.info("zlm start send {}",result.toJSONString());
-//            if((Integer.parseInt((String) result.get("code"))  != 0)){
-//                logger.error("[语音广播 流媒体异常] {}",result.get("msg"));
-//                return null;
-//            }
             Integer code = (Integer) result.get("code");
             if(code != null && code.intValue() != 0){ logger.error("[语音广播 流媒体异常] {}", result.get("msg")); return null; }
             RedisUtil.set(key, mediaServerItem);

+ 9 - 3
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java

@@ -416,7 +416,8 @@ public class PlayServiceImpl implements IPlayService {
                 ssrcInfo = mediaServerService.startSendRtpServer(mediaServerItem,app, streamId, audioStreamId,
                         json.getString("addr"),
                         json.getString("port"),
-                        ssrcStr
+                        ssrcStr,
+                        15*1000
                 );
                 if(ssrcInfo == null){
                     logger.error("[zlm控制异常] 创建媒体流失败");
@@ -463,7 +464,7 @@ public class PlayServiceImpl implements IPlayService {
             logger.warn("invite超时");
             errJson.put("msg","等待设备语音invite信息超时");
             callback.run(1,errJson,null);
-        },waitTime);
+        },waitTime + (1000 * 7));
 
         GBHookSubscribe.addInviteSubscribe(broadcastForInviteHook,
         (int code, JSONObject json, SIPRequest request)->{
@@ -1063,6 +1064,10 @@ public class PlayServiceImpl implements IPlayService {
             int waitTime,
             BroadcastCallback callback
     ){
+        // 初始化waitTime值为15秒
+        if (waitTime == 0) {
+            waitTime = 15 * 1000;
+        }
         logger.info("[语言广播] 开始返回invite200,并创建zlm服务");
         JSONObject errJson = new JSONObject();
         try {
@@ -1076,7 +1081,8 @@ public class PlayServiceImpl implements IPlayService {
                     broadcastItem.getStream(),
                     broadcastItem.getIpcIp(),
                     String.valueOf(broadcastItem.getIpcAudioPort()),
-                    ssrcStr
+                    ssrcStr,
+                    waitTime
             );
             if (ssrcInfo == null) {
                 logger.error("[zlm控制异常] 创建媒体流失败");

+ 1 - 1
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java

@@ -556,7 +556,7 @@ public class PlayController {
 								mediaServerItem,
 								device,
 								broadcastItem,
-								5000,
+								waitTime,
 								(int _code, JSONObject _json, SIPRequest _request)->{
 									// todo 处理并返回语音广播请求,应该有一个ack
 									if(_code == 1){