如果 无法通过 wvp-assist 下载则 使用 回放实时录制

This commit is contained in:
shikong 2023-09-10 04:57:11 +08:00
parent dfec2e8754
commit b625dcff7d
3 changed files with 38 additions and 9 deletions

View File

@ -52,6 +52,12 @@ public interface WvpProxyClient {
@PathVariable String channelId,
@SpringQueryMap GeneralTimeReq req);
@GetMapping("/api/playback/stop/{deviceId}/{channelId}/{stream}")
JsonResponse<StreamContent> playbackStop(@RequestHeader("access-token") String token,
@PathVariable String deviceId,
@PathVariable String channelId,
@PathVariable String stream);
// /api/playback/stop/44050100001180000001/44050100001310000001/44050100001180000001_44050100001310000001_20230908083001_20230908083501
@GetMapping("/api/gb_record/download/start/{deviceId}/{channelId}")
JsonResponse<StreamContent> downloadStart(@RequestHeader("access-token") String token,

View File

@ -48,7 +48,7 @@ public class RecordService {
}
@SneakyThrows
private void record(ServletResponse response, String url, long time) {
public void record(ServletResponse response, String url, long time) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
OutputStream outputStream = response.getOutputStream();
log.info("url {}", url);

View File

@ -1,11 +1,13 @@
package cn.skcks.docking.gb28181.wvp.service.wvp;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.crypto.digest.MD5;
import cn.skcks.docking.gb28181.common.json.JsonException;
import cn.skcks.docking.gb28181.common.json.JsonResponse;
import cn.skcks.docking.gb28181.wvp.config.WvpProxyConfig;
import cn.skcks.docking.gb28181.wvp.dto.common.GeneralTimeReq;
import cn.skcks.docking.gb28181.wvp.dto.device.DeviceChannel;
import cn.skcks.docking.gb28181.wvp.dto.device.GetDeviceChannelsReq;
import cn.skcks.docking.gb28181.wvp.dto.device.GetDeviceChannelsResp;
@ -22,8 +24,10 @@ import cn.skcks.docking.gb28181.wvp.orm.mybatis.dynamic.model.WvpProxyDevice;
import cn.skcks.docking.gb28181.wvp.proxy.WvpProxyClient;
import cn.skcks.docking.gb28181.wvp.service.device.DeviceService;
import cn.skcks.docking.gb28181.wvp.service.download.DownloadService;
import cn.skcks.docking.gb28181.wvp.service.video.RecordService;
import cn.skcks.docking.gb28181.wvp.utils.RetryUtil;
import com.github.rholder.retry.*;
import io.swagger.v3.core.util.Json;
import jakarta.servlet.AsyncContext;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@ -49,6 +53,7 @@ public class WvpService {
private final WvpProxyConfig wvpProxyConfig;
private final DeviceService deviceService;
private final DownloadService downloadService;
private final RecordService recordService;
@ -111,7 +116,6 @@ public class WvpService {
* @param endDateTime 结束时间
* @return JsonResponse 类型的执行结果 如果 null code 不为 0 200 则视为执行失败
*/
@SuppressWarnings("UnstableApiUsage")
@SneakyThrows
public JsonResponse<?> video(HttpServletResponse response, String deviceCode, String deviceId, String channelId, Date startDateTime, Date endDateTime) {
String passwdMd5 = MD5.create().digestHex(wvpProxyConfig.getPasswd());
@ -163,13 +167,37 @@ public class WvpService {
log.debug("{}", record);
});
try{
JsonResponse<String> videoPathResponse = downloadFromWvpAssist(deviceCode, deviceId, channelId, startTime, endTime, token);
String videoUrl = videoPathResponse.getData();
log.info("设备(deviceCode {}) (deviceId {}, channel{}) ({} ~ {}) 视频下载地址 {}", deviceCode, deviceId, channelId, startTime, endTime, videoUrl);
downloadService.download(response, videoUrl);
} catch (Exception e){
Retryer<JsonResponse<StreamContent>> playBackRetryer = RetryUtil.getDefaultRetryer("通过回放获取实时视频流下载");
JsonResponse<StreamContent> videoStreamResponse = playBackRetryer.call(() -> wvpProxyClient.playbackStart(token, deviceId, channelId, new GeneralTimeReq(startTime, endTime)));
StreamContent streamContent = videoStreamResponse.getData();
String stream = streamContent.getStream();
String streamUrl = streamContent.getFlv();
try {
recordService.record(response, streamUrl, DateUtil.between(startDateTime, endDateTime, DateUnit.SECOND));
} finally {
wvpProxyClient.playbackStop(token, deviceId, channelId, stream);
}
}
return login;
}
@SuppressWarnings("UnstableApiUsage")
@SneakyThrows
private JsonResponse<String> downloadFromWvpAssist(String deviceCode, String deviceId, String channelId, String startTime, String endTime, String token) {
Retryer<JsonResponse<String>> downloadRetryer = RetryUtil.getDefaultRetryer("调用 wvp 设备历史视频下载 api");
JsonResponse<String> videoPathResponse = downloadRetryer.call(() -> {
return downloadRetryer.call(() -> {
JsonResponse<StreamContent> downloadStart = wvpProxyClient.downloadStart(token, deviceId, channelId, DownloadStartReq.builder()
.startTime(startTime)
.endTime(endTime)
.build());
if(downloadStart.getData() == null){
if (downloadStart.getData() == null) {
throw new JsonException(downloadStart.getMsg());
}
StreamContent downloadStartData = downloadStart.getData();
@ -232,10 +260,5 @@ public class WvpService {
}
});
});
String videoUrl = videoPathResponse.getData();
log.info("设备(deviceCode {}) (deviceId {}, channel{}) ({} ~ {}) 视频下载地址 {}", deviceCode, deviceId, channelId, startTime, endTime, videoUrl);
downloadService.download(response, videoUrl);
return login;
}
}