|
@@ -1,8 +1,12 @@
|
|
|
package cn.com.ctop.common.module.service.impl;
|
|
|
|
|
|
+import cn.com.ctop.common.module.constant.OssConstant;
|
|
|
import cn.com.ctop.common.module.entity.MaterialCutFrame;
|
|
|
+import cn.com.ctop.common.module.entity.MaterialCutFrameTask;
|
|
|
import cn.com.ctop.common.module.mapper.MaterialCutFrameMapper;
|
|
|
import cn.com.ctop.common.module.service.IMaterialCutFrameService;
|
|
|
+import cn.com.ctop.common.module.service.IMaterialCutFrameTaskService;
|
|
|
+import cn.com.ctop.common.module.utils.Check;
|
|
|
import cn.com.ctop.common.module.utils.LoadFileUtil;
|
|
|
import cn.com.ctop.common.module.utils.MpsUtils;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
@@ -14,7 +18,11 @@ import com.aliyuncs.mts.model.v20140618.QuerySnapshotJobListResponse;
|
|
|
import com.aliyuncs.mts.model.v20140618.SubmitSnapshotJobRequest;
|
|
|
import com.aliyuncs.mts.model.v20140618.SubmitSnapshotJobResponse;
|
|
|
import com.aliyuncs.profile.DefaultProfile;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.io.IOException;
|
|
@@ -28,6 +36,7 @@ import java.net.URLEncoder;
|
|
|
* @version V1.0
|
|
|
* @date 2019-12-25
|
|
|
*/
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMapper, MaterialCutFrame> implements IMaterialCutFrameService {
|
|
|
|
|
@@ -35,26 +44,42 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
|
|
|
private static String ossBucket = "ctop-media";
|
|
|
private static String ossOutputObject = "output_{Count}.jpg";
|
|
|
|
|
|
+ @Value("${jeecg.path.image-upload}")
|
|
|
+ private String imageUpLoadPath;
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IMaterialCutFrameTaskService cutFrameTaskService;
|
|
|
+
|
|
|
/**
|
|
|
* 获取素材关键帧
|
|
|
*
|
|
|
* @param url
|
|
|
*/
|
|
|
@Override
|
|
|
- public void getCutFrame(String url, String materialId, String height, String width) throws IOException {
|
|
|
+ public void getCutFrame(String url, String materialId, Long secondDuration, String height, String width) throws IOException {
|
|
|
try {
|
|
|
- String zeroFrameUrl = url + "?x-oss-process=video/snapshot,t_00000,m_fast";
|
|
|
|
|
|
- // String localPath = LoadFileUtil.downLoadFromUrl(zeroFrameUrl, PropertiesUtils.getValue("kuaishou_config", "video_sava_path"));
|
|
|
- String localPath = LoadFileUtil.downLoadFromUrl(zeroFrameUrl, "D:\\tets1");
|
|
|
+ QueryWrapper<MaterialCutFrameTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.eq("video_signature", materialId);
|
|
|
+ queryWrapper.last("limit 1");
|
|
|
+ MaterialCutFrameTask checkCutFrame = cutFrameTaskService.getOne(queryWrapper);
|
|
|
+ if (!Check.isNull(checkCutFrame)) {
|
|
|
+ log.info("已存推荐封面");
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ String zeroFrameUrl = url + "?x-oss-process=video/snapshot,t_00000,m_fast";
|
|
|
+ String localPath = LoadFileUtil.downLoadFromUrl(zeroFrameUrl, imageUpLoadPath);
|
|
|
String md5 = LoadFileUtil.getMD5(localPath);
|
|
|
LoadFileUtil.delFile(localPath);
|
|
|
|
|
|
MaterialCutFrame cutFrame = new MaterialCutFrame();
|
|
|
- cutFrame.setCode(md5);
|
|
|
+ cutFrame.setSignature(md5);
|
|
|
cutFrame.setUrl(zeroFrameUrl);
|
|
|
- cutFrame.setMaterialMd5(materialId);
|
|
|
- cutFrame.setCutFrameIndex(0);
|
|
|
+ cutFrame.setVideoSignature(materialId);
|
|
|
+ cutFrame.setImageIndex(0);
|
|
|
this.save(cutFrame);
|
|
|
|
|
|
|
|
@@ -77,6 +102,8 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
|
|
|
input.put("Object", replaceUrl);
|
|
|
|
|
|
request.setInput(input.toJSONString());
|
|
|
+
|
|
|
+
|
|
|
// SnapshotConfig
|
|
|
JSONObject snapshotConfig = new JSONObject();
|
|
|
// SnapshotConfig->OutputFile
|
|
@@ -89,10 +116,11 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
|
|
|
|
|
|
snapshotConfig.put("OutputFile", output.toJSONString());
|
|
|
// SnapshotConfig->Time
|
|
|
- snapshotConfig.put("Time", "3");
|
|
|
+ Integer time = ((secondDuration.intValue() - 2) / 14); // 时长 / 14 == 间隔时间
|
|
|
+ snapshotConfig.put("Time", 2000);
|
|
|
// SnapshotConfig->Interval/Num
|
|
|
- snapshotConfig.put("Interval", "2");
|
|
|
- snapshotConfig.put("Num", "9");
|
|
|
+ snapshotConfig.put("Interval", time);
|
|
|
+ snapshotConfig.put("Num", "14");
|
|
|
// SnapshotConfig->Width/Height
|
|
|
snapshotConfig.put("Height", height);
|
|
|
snapshotConfig.put("Width", width);
|
|
@@ -101,60 +129,86 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
|
|
|
// PipelineId
|
|
|
String pipelineId = MpsUtils.getPipelineId(client);
|
|
|
request.setPipelineId(pipelineId);
|
|
|
- // call api
|
|
|
- SubmitSnapshotJobResponse response;
|
|
|
- response = client.getAcsResponse(request);
|
|
|
- for (int i = 0; i < 100; i++) {
|
|
|
- Thread.sleep(5 * 1000L);
|
|
|
- QuerySnapshotJobListRequest request1 = new QuerySnapshotJobListRequest();
|
|
|
- request1.setSnapshotJobIds(response.getSnapshotJob().getId());
|
|
|
- QuerySnapshotJobListResponse response1 = client.getAcsResponse(request1);
|
|
|
- String s = JSON.toJSONString(response1);
|
|
|
- JSONObject jsonObject = JSONObject.parseObject(s);
|
|
|
- if (jsonObject == null) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- JSONObject json = (JSONObject) jsonObject.getJSONArray("snapshotJobList").get(0);
|
|
|
- String state = json.getString("state");
|
|
|
- if (null == state || !"Success".equals(state)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- Integer count = json.getInteger("count");
|
|
|
- for (int j = 1; j <= count; j++) {
|
|
|
- String urlStr = "";
|
|
|
- if (j < 10) {
|
|
|
- urlStr = String.format(
|
|
|
- "https://%s.%s.aliyuncs.com/" + ossOutputObject1 + "output_0000" + j + ".jpg",
|
|
|
- ossBucket,
|
|
|
- ossLocation);
|
|
|
- } else if (j < 100) {
|
|
|
- urlStr = String.format(
|
|
|
- "https://%s.%s.aliyuncs.com/" + ossOutputObject1 + "output_000" + j + ".jpg",
|
|
|
- ossBucket,
|
|
|
- ossLocation);
|
|
|
- } else if (j > 100) {
|
|
|
- urlStr = String.format(
|
|
|
- "https://%s.%s.aliyuncs.com/" + ossOutputObject1 + "output_00" + j + ".jpg",
|
|
|
- ossBucket,
|
|
|
- ossLocation);
|
|
|
- }
|
|
|
- String cutFramePath = LoadFileUtil.downLoadFromUrl(urlStr, "D:\\tets1");
|
|
|
- String cutFrameMd5 = LoadFileUtil.getMD5(cutFramePath);
|
|
|
- LoadFileUtil.delFile(cutFramePath);
|
|
|
- cutFrame = new MaterialCutFrame();
|
|
|
- cutFrame.setCode(cutFrameMd5);
|
|
|
- cutFrame.setUrl(urlStr);
|
|
|
- cutFrame.setMaterialMd5(materialId);
|
|
|
- cutFrame.setCutFrameIndex(j);
|
|
|
- this.save(cutFrame);
|
|
|
+ SubmitSnapshotJobResponse response = client.getAcsResponse(request);
|
|
|
+ String jobId = response.getSnapshotJob().getId();
|
|
|
+ MaterialCutFrameTask cutFrameTask = new MaterialCutFrameTask();
|
|
|
+ cutFrameTask.setJobStatus(0);
|
|
|
+ cutFrameTask.setJobId(jobId);
|
|
|
+ cutFrameTask.setVideoSignature(materialId);
|
|
|
+ cutFrameTaskService.save(cutFrameTask);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error(e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void loadCutFrame(String jobId, String videoSignature) {
|
|
|
+ try {
|
|
|
+ DefaultProfile profile = DefaultProfile.getProfile(
|
|
|
+ "cn-beijing",
|
|
|
+ "LTAIbNbqWzSOklQV",
|
|
|
+ "1rkPz7JNoXk8sJevPaeYHWqfkQXBGh");
|
|
|
+ IAcsClient client = new DefaultAcsClient(profile);
|
|
|
+
|
|
|
+ QuerySnapshotJobListRequest request = new QuerySnapshotJobListRequest();
|
|
|
+ request.setSnapshotJobIds(jobId);
|
|
|
+ QuerySnapshotJobListResponse response = client.getAcsResponse(request);
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(response));
|
|
|
+ if (jsonObject == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ JSONObject json = (JSONObject) jsonObject.getJSONArray("snapshotJobList").get(0);
|
|
|
+ String state = json.getString("state");
|
|
|
+ if (null == state || !"Success".equals(state)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String loadImage = "cutFrame/" + videoSignature + "/";
|
|
|
+
|
|
|
+ Integer count = json.getInteger("count");
|
|
|
+ for (int j = 1; j <= count; j++) {
|
|
|
+ String urlStr = null;
|
|
|
+ if (j < 10) {
|
|
|
+ urlStr = String.format(
|
|
|
+ OssConstant.formatUrl + loadImage + "output_0000" + j + ".jpg",
|
|
|
+ ossBucket,
|
|
|
+ ossLocation);
|
|
|
+ } else if (j < 100) {
|
|
|
+ urlStr = String.format(
|
|
|
+ OssConstant.formatUrl + loadImage + "output_000" + j + ".jpg",
|
|
|
+ ossBucket,
|
|
|
+ ossLocation);
|
|
|
+ } else if (j > 100) {
|
|
|
+ urlStr = String.format(
|
|
|
+ OssConstant.formatUrl + loadImage + "output_00" + j + ".jpg",
|
|
|
+ ossBucket,
|
|
|
+ ossLocation);
|
|
|
}
|
|
|
- break;
|
|
|
+ String cutFramePath = LoadFileUtil.downLoadFromUrl(urlStr, imageUpLoadPath);
|
|
|
+ String cutFrameMd5 = LoadFileUtil.getMD5(cutFramePath);
|
|
|
+
|
|
|
+ MaterialCutFrame cutFrame = new MaterialCutFrame();
|
|
|
+ cutFrame.setSignature(cutFrameMd5);
|
|
|
+ cutFrame.setUrl(urlStr);
|
|
|
+ cutFrame.setVideoSignature(videoSignature);
|
|
|
+ cutFrame.setImageIndex(j);
|
|
|
+ this.save(cutFrame);
|
|
|
+ LoadFileUtil.delFile(cutFramePath);
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
+ QueryWrapper<MaterialCutFrameTask> updateQueryWrapper = new QueryWrapper<>();
|
|
|
+ updateQueryWrapper.eq("job_id", jobId);
|
|
|
+ updateQueryWrapper.eq("video_signature", videoSignature);
|
|
|
+ MaterialCutFrameTask updateTask = new MaterialCutFrameTask();
|
|
|
+ updateTask.setJobStatus(1);
|
|
|
+ cutFrameTaskService.update(updateTask, updateQueryWrapper);
|
|
|
} catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
+ log.error(e.getMessage());
|
|
|
}
|
|
|
|
|
|
-
|
|
|
}
|
|
|
|
|
|
|