动态头像-mp4-记录po

This commit is contained in:
2025-09-08 12:37:00 +08:00
parent ff3893a029
commit 1fc9390014
6 changed files with 152 additions and 36 deletions

View File

@@ -0,0 +1,37 @@
package com.accompany.business.model;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
@Data
@TableName("media_transfer_record")
public class MediaTransferRecord {
@TableId(type = IdType.INPUT)
private String id;
private Long uid;
private String provider;
private String inputPath;
private String outputPath;
private String redisKey;
private Long price;
private String ip;
private String deviceId;
private Date createTime;
private Date updateTime;
private Byte status; // 0-处理中, 1-成功, 2-失败
private String errorMsg;
}

View File

@@ -0,0 +1,9 @@
package com.accompany.business.mybatismapper;
import com.accompany.business.model.MediaTransferRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MediaTransferRecordMapper extends BaseMapper<MediaTransferRecord> {
}

View File

@@ -1,16 +1,12 @@
package com.accompany.business.service;
import com.accompany.common.config.TencentCosConfig;
import com.accompany.business.model.MediaTransferRecord;
import com.accompany.business.mybatismapper.MediaTransferRecordMapper;
import com.accompany.common.constant.Constant;
import com.accompany.common.redis.RedisKey;
import com.accompany.common.utils.EnvComponent;
import com.accompany.common.utils.UUIDUtil;
import com.accompany.core.base.SpringContextHolder;
import com.accompany.core.service.common.JedisService;
import com.alibaba.fastjson2.JSON;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.model.ciModel.job.MediaJobObject;
import com.qcloud.cos.model.ciModel.job.MediaJobResponse;
import com.qcloud.cos.model.ciModel.job.MediaJobsRequest;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -21,51 +17,34 @@ import java.net.URL;
@Slf4j
@Service
public class TencentDataUniverseService {
public class MediaTransferService {
@Autowired
private TencentCosConfig tencentCosConfig;
@Autowired
private COSClient client;
private TencentDataInfiniteService tencentDataInfiniteService;
@Autowired
private EnvComponent envComponent;
@Autowired
private MediaTransferRecordMapper mediaTransferRecordMapper;
@SneakyThrows
@Async
public void transfer2Gif(Long uid, String avatar, String redisKey, Long price, String ip, String deviceId) {
URL url = new URL(avatar);
String inputPath = url.getPath();
String outputPath = inputPath.replace(".mp4", ".gif");
String outputAvatar = url.getHost() + outputPath;
//1.创建任务请求对象
MediaJobsRequest request = new MediaJobsRequest();
//2.添加请求参数 参数详情请见 API 接口文档
request.setBucketName(tencentCosConfig.getBucket());
request.setTag("Animation");
request.getInput().setObject(inputPath);
request.getOperation().setTemplateId(tencentCosConfig.getGifJobTemplateId());
request.getOperation().getOutput().setBucket(tencentCosConfig.getBucket());
request.getOperation().getOutput().setRegion(tencentCosConfig.getRegion());
request.getOperation().getOutput().setObject(outputPath);
//3.调用接口,获取任务响应对象
MediaJobResponse response = client.createMediaJobs(request);
log.info("tencent mp4转码gif 任务提交结果: {}", JSON.toJSONString(response));
String taskId = tencentDataInfiniteService.transfer2Gif(uid, inputPath, outputPath, redisKey, price, ip, deviceId);
//正式环境等回调
if (!envComponent.getDevOrNativeEnv()){
return;
}
String taskId = UUIDUtil.get();
SpringContextHolder.getBean(UploadAvatarService.class).cacheReviewAvatar(redisKey, String.valueOf(uid), outputAvatar, price);
SpringContextHolder.getBean(JedisService.class).hset(RedisKey.user_avatar_review_task.getKey(), taskId, String.valueOf(uid));
SpringContextHolder.getBean(UploadAvatarService.class).updateAvatar(outputAvatar, uid, redisKey, taskId);
}
public void handleResult(MediaJobObject jobsDetail) {
}
}
}

View File

@@ -0,0 +1,93 @@
package com.accompany.business.service;
import com.accompany.business.model.MediaTransferRecord;
import com.accompany.business.mybatismapper.MediaTransferRecordMapper;
import com.accompany.business.service.netease.YidunCheckUtil;
import com.accompany.common.config.TencentCosConfig;
import com.accompany.common.constant.Constant;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.exception.ServiceException;
import com.alibaba.fastjson2.JSON;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.model.ciModel.job.MediaJobObject;
import com.qcloud.cos.model.ciModel.job.MediaJobResponse;
import com.qcloud.cos.model.ciModel.job.MediaJobsRequest;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class TencentDataInfiniteService {
@Autowired
private TencentCosConfig tencentCosConfig;
@Autowired
private COSClient client;
@Autowired
private MediaTransferRecordMapper mediaTransferRecordMapper;
private final String channel = "tencent";
@SneakyThrows
public String transfer2Gif(Long uid, String inputPath, String outputPath, String redisKey, Long price, String ip, String deviceId) {
//1.创建任务请求对象
MediaJobsRequest request = new MediaJobsRequest();
//2.添加请求参数 参数详情请见 API 接口文档
request.setBucketName(tencentCosConfig.getBucket());
request.setTag("Animation");
request.getInput().setObject(inputPath);
request.getOperation().setTemplateId(tencentCosConfig.getGifJobTemplateId());
request.getOperation().getOutput().setBucket(tencentCosConfig.getBucket());
request.getOperation().getOutput().setRegion(tencentCosConfig.getRegion());
request.getOperation().getOutput().setObject(outputPath);
//3.调用接口,获取任务响应对象
MediaJobResponse response = client.createMediaJobs(request);
log.info("tencent mp4转码gif 任务提交结果: {}", JSON.toJSONString(response));
MediaJobObject jobsDetail = response.getJobsDetail();
if (null == jobsDetail || !"Success".equals(jobsDetail.getCode())){
throw new ServiceException(BusiStatus.SERVERBUSY);
}
String taskId = jobsDetail.getJobId();
String id = String.join("_", taskId, channel);
// 创建记录实体
MediaTransferRecord mediaTransferRecord = new MediaTransferRecord();
mediaTransferRecord.setId(id);
mediaTransferRecord.setUid(uid);
mediaTransferRecord.setProvider(channel); // 默认使用腾讯云
mediaTransferRecord.setInputPath(inputPath);
mediaTransferRecord.setOutputPath(outputPath);
mediaTransferRecord.setRedisKey(redisKey);
mediaTransferRecord.setPrice(price);
mediaTransferRecord.setIp(ip);
mediaTransferRecord.setDeviceId(deviceId);
mediaTransferRecord.setStatus(Constant.status.delete); // 处理中
mediaTransferRecordMapper.insert(mediaTransferRecord);
return taskId;
}
public void handleResult(MediaJobObject jobsDetail) {
if (null == jobsDetail || !"Success".equals(jobsDetail.getCode())){
throw new ServiceException(BusiStatus.PARAMERROR);
}
//todo 校验jobsDetail
String id = String.join("_", jobsDetail.getJobId(), channel);
MediaTransferRecord record = mediaTransferRecordMapper.selectById(id);
if (null == record){
throw new ServiceException(BusiStatus.ALREADY_NOTEXISTS_CONFIG);
}
//todo 失败退钱
//record.setStatus();
mediaTransferRecordMapper.updateById(record);
YidunCheckUtil.reviewAvatar(record.getUid(), record.getOutputPath(), record.getRedisKey(), record.getPrice(), record.getIp(), record.getDeviceId());
}
}

View File

@@ -30,8 +30,6 @@ import com.accompany.core.model.Users;
import com.accompany.core.service.base.BaseService;
import com.accompany.core.service.user.UsersBaseService;
import com.accompany.core.util.I18NMessageSourceUtil;
import com.qcloud.cos.model.ciModel.template.MediaTemplateRequest;
import com.qcloud.cos.model.ciModel.template.MediaTemplateResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
@@ -65,7 +63,7 @@ public class UploadAvatarService extends BaseService {
private final Long gifAvatarGoldPrice = 10000L;
@Autowired
private TencentDataUniverseService tencentDataUniverseService;
private MediaTransferService mediaTransferService;
public long getGifAvatarGoldPrice(){
return gifAvatarGoldPrice;
@@ -205,7 +203,7 @@ public class UploadAvatarService extends BaseService {
public void reviewAvatar(Long uid, String avatar, String redisKey, Long price, String ip, String deviceId) {
if (ImageFileUtils.isMp4(avatar)){
tencentDataUniverseService.transfer2Gif(uid, avatar, redisKey, price, ip, deviceId);
mediaTransferService.transfer2Gif(uid, avatar, redisKey, price, ip, deviceId);
return;
}
YidunCheckUtil.reviewAvatar(uid, avatar, redisKey, price, ip, deviceId);

View File

@@ -1,7 +1,7 @@
package com.accompany.business.controller;
import com.accompany.business.common.BaseController;
import com.accompany.business.service.TencentDataUniverseService;
import com.accompany.business.service.TencentDataInfiniteService;
import com.accompany.common.result.BusiResult;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.exception.ServiceException;
@@ -28,7 +28,7 @@ import javax.annotation.Resource;
public class TencentCosMediaCallbackController extends BaseController {
@Resource
private TencentDataUniverseService service;
private TencentDataInfiniteService service;
@ApiOperation("易盾图片审核结果上报")
@PostMapping("/callback")