From f8ef14bfea43abd8716aab15f5e302e7c1f23f79 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 11 六月 2024 10:08:13 +0800
Subject: [PATCH] 修复移动位置位置订阅上报间隔为0的bug
---
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java | 183 +++++++++++++++++----------------------------
1 files changed, 71 insertions(+), 112 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
old mode 100644
new mode 100755
index 8ae8752..8e1207a
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
@@ -9,6 +9,7 @@
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.conf.exception.ControllerException;
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
+import com.genersoft.iot.vmp.conf.security.JwtUtils;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
@@ -25,25 +26,34 @@
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.utils.DateUtil;
+import com.genersoft.iot.vmp.vmanager.bean.*;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.async.DeferredResult;
import javax.servlet.http.HttpServletRequest;
import javax.sip.InvalidArgumentException;
import javax.sip.SipException;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.text.ParseException;
import java.util.List;
import java.util.UUID;
+
+/**
+ * @author lin
+ */
@Tag(name = "鍥芥爣璁惧鐐规挱")
@RestController
@@ -85,13 +95,14 @@
@Autowired
private UserSetting userSetting;
- @Operation(summary = "寮�濮嬬偣鎾�")
+ @Operation(summary = "寮�濮嬬偣鎾�", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true)
@Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true)
@GetMapping("/start/{deviceId}/{channelId}")
public DeferredResult<WVPResult<StreamContent>> play(HttpServletRequest request, @PathVariable String deviceId,
@PathVariable String channelId) {
+ logger.info("[寮�濮嬬偣鎾璢 deviceId锛歿}, channelId锛歿}, ", deviceId, channelId);
// 鑾峰彇鍙敤鐨剒lm
Device device = storager.queryVideoDevice(deviceId);
MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
@@ -104,13 +115,15 @@
DeferredResult<WVPResult<StreamContent>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
result.onTimeout(()->{
- logger.info("鐐规挱鎺ュ彛绛夊緟瓒呮椂");
+ logger.info("[鐐规挱绛夊緟瓒呮椂] deviceId锛歿}, channelId锛歿}, ", deviceId, channelId);
// 閲婃斁rtpserver
WVPResult<StreamInfo> wvpResult = new WVPResult<>();
wvpResult.setCode(ErrorCode.ERROR100.getCode());
wvpResult.setMsg("鐐规挱瓒呮椂");
requestMessage.setData(wvpResult);
- resultHolder.invokeResult(requestMessage);
+ resultHolder.invokeAllResult(requestMessage);
+ inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
+ storager.stopPlay(deviceId, channelId);
});
// 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ
@@ -125,21 +138,36 @@
if (data != null) {
StreamInfo streamInfo = (StreamInfo)data;
if (userSetting.getUseSourceIpAsStreamIp()) {
- streamInfo.channgeStreamIp(request.getLocalAddr());
+ streamInfo=streamInfo.clone();//娣辨嫹璐�
+ String host;
+ try {
+ URL url=new URL(request.getRequestURL().toString());
+ host=url.getHost();
+ } catch (MalformedURLException e) {
+ host=request.getLocalAddr();
+ }
+ streamInfo.channgeStreamIp(host);
+ }
+ if (!ObjectUtils.isEmpty(newMediaServerItem.getTranscodeSuffix()) && !"null".equalsIgnoreCase(newMediaServerItem.getTranscodeSuffix())) {
+ streamInfo.setStream(streamInfo.getStream() + "_" + newMediaServerItem.getTranscodeSuffix());
}
wvpResult.setData(new StreamContent(streamInfo));
+ }else {
+ wvpResult.setCode(code);
+ wvpResult.setMsg(msg);
}
}else {
wvpResult.setCode(code);
wvpResult.setMsg(msg);
}
requestMessage.setData(wvpResult);
- resultHolder.invokeResult(requestMessage);
+ // 姝ゅ蹇呴』閲婃斁鎵�鏈夎姹�
+ resultHolder.invokeAllResult(requestMessage);
});
return result;
}
- @Operation(summary = "鍋滄鐐规挱")
+ @Operation(summary = "鍋滄鐐规挱", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true)
@Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true)
@Parameter(name = "isSubStream", description = "鏄惁瀛愮爜娴侊紙true-瀛愮爜娴侊紝false-涓荤爜娴侊級锛岄粯璁や负false", required = true)
@@ -163,7 +191,7 @@
}
if (InviteSessionStatus.ok == inviteInfo.getStatus()) {
try {
- logger.warn("[鍋滄鐐规挱] {}/{}", device.getDeviceId(), channelId);
+ logger.info("[鍋滄鐐规挱] {}/{}", device.getDeviceId(), channelId);
cmder.streamByeCmd(device, channelId, inviteInfo.getStream(), null, null);
} catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) {
logger.error("[鍛戒护鍙戦�佸け璐 鍋滄鐐规挱锛� 鍙戦�丅YE: {}", e.getMessage());
@@ -181,52 +209,9 @@
}
/**
- * 灏嗕笉鏄痟264鐨勮棰戦�氳繃ffmpeg 杞爜涓篽264 + aac
- * @param streamId 娴両D
- */
- @Operation(summary = "灏嗕笉鏄痟264鐨勮棰戦�氳繃ffmpeg 杞爜涓篽264 + aac")
- @Parameter(name = "streamId", description = "瑙嗛娴両D", required = true)
- @PostMapping("/convert/{streamId}")
- public JSONObject playConvert(@PathVariable String streamId) {
-// StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
-
- InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, streamId);
- if (inviteInfo == null || inviteInfo.getStreamInfo() == null) {
- logger.warn("瑙嗛杞爜API璋冪敤澶辫触锛�, 瑙嗛娴佸凡缁忓仠姝�!");
- throw new ControllerException(ErrorCode.ERROR100.getCode(), "鏈壘鍒拌棰戞祦淇℃伅, 瑙嗛娴佸彲鑳藉凡缁忓仠姝�");
- }
- MediaServerItem mediaInfo = mediaServerService.getOne(inviteInfo.getStreamInfo().getMediaServerId());
- JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaInfo, streamId);
- if (!rtpInfo.getBoolean("exist")) {
- logger.warn("瑙嗛杞爜API璋冪敤澶辫触锛�, 瑙嗛娴佸凡鍋滄鎺ㄦ祦!");
- throw new ControllerException(ErrorCode.ERROR100.getCode(), "鏈壘鍒拌棰戞祦淇℃伅, 瑙嗛娴佸彲鑳藉凡鍋滄鎺ㄦ祦");
- } else {
- String dstUrl = String.format("rtmp://%s:%s/convert/%s", "127.0.0.1", mediaInfo.getRtmpPort(),
- streamId );
- String srcUrl = String.format("rtsp://%s:%s/rtp/%s", "127.0.0.1", mediaInfo.getRtspPort(), streamId);
- JSONObject jsonObject = zlmresTfulUtils.addFFmpegSource(mediaInfo, srcUrl, dstUrl, "1000000", true, false, null);
- logger.info(jsonObject.toJSONString());
- if (jsonObject != null && jsonObject.getInteger("code") == 0) {
- JSONObject data = jsonObject.getJSONObject("data");
- if (data != null) {
- JSONObject result = new JSONObject();
- result.put("key", data.getString("key"));
- StreamInfo streamInfoResult = mediaService.getStreamInfoByAppAndStreamWithCheck("convert", streamId, mediaInfo.getId(), false);
- result.put("StreamInfo", streamInfoResult);
- return result;
- }else {
- throw new ControllerException(ErrorCode.ERROR100.getCode(), "杞爜澶辫触");
- }
- }else {
- throw new ControllerException(ErrorCode.ERROR100.getCode(), "杞爜澶辫触");
- }
- }
- }
-
- /**
* 缁撴潫杞爜
*/
- @Operation(summary = "缁撴潫杞爜")
+ @Operation(summary = "缁撴潫杞爜", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "key", description = "瑙嗛娴乲ey", required = true)
@Parameter(name = "mediaServerId", description = "娴佸獟浣撴湇鍔D", required = true)
@PostMapping("/convertStop/{key}")
@@ -251,73 +236,47 @@
}
}
- @Operation(summary = "璇煶骞挎挱鍛戒护")
+ @Operation(summary = "璇煶骞挎挱鍛戒护", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true)
- @GetMapping("/broadcast/{deviceId}")
- @PostMapping("/broadcast/{deviceId}")
- public DeferredResult<String> broadcastApi(@PathVariable String deviceId) {
- if (logger.isDebugEnabled()) {
- logger.debug("璇煶骞挎挱API璋冪敤");
- }
- Device device = storager.queryVideoDevice(deviceId);
- DeferredResult<String> result = new DeferredResult<>(3 * 1000L);
- String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId;
- if (resultHolder.exist(key, null)) {
- result.setResult("璁惧浣跨敤涓�");
- return result;
+ @Parameter(name = "deviceId", description = "閫氶亾鍥芥爣缂栧彿", required = true)
+ @Parameter(name = "timeout", description = "鎺ㄦ祦瓒呮椂鏃堕棿(绉�)", required = true)
+ @GetMapping("/broadcast/{deviceId}/{channelId}")
+ @PostMapping("/broadcast/{deviceId}/{channelId}")
+ public AudioBroadcastResult broadcastApi(@PathVariable String deviceId, @PathVariable String channelId, Integer timeout, Boolean broadcastMode) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("璇煶骞挎挱API璋冪敤");
}
- String uuid = UUID.randomUUID().toString();
- if (device == null) {
-
- resultHolder.put(key, key, result);
- RequestMessage msg = new RequestMessage();
- msg.setKey(key);
- msg.setId(uuid);
- JSONObject json = new JSONObject();
- json.put("DeviceID", deviceId);
- json.put("CmdType", "Broadcast");
- json.put("Result", "Failed");
- json.put("Description", "Device 涓嶅瓨鍦�");
- msg.setData(json);
- resultHolder.invokeResult(msg);
- return result;
+ Device device = storager.queryVideoDevice(deviceId);
+ if (device == null) {
+ throw new ControllerException(ErrorCode.ERROR400.getCode(), "鏈壘鍒拌澶囷細 " + deviceId);
}
- try {
- cmder.audioBroadcastCmd(device, (event) -> {
- RequestMessage msg = new RequestMessage();
- msg.setKey(key);
- msg.setId(uuid);
- JSONObject json = new JSONObject();
- json.put("DeviceID", deviceId);
- json.put("CmdType", "Broadcast");
- json.put("Result", "Failed");
- json.put("Description", String.format("璇煶骞挎挱鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg));
- msg.setData(json);
- resultHolder.invokeResult(msg);
- });
- } catch (InvalidArgumentException | SipException | ParseException e) {
- logger.error("[鍛戒护鍙戦�佸け璐 璇煶骞挎挱: {}", e.getMessage());
- throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
+ if (channelId == null) {
+ throw new ControllerException(ErrorCode.ERROR400.getCode(), "鏈壘鍒伴�氶亾锛� " + channelId);
}
- result.onTimeout(() -> {
- logger.warn("璇煶骞挎挱鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�");
- RequestMessage msg = new RequestMessage();
- msg.setKey(key);
- msg.setId(uuid);
- JSONObject json = new JSONObject();
- json.put("DeviceID", deviceId);
- json.put("CmdType", "Broadcast");
- json.put("Result", "Failed");
- json.put("Error", "Timeout. Device did not response to broadcast command.");
- msg.setData(json);
- resultHolder.invokeResult(msg);
- });
- resultHolder.put(key, uuid, result);
- return result;
+ return playService.audioBroadcast(device, channelId, broadcastMode);
+
}
- @Operation(summary = "鑾峰彇鎵�鏈夌殑ssrc")
+ @Operation(summary = "鍋滄璇煶骞挎挱")
+ @Parameter(name = "deviceId", description = "璁惧Id", required = true)
+ @Parameter(name = "channelId", description = "閫氶亾Id", required = true)
+ @GetMapping("/broadcast/stop/{deviceId}/{channelId}")
+ @PostMapping("/broadcast/stop/{deviceId}/{channelId}")
+ public void stopBroadcast(@PathVariable String deviceId, @PathVariable String channelId) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("鍋滄璇煶骞挎挱API璋冪敤");
+ }
+// try {
+// playService.stopAudioBroadcast(deviceId, channelId);
+// } catch (InvalidArgumentException | ParseException | SipException e) {
+// logger.error("[鍛戒护鍙戦�佸け璐 鍋滄璇煶: {}", e.getMessage());
+// throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
+// }
+ playService.stopAudioBroadcast(deviceId, channelId);
+ }
+
+ @Operation(summary = "鑾峰彇鎵�鏈夌殑ssrc", security = @SecurityRequirement(name = JwtUtils.HEADER))
@GetMapping("/ssrc")
public JSONObject getSSRC() {
if (logger.isDebugEnabled()) {
@@ -340,7 +299,7 @@
return jsonObject;
}
- @Operation(summary = "鑾峰彇鎴浘")
+ @Operation(summary = "鑾峰彇鎴浘", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true)
@Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true)
@Parameter(name = "isSubStream", description = "鏄惁瀛愮爜娴侊紙true-瀛愮爜娴侊紝false-涓荤爜娴侊級锛岄粯璁や负false", required = true)
--
Gitblit v1.8.0