1078-录像回放控制

This commit is contained in:
648540858
2024-05-29 23:53:20 +08:00
parent 15a551d983
commit 74c98c8636
3 changed files with 72 additions and 27 deletions

View File

@@ -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<WVPResult<StreamContent>> 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<WVPResult<StreamContent>> 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<StreamContent> 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)

View File

@@ -23,7 +23,8 @@ public interface Ijt1078Service {
void play(String deviceId, String channelId, int type, GeneralCallback<StreamInfo> callback);
void playback(String deviceId, String channelId, String startTime, String endTime, GeneralCallback<StreamInfo> callback);
void playback(String deviceId, String channelId, String startTime, String endTime, Integer type,
Integer rate, Integer playbackType, Integer playbackSpeed, GeneralCallback<StreamInfo> 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);
}

View File

@@ -296,8 +296,10 @@ public class jt1078ServiceImpl implements Ijt1078Service {
}
@Override
public void playback(String deviceId, String channelId, String startTime, String endTime, GeneralCallback<StreamInfo> callback) {
public void playback(String deviceId, String channelId, String startTime, String endTime, Integer type,
Integer rate, Integer playbackType, Integer playbackSpeed, GeneralCallback<StreamInfo> callback) {
logger.info("[1078-回放] 回放,设备:{} 通道: {} 开始时间: {} 结束时间: {} 音视频类型: {} 码流类型: {} " +
"回放方式: {} 快进或快退倍数: {}", deviceId, channelId, startTime, endTime, type, rate, playbackType, playbackSpeed);
// 检查流是否已经存在,存在则返回
String playbackKey = VideoManagerConstants.INVITE_INFO_1078_PLAYBACK + deviceId + ":" + channelId;
List<GeneralCallback<StreamInfo>> 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<GeneralCallback<StreamInfo>> generalCallbacks = inviteErrorCallbackMap.get(playKey);
if (generalCallbacks != null && !generalCallbacks.isEmpty()) {
for (GeneralCallback<StreamInfo> 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<GeneralCallback<StreamInfo>> generalCallbacks = inviteErrorCallbackMap.get(playKey);
if (generalCallbacks != null && !generalCallbacks.isEmpty()) {
for (GeneralCallback<StreamInfo> 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