diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java index 9df604958..d371ddf9e 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java @@ -257,12 +257,22 @@ public class JT1078Controller { @Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true) @Parameter(name = "startTime", description = "开始时间,格式: yyyy-MM-dd HH:mm:ss", required = true) @Parameter(name = "endTime", description = "结束时间,格式: yyyy-MM-dd HH:mm:ss", required = true) + @Parameter(name = "type", description = "0.音视频 1.音频 2.视频 3.视频或音视频", required = true) + @Parameter(name = "rate", description = "0.所有码流 1.主码流 2.子码流(如果此通道只传输音频,此字段置0)", required = true) + @Parameter(name = "playbackType", description = "0.正常回放 1.快进回放 2.关键帧快退回放 3.关键帧播放 4.单帧上传", required = true) + @Parameter(name = "playbackSpeed", description = "0.无效 1.1倍 2.2倍 3.4倍 4.8倍 5.16倍 (回放控制为1和2时,此字段内容有效,否则置0)", required = true) @GetMapping("/playback/start") public DeferredResult> recordLive(HttpServletRequest request, @Parameter(required = true) String deviceId, @Parameter(required = false) String channelId, @Parameter(required = true) String startTime, - @Parameter(required = true) String endTime) { + @Parameter(required = true) String endTime, + @Parameter(required = false) Integer type, + @Parameter(required = false) Integer rate, + @Parameter(required = false) Integer playbackType, + @Parameter(required = false) Integer playbackSpeed + + ) { DeferredResult> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue()); if (ObjectUtils.isEmpty(channelId)) { channelId = "1"; @@ -278,7 +288,7 @@ public class JT1078Controller { service.stopPlay(deviceId, finalChannelId); }); - service.playback(deviceId, channelId, startTime, endTime, (code, msg, streamInfo) -> { + service.playback(deviceId, channelId, startTime, endTime,type, rate, playbackType, playbackSpeed, (code, msg, streamInfo) -> { WVPResult wvpResult = new WVPResult<>(); if (code == InviteErrorCode.SUCCESS.getCode()) { wvpResult.setCode(ErrorCode.SUCCESS.getCode()); @@ -311,6 +321,23 @@ public class JT1078Controller { return result; } + @Operation(summary = "1078-回放控制", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "deviceId", description = "设备国标编号", required = true) + @Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true) + @Parameter(name = "command", description = "0:开始回放; 1:暂停回放; 2:结束回放; 3:快进回放; 4:关键帧快退回放; 5:拖动回放; 6:关键帧播放", required = true) + @Parameter(name = "playbackSpeed", description = "0.无效 1.1倍 2.2倍 3.4倍 4.8倍 5.16倍 (回放控制为1和2时,此字段内容有效,否则置0)", required = true) + @Parameter(name = "time", description = "拖动回放位置(时间)", required = true) + @GetMapping("/playback/control") + public void recordControl(@Parameter(required = true) String deviceId, + @Parameter(required = true) String channelId, + @Parameter(required = false) Integer command, + @Parameter(required = false) String time, + @Parameter(required = false) Integer playbackSpeed + + ) { + service.playbackControl(deviceId, channelId, command, playbackSpeed,time); + } + @Operation(summary = "1078-结束回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "deviceId", description = "设备国标编号", required = true) @Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true) diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java index 0233bc597..0eb12fa2f 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java @@ -23,7 +23,8 @@ public interface Ijt1078Service { void play(String deviceId, String channelId, int type, GeneralCallback callback); - void playback(String deviceId, String channelId, String startTime, String endTime, GeneralCallback callback); + void playback(String deviceId, String channelId, String startTime, String endTime, Integer type, + Integer rate, Integer playbackType, Integer playbackSpeed, GeneralCallback callback); void stopPlay(String deviceId, String channelId); @@ -112,4 +113,6 @@ public interface Ijt1078Service { void stopTalk(String deviceId, String channelId); void changeStreamType(String deviceId, String channelId, Integer streamType); + + void playbackControl(String deviceId, String channelId, Integer command, Integer playbackSpeed, String time); } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java index 3c42b55a5..32bd58e06 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java @@ -296,8 +296,10 @@ public class jt1078ServiceImpl implements Ijt1078Service { } @Override - public void playback(String deviceId, String channelId, String startTime, String endTime, GeneralCallback callback) { - + public void playback(String deviceId, String channelId, String startTime, String endTime, Integer type, + Integer rate, Integer playbackType, Integer playbackSpeed, GeneralCallback callback) { + logger.info("[1078-回放] 回放,设备:{}, 通道: {}, 开始时间: {}, 结束时间: {}, 音视频类型: {}, 码流类型: {}, " + + "回放方式: {}, 快进或快退倍数: {}", deviceId, channelId, startTime, endTime, type, rate, playbackType, playbackSpeed); // 检查流是否已经存在,存在则返回 String playbackKey = VideoManagerConstants.INVITE_INFO_1078_PLAYBACK + deviceId + ":" + channelId; List> errorCallbacks = inviteErrorCallbackMap.computeIfAbsent(playbackKey, k -> new ArrayList<>()); @@ -363,12 +365,12 @@ public class jt1078ServiceImpl implements Ijt1078Service { J9201 j9201 = new J9201(); j9201.setChannel(Integer.parseInt(channelId)); j9201.setIp(mediaServer.getSdpIp()); - j9201.setRate(0); - j9201.setPlaybackType(0); - j9201.setPlaybackSpeed(0); + j9201.setRate(rate); + j9201.setPlaybackType(playbackType); + j9201.setPlaybackSpeed(playbackSpeed); j9201.setTcpPort(ssrcInfo.getPort()); j9201.setUdpPort(ssrcInfo.getPort()); - j9201.setType(0); + j9201.setType(type); j9201.setStartTime(DateUtil.yyyy_MM_dd_HH_mm_ssTo1078(startTime)); j9201.setEndTime(DateUtil.yyyy_MM_dd_HH_mm_ssTo1078(endTime)); jt1078Template.startBackLive(deviceId, j9201, 20); @@ -376,30 +378,43 @@ public class jt1078ServiceImpl implements Ijt1078Service { } @Override - public void stopPlayback(String deviceId, String channelId) { + public void playbackControl(String deviceId, String channelId, Integer command, Integer playbackSpeed, String time) { + logger.info("[1078-回放控制] deviceId: {}, channelId: {}, command: {}, playbackSpeed: {}, time: {}", + deviceId, channelId, command, playbackSpeed, time); String playKey = VideoManagerConstants.INVITE_INFO_1078_PLAYBACK + deviceId + ":" + channelId; dynamicTask.stop(playKey); - StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playKey); + if (command == 2) { + // 结束回放 + StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playKey); + // 删除缓存数据 + if (streamInfo != null) { + // 关闭rtpServer + mediaServerService.closeRTPServer(streamInfo.getMediaServerId(), streamInfo.getStream()); + } + // 清理回调 + List> generalCallbacks = inviteErrorCallbackMap.get(playKey); + if (generalCallbacks != null && !generalCallbacks.isEmpty()) { + for (GeneralCallback callback : generalCallbacks) { + callback.run(InviteErrorCode.ERROR_FOR_FINISH.getCode(), InviteErrorCode.ERROR_FOR_FINISH.getMsg(), null); + } + } + } // 发送停止命令 J9202 j9202 = new J9202(); j9202.setChannel(Integer.parseInt(channelId)); - j9202.setPlaybackType(0); - j9202.setPlaybackSpeed(0); - j9202.setPlaybackTime(""); + j9202.setPlaybackType(command); + if (playbackSpeed != null) { + j9202.setPlaybackSpeed(playbackSpeed); + } + if (!ObjectUtils.isEmpty(time)) { + j9202.setPlaybackTime(DateUtil.yyyy_MM_dd_HH_mm_ssTo1078(time)); + } jt1078Template.controlBackLive(deviceId, j9202, 6); - logger.info("[1078-停止回放] deviceId: {}, channelId: {}", deviceId, channelId); - // 删除缓存数据 - if (streamInfo != null) { - // 关闭rtpServer - mediaServerService.closeRTPServer(streamInfo.getMediaServerId(), streamInfo.getStream()); - } - // 清理回调 - List> generalCallbacks = inviteErrorCallbackMap.get(playKey); - if (generalCallbacks != null && !generalCallbacks.isEmpty()) { - for (GeneralCallback callback : generalCallbacks) { - callback.run(InviteErrorCode.ERROR_FOR_FINISH.getCode(), InviteErrorCode.ERROR_FOR_FINISH.getMsg(), null); - } - } + } + + @Override + public void stopPlayback(String deviceId, String channelId) { + playbackControl(deviceId, channelId, 2, null, String.valueOf(0)); } @Override