视频图片儿分析模型。

This commit is contained in:
spllzh
2025-10-12 09:37:43 +08:00
parent b047a3be90
commit 5f2c952a6e
33 changed files with 1935 additions and 104 deletions

View File

@@ -116,5 +116,6 @@ public class AudioStatisticsScheduler {

View File

@@ -0,0 +1,188 @@
package com.rj.scheduler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.rj.config.AliyunConfig;
import com.rj.entity.DetectVideoTemplate;
import com.rj.mapper.DetectVideoTemplateMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 检测视频模板任务状态检查定时器
* 每6分钟检查一次PENDING或RUNNING状态的任务调用阿里云API查询任务状态并更新数据库
*
* @author rj
* @date 2025-01-09
*/
@Slf4j
@Component
public class DetectVideoTemplateStatusScheduler {
@Autowired
private DetectVideoTemplateMapper detectVideoTemplateMapper;
@Autowired
private AliyunConfig aliyunConfig;
@Autowired
private RestTemplate restTemplate;
/**
* 每6分钟执行一次任务状态检查
*/
@Scheduled(fixedRate = 6 * 60 * 1000) // 6分钟 = 6 * 60 * 1000毫秒
public void checkDetectVideoTemplateStatus() {
try {
log.info("开始执行检测视频模板任务状态检查...");
// 查询所有PENDING或RUNNING状态的任务
List<DetectVideoTemplate> pendingTasks = getPendingTasks();
if (pendingTasks.isEmpty()) {
log.info("没有找到PENDING或RUNNING状态的检测视频模板任务");
return;
}
log.info("找到{}个PENDING或RUNNING状态的检测视频模板任务开始检查状态", pendingTasks.size());
// 遍历每个任务,检查状态
for (DetectVideoTemplate task : pendingTasks) {
try {
checkAndUpdateTaskStatus(task);
} catch (Exception e) {
log.error("检查检测视频模板任务状态失败任务ID: {}, 错误: {}", task.getTaskId(), e.getMessage(), e);
}
}
log.info("检测视频模板任务状态检查完成");
} catch (Exception e) {
log.error("检测视频模板任务状态检查执行失败", e);
}
}
/**
* 查询所有PENDING或RUNNING状态的任务
*/
private List<DetectVideoTemplate> getPendingTasks() {
QueryWrapper<DetectVideoTemplate> queryWrapper = new QueryWrapper<>();
queryWrapper.in("task_status", "PENDING", "RUNNING");
queryWrapper.isNotNull("task_id");
queryWrapper.ne("task_id", "");
return detectVideoTemplateMapper.selectList(queryWrapper);
}
/**
* 检查并更新单个任务状态
*/
private void checkAndUpdateTaskStatus(DetectVideoTemplate task) {
try {
log.info("检查检测视频模板任务状态任务ID: {}", task.getTaskId());
if (task == null || task.getTaskId() == null || task.getTaskId().isEmpty()) {
log.warn("任务ID为空跳过检查");
return;
}
// 调用阿里云API检查任务状态
String apiUrl = "https://dashscope.aliyuncs.com/api/v1/tasks/" + task.getTaskId();
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + aliyunConfig.getApiKey());
headers.set("Content-Type", "application/json");
HttpEntity<String> entity = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(
apiUrl,
HttpMethod.GET,
entity,
String.class
);
if (response.getStatusCode().is2xxSuccessful()) {
String responseBody = response.getBody();
log.info("检测视频模板API响应: {}", responseBody);
// 解析响应并更新数据库
updateTaskFromResponse(task, responseBody);
} else {
log.error("检测视频模板API调用失败状态码: {}, 任务ID: {}", response.getStatusCode(), task.getTaskId());
}
} catch (Exception e) {
log.error("检查检测视频模板任务状态异常任务ID: {}, 错误: {}", task.getTaskId(), e.getMessage(), e);
}
}
/**
* 根据API响应更新任务状态
*/
private void updateTaskFromResponse(DetectVideoTemplate task, String responseBody) {
try {
JSONObject responseJson = JSON.parseObject(responseBody);
if (responseJson.containsKey("output")) {
JSONObject output = responseJson.getJSONObject("output");
// 更新任务状态
if (output.containsKey("task_status")) {
String taskStatus = output.getString("task_status");
task.setTaskStatus(taskStatus);
log.info("更新任务状态: {} -> {}", task.getTaskId(), taskStatus);
// 根据任务状态判断是否成功
boolean isSuccess = "SUCCEEDED".equalsIgnoreCase(taskStatus) || "COMPLETED".equalsIgnoreCase(taskStatus);
task.setSuccess(isSuccess);
// 如果任务完成,更新响应时间
if (isSuccess || "FAILED".equalsIgnoreCase(taskStatus) || "CANCELLED".equalsIgnoreCase(taskStatus)) {
task.setResponseTime(LocalDateTime.now());
}
}
// 更新模板ID
if (output.containsKey("template_id")) {
String templateId = output.getString("template_id");
task.setTemplateId(templateId);
log.info("更新模板ID: {} -> {}", task.getTaskId(), templateId);
}
// 更新请求ID如果API返回了新的request_id
if (responseJson.containsKey("request_id")) {
String requestId = responseJson.getString("request_id");
task.setRequestId(requestId);
log.info("更新请求ID: {} -> {}", task.getTaskId(), requestId);
}
// 更新响应数据
task.setResponseData(responseBody);
// 保存到数据库
detectVideoTemplateMapper.updateById(task);
log.info("检测视频模板任务状态更新成功任务ID: {}, 状态: {}, 成功: {}",
task.getTaskId(), task.getTaskStatus(), task.getSuccess());
} else {
log.warn("API响应中没有output字段任务ID: {}", task.getTaskId());
}
} catch (Exception e) {
log.error("解析API响应失败任务ID: {}, 错误: {}", task.getTaskId(), e.getMessage(), e);
}
}
}

View File

@@ -154,8 +154,8 @@ public class VideoSynthesisStatusScheduler {
// 如果任务成功完成,处理视频文件
if ("SUCCEEDED".equals(taskStatus)) {
JSONObject results = output.getJSONObject("results");
if (results != null && results.containsKey("video_url")) {
String originalVideoUrl = results.getString("video_url");
if (output != null && output.containsKey("video_url")) {
String originalVideoUrl = output.getString("video_url");
log.info("任务成功完成原始视频URL: {}", originalVideoUrl);
// 从阿里云OSS下载视频并上传到MinIO
@@ -168,17 +168,32 @@ public class VideoSynthesisStatusScheduler {
task.setVideoUrl(originalVideoUrl);
log.warn("视频转存到MinIO失败保留原始URL: {}", originalVideoUrl);
}
log.info("任务成功完成视频URL: {}", task.getVideoUrl());
log.info("任务成功完成临时访问URL: {}", task.getVideoTempUrl());
log.info("任务成功完成视频模板URL: {}", task.getVideoTemplateUrl());
task.setSuccess(true);
task.setResponseTime(LocalDateTime.now());
// 更新临时访问URL使用MinIO的预签名URL
log.info("临时访问URL: {}", task.getVideoTempUrl());
}else if (results != null && results.containsKey("video_url")) {
String videoUrl = results.getString("video_url");
task.setVideoUrl(videoUrl);
log.info("任务成功完成视频URL: {}", videoUrl);
// 从阿里云OSS下载视频并上传到MinIO
downloadAndUploadToMinIO(videoUrl, task);
log.info("任务成功完成视频URL: {}", task.getVideoUrl());
log.info("任务成功完成临时访问URL: {}", task.getVideoTempUrl());
log.info("任务成功完成视频模板URL: {}", task.getVideoTemplateUrl());
}
} else if ("FAILED".equals(taskStatus)) {
task.setSuccess(false);
task.setErrorMessage("任务执行失败");
// task.setSuccess(false);
String message = output.getString("message");
task.setErrorMessage(message);
task.setResponseTime(LocalDateTime.now());
}