easegen-front/pnpm-lock.yaml
ÎļþÌ«´ó easegen-front/src/components/UploadFile/src/UploadFile.vue
@@ -87,7 +87,7 @@ const props = defineProps({ modelValue: propTypes.oneOfType<string | string[]>([String, Array<String>]).isRequired, fileType: propTypes.array.def(['doc', 'xls', 'ppt', 'txt', 'pdf']), // æä»¶ç±»å, ä¾å¦['png', 'jpg', 'jpeg'] fileSize: propTypes.number.def(5), // 大å°éå¶(MB) fileSize: propTypes.number.def(500), // 大å°éå¶(MB) limit: propTypes.number.def(5), // æ°ééå¶ autoUpload: propTypes.bool.def(true), // èªå¨ä¸ä¼ drag: propTypes.bool.def(false), // ææ½ä¸ä¼ easegen-front/src/views/pptTemplateList/index.vue
@@ -25,78 +25,78 @@ src="@/assets/digitalcourse/pptmodel.png" /> </div> <!--壿è§é¢--> <div class="group_8 flex-row justify-end cursor-pointer" @click="createSpeakVideo"> <div class="box_2 flex-col justify-between"> <div class="text-group_2 flex-col justify-between"> <span class="text_10"> {{ t('courseCenter.speakVideo') }}</span> <span class="text_11">{{ t('courseCenter.speakVideoTitle') }}</span> </div> <div class="box_3 flex-row"> <div class="image-wrapper_2 flex-col"> <img class="thumbnail_2" referrerpolicy="no-referrer" src="@/assets/digitalcourse/jiantou.png" /> </div> <span class="text_12">{{ t('courseCenter.goCreate') }}</span> </div> </div> <img class="image_3" referrerpolicy="no-referrer" src="@/assets/digitalcourse/pptmodel.png" /> </div> <!--æ°å人形象å®å¶--> <div class="group_8 flex-row justify-end cursor-pointer" @click="todigitalhumans"> <div class="box_2 flex-col justify-between"> <div class="text-group_2 flex-col justify-between"> <span class="text_10">{{ t('courseCenter.digitalPeopleImageCustom') }}</span> <span class="text_11">{{ t('courseCenter.submitImage') }}</span> </div> <div class="box_3 flex-row"> <div class="image-wrapper_2 flex-col"> <img class="thumbnail_2" referrerpolicy="no-referrer" src="@/assets/digitalcourse/jiantou.png" /> </div> <span class="text_12">{{ t('courseCenter.submitImage') }}</span> </div> </div> <img class="image_3" referrerpolicy="no-referrer" src="@/assets/digitalcourse/pptmodel.png" /> </div> <!--æ°å人声é³å®å¶--> <div class="group_8 flex-row justify-end cursor-pointer" @click="tovoice"> <div class="box_2 flex-col justify-between"> <div class="text-group_2 flex-col justify-between"> <span class="text_10">{{ t('courseCenter.digitalPeopleVoicesCustom') }}</span> <span class="text_11"></span> </div> <div class="box_3 flex-row"> <div class="image-wrapper_2 flex-col"> <img class="thumbnail_2" referrerpolicy="no-referrer" src="@/assets/digitalcourse/jiantou.png" /> </div> <span class="text_12">{{ t('courseCenter.submitVoices') }}</span> </div> </div> <img class="image_3" referrerpolicy="no-referrer" src="@/assets/digitalcourse/pptmodel.png" /> </div> <!-- <!–壿è§é¢–>--> <!-- <div class="group_8 flex-row justify-end cursor-pointer" @click="createSpeakVideo">--> <!-- <div class="box_2 flex-col justify-between">--> <!-- <div class="text-group_2 flex-col justify-between">--> <!-- <span class="text_10"> {{ t('courseCenter.speakVideo') }}</span>--> <!-- <span class="text_11">{{ t('courseCenter.speakVideoTitle') }}</span>--> <!-- </div>--> <!-- <div class="box_3 flex-row">--> <!-- <div class="image-wrapper_2 flex-col">--> <!-- <img--> <!-- class="thumbnail_2"--> <!-- referrerpolicy="no-referrer"--> <!-- src="@/assets/digitalcourse/jiantou.png"--> <!-- />--> <!-- </div>--> <!-- <span class="text_12">{{ t('courseCenter.goCreate') }}</span>--> <!-- </div>--> <!-- </div>--> <!-- <img--> <!-- class="image_3"--> <!-- referrerpolicy="no-referrer"--> <!-- src="@/assets/digitalcourse/pptmodel.png"--> <!-- />--> <!-- </div>--> <!-- <!–æ°å人形象å®å¶–>--> <!-- <div class="group_8 flex-row justify-end cursor-pointer" @click="todigitalhumans">--> <!-- <div class="box_2 flex-col justify-between">--> <!-- <div class="text-group_2 flex-col justify-between">--> <!-- <span class="text_10">{{ t('courseCenter.digitalPeopleImageCustom') }}</span>--> <!-- <span class="text_11">{{ t('courseCenter.submitImage') }}</span>--> <!-- </div>--> <!-- <div class="box_3 flex-row">--> <!-- <div class="image-wrapper_2 flex-col">--> <!-- <img--> <!-- class="thumbnail_2"--> <!-- referrerpolicy="no-referrer"--> <!-- src="@/assets/digitalcourse/jiantou.png"--> <!-- />--> <!-- </div>--> <!-- <span class="text_12">{{ t('courseCenter.submitImage') }}</span>--> <!-- </div>--> <!-- </div>--> <!-- <img--> <!-- class="image_3"--> <!-- referrerpolicy="no-referrer"--> <!-- src="@/assets/digitalcourse/pptmodel.png"--> <!-- />--> <!-- </div>--> <!-- <!–æ°å人声é³å®å¶–>--> <!-- <div class="group_8 flex-row justify-end cursor-pointer" @click="tovoice">--> <!-- <div class="box_2 flex-col justify-between">--> <!-- <div class="text-group_2 flex-col justify-between">--> <!-- <span class="text_10">{{ t('courseCenter.digitalPeopleVoicesCustom') }}</span>--> <!-- <span class="text_11"></span>--> <!-- </div>--> <!-- <div class="box_3 flex-row">--> <!-- <div class="image-wrapper_2 flex-col">--> <!-- <img--> <!-- class="thumbnail_2"--> <!-- referrerpolicy="no-referrer"--> <!-- src="@/assets/digitalcourse/jiantou.png"--> <!-- />--> <!-- </div>--> <!-- <span class="text_12">{{ t('courseCenter.submitVoices') }}</span>--> <!-- </div>--> <!-- </div>--> <!-- <img--> <!-- class="image_3"--> <!-- referrerpolicy="no-referrer"--> <!-- src="@/assets/digitalcourse/pptmodel.png"--> <!-- />--> <!-- </div>--> </div> <div class="title">{{ t('courseCenter.myCourses') }}</div> <div class="project-list"> yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaMegerVO.java
@@ -2,6 +2,7 @@ import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursescenes.vo.AppCourseScenesMegerReqVO; import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursescenes.vo.AppCourseScenesSaveReqVO; import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.AuditionVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -52,6 +53,8 @@ private List<AppCourseScenesMegerReqVO> scenes; private AuditionVO auditionVo; private List<String> ppt; @Schema(description = "åç«¯ä¼ çé¢ä¼°æ¶é´ ç§", requiredMode = Schema.RequiredMode.NOT_REQUIRED) yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java
@@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.digitalcourse.dal.dataobject.coursemedia; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.AuditionVO; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; @@ -87,6 +88,7 @@ private String thumbnail; // private AuditionVO auditVo; /* * é¢ä¼°æéæ£é¤ç积å * */ yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/mysql/digitalhumans/DigitalHumansMapper.java
@@ -40,4 +40,6 @@ Integer auditing(@Param("creator") Long creator); DigitalHumansDO selectByCode(@Param("code") String code); } yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java
@@ -106,6 +106,7 @@ courseMediaDO.setMediaType(1); courseMediaDO.setName(updateReqVO.getName()); courseMediaDO.setCourseName(updateReqVO.getName()); // courseMediaDO.setAuditVo(updateReqVO.getAuditionVo()); //å°updateReqVO 转æ¢ä¸ºjsonå符串 courseMediaDO.setReqJson(JSON.toJSONString(updateReqVO)); courseMediaMapper.insert(courseMediaDO); yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java
@@ -1,12 +1,19 @@ package cn.iocoder.yudao.module.digitalcourse.service.coursemedia; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaMegerVO; import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursescenecomponents.vo.AppCourseSceneComponentsMegerReqVO; import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursescenes.vo.AppCourseScenesMegerReqVO; import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.coursemedia.CourseMediaDO; import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.digitalhumans.DigitalHumansDO; import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.AuditionVO; import cn.iocoder.yudao.module.digitalcourse.dal.mysql.coursemedia.CourseMediaMapper; import cn.iocoder.yudao.module.digitalcourse.dal.mysql.digitalhumans.DigitalHumansMapper; import cn.iocoder.yudao.module.digitalcourse.service.voices.VoicesServiceImpl; import cn.iocoder.yudao.module.digitalcourse.util.SrtToVttUtil; import cn.iocoder.yudao.module.infra.api.config.ConfigApi; import com.alibaba.fastjson.JSON; @@ -18,10 +25,15 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.io.IOException; import java.io.*; import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -45,84 +57,232 @@ @Resource private SrtToVttUtil srtToVttUtil; @Resource private DigitalHumansMapper digitalcourseDigitalHumansMapper; @Resource private VoicesServiceImpl serviceImpl; /** * è¿ç¨åå¹¶è§é¢ * * @param updateReqVO * @return */ @Async public void remoteMegerMedia(CourseMediaMegerVO updateReqVO) { CourseMediaDO courseMediaDO = courseMediaMapper.selectById(updateReqVO.getCourseMediaId()); List<AppCourseScenesMegerReqVO> scenes = updateReqVO.getScenes(); //è·åæ°åäººç´ æï¼å£°é³ãè§é¢ï¼ String entityId = null; if (scenes != null) { //è·åscenesä¸ç第ä¸ä¸ªå ç´ çentityId List<AppCourseSceneComponentsMegerReqVO> components = scenes.get(0).getComponents(); if (components != null) { entityId = components.get(0).getEntityId(); } } DigitalHumansDO digitalHumansDO = digitalcourseDigitalHumansMapper.selectByCode(entityId); //è·åæ°åäººç´ æï¼å£°é³ãè§é¢ï¼ if (digitalHumansDO == null) { // 妿æ¾ä¸å°å¯¹åºç课ç¨åªä½è®°å½ï¼ç´æ¥è¿åæè®°å½é误æ¥å¿ return; } if (courseMediaDO == null) { // 妿æ¾ä¸å°å¯¹åºç课ç¨åªä½è®°å½ï¼ç´æ¥è¿åæè®°å½é误æ¥å¿ return; } boolean success; List<String> videoUrls = new ArrayList<>(); AuditionVO auditionVO = new AuditionVO(); auditionVO.setHumanId(String.valueOf(digitalHumansDO.getId())); for (AppCourseScenesMegerReqVO scene : scenes) { int maxRetries = 3; // æå¤§éè¯æ¬¡æ° int retryCount = 0; // å½åéè¯æ¬¡æ° boolean success = false; while (retryCount < maxRetries && !success) { auditionVO.setText(scene.getBackground().getPptRemark()); String audition = serviceImpl.audition(auditionVO); // æåé³é¢æä»¶åï¼è·¯å¾çæåä¸é¨åï¼ String substring = configApi.getConfigValueByKey("easegen.url") + audition.substring(audition.lastIndexOf("/")); String fileName = audition.substring(audition.lastIndexOf('/') + 1); String newFileName = "D:/heygem_data/face2face/temp/" + fileName; // æåè§é¢æä»¶åï¼è·¯å¾çæåä¸é¨åï¼ String substring1 = configApi.getConfigValueByKey("easegen.url") + digitalHumansDO.getFixVideoUrl().substring(digitalHumansDO.getFixVideoUrl().lastIndexOf("/")); String fileName1 = digitalHumansDO.getFixVideoUrl().substring(digitalHumansDO.getFixVideoUrl().lastIndexOf('/') + 1); String newFileName1 = "D:/heygem_data/face2face/temp/" + fileName1; //è·åPPTå 容 String cover = scene.getComponents().get(1).getCover(); //è·åèæ¯ String cover1 = scene.getBackground().getCover(); // åæpptèæ¯ï¼è§é¢ï¼æ¨¡æ¿ //ffmpeg -i 2.png -i 1.mp4 -filter_complex "[0:v]scale=w=ceil(iw/2)*2:h=ceil(ih/2)*2[bg];[1:v]scale=iw/2:ih/2[v1];[bg][v1]overlay=x=0:y=H-h" output.mp4 ProcessBuilder builder = new ProcessBuilder( "ffmpeg", "-i", cover1,"-i",cover,"-i",substring1,"-filter_complex","[0:v]scale=",scene.getBackground().getWidth().toString(),":",scene.getBackground().getHeight().toString(),"[bg];[1:v]scale=",scene.getComponents().get(1).getWidth().toString(),":",scene.getComponents().get(1).getHeight().toString(),"[v1];[bg][v1]overlay=x=",scene.getComponents().get(1).getMarginLeft().toString(),":y=",scene.getComponents().get(1).getTop().toString(),"[img];[2:v]scale=",scene.getComponents().get(0).getWidth().toString(),":",scene.getComponents().get(0).getHeight().toString(),"[v2];[img][v2]overlay=x=",scene.getComponents().get(0).getMarginLeft().toString(),":y=",scene.getComponents().get(0).getTop().toString(),newFileName1 ); builder.redirectErrorStream(true); Process process = null; try { // åéPOSTè¯·æ± HttpResponse execute = HttpRequest.post(configApi.getConfigValueByKey(EASEGEN_CORE_URL) + "/api/mergemedia") .header("X-API-Key", configApi.getConfigValueByKey(EASEGEN_CORE_KEY)) .body(JSON.toJSONString(updateReqVO)) .execute(); String body = execute.body(); process = builder.start(); } catch (IOException e) { throw new RuntimeException(e); } // æ£æ¥ååºç¶æç æ¯å¦æå if (execute.getStatus() != 200) { retryCount++; if (retryCount >= maxRetries) { // è¶ è¿éè¯æ¬¡æ°ï¼æ´æ°ç¶æåéè¯¯ä¿¡æ¯ courseMediaDO.setStatus(3); // 3 表示åæå¤±è´¥ courseMediaDO.setErrorReason(truncateErrorMsg("HTTP è¯·æ±æ¥é: " + execute.getStatus())); courseMediaMapper.updateById(courseMediaDO); return; } continue; // éæ°å°è¯ } // 读å FFmpeg è¾åºï¼å¯éï¼ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); try { Files.copy(Path.of(substring), Path.of(newFileName), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { throw new RuntimeException(e); } // è§£æååºï¼æ£æ¥æ¯å¦æéè¯¯ä¿¡æ¯ JSONObject responseJson = JSON.parseObject(body); if (!responseJson.getBoolean("success")) { // å¤çä¸å¡é»è¾éè¯¯ï¼æ´æ°ç¶æåéè¯¯ä¿¡æ¯ String errorDetail = responseJson.getString("detail"); retryCount++; if (retryCount >= maxRetries) { courseMediaDO.setStatus(3); // 3 表示åæå¤±è´¥ courseMediaDO.setErrorReason(truncateErrorMsg("API æ¥å£å¼å¸¸: " + errorDetail)); courseMediaMapper.updateById(courseMediaDO); return; } continue; // éæ°å°è¯ } //æå¤§éè¯æ¬¡æ° int maxRetries = 3; // å½åéè¯æ¬¡æ° int retryCount = 0; success = false; // 妿æåï¼æ´æ°ç¶æä¸º1ï¼æåï¼ courseMediaDO.setStatus(1); // 1 è¡¨ç¤ºåææå courseMediaMapper.updateById(courseMediaDO); success = true; } catch (Exception e) { retryCount++; if (retryCount >= maxRetries) { // æè·å¼å¸¸ï¼è®°å½é误åå å¹¶æ´æ°ç¶æ courseMediaDO.setStatus(3); // 3 表示åæå¤±è´¥ courseMediaDO.setErrorReason(truncateErrorMsg("è§é¢åæä»»å¡å¤±è´¥ï¼è¯·è系管çåï¼é误信æ¯: " + e.getMessage())); courseMediaMapper.updateById(courseMediaDO); return; } while (retryCount < maxRetries && !success) { try { // éè¯åçå¾ ä¸æ®µæ¶é´ï¼é¿å é¢ç¹è¯·æ± TimeUnit.SECONDS.sleep(2); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); // å¤ç䏿å¼å¸¸ break; // åéPOSTè¯·æ± HashMap<String, Object> objectObjectHashMap = new HashMap<>(); //é³é¢è·¯å¾ objectObjectHashMap.put("audio_url", fileName); //è§é¢è·¯å¾ï¼æ å£°ï¼ objectObjectHashMap.put("video_url", fileName1); //å¯ä¸keyï¼ç¨äºæ¥è¯¢ï¼ String code = RandomUtil.randomString(32); //åºå®å¼ objectObjectHashMap.put("code", code); objectObjectHashMap.put("chaofen", 0); objectObjectHashMap.put("watermark_switch", 0); objectObjectHashMap.put("pn", 1); HttpResponse execute = HttpRequest.post("http://192.168.3.161:8383/easy/submit") .body(JSON.toJSONString(objectObjectHashMap)) .execute(); String body = execute.body(); // æ£æ¥ååºç¶æç æ¯å¦æå if (execute.getStatus() != 200) { retryCount++; if (retryCount >= maxRetries) { // è¶ è¿éè¯æ¬¡æ°ï¼æ´æ°ç¶æåéè¯¯ä¿¡æ¯ courseMediaDO.setStatus(3); // 3 表示åæå¤±è´¥ courseMediaDO.setErrorReason(truncateErrorMsg("HTTP è¯·æ±æ¥é: " + execute.getStatus())); courseMediaMapper.updateById(courseMediaDO); return; } continue; // éæ°å°è¯ } // è§£æååºï¼æ£æ¥æ¯å¦æéè¯¯ä¿¡æ¯ JSONObject responseJson = JSON.parseObject(body); if (!responseJson.getBoolean("success")) { // å¤çä¸å¡é»è¾éè¯¯ï¼æ´æ°ç¶æåéè¯¯ä¿¡æ¯ String errorDetail = responseJson.getString("detail"); retryCount++; if (retryCount >= maxRetries) { courseMediaDO.setStatus(3); // 3 表示åæå¤±è´¥ courseMediaDO.setErrorReason(truncateErrorMsg("API æ¥å£å¼å¸¸: " + errorDetail)); courseMediaMapper.updateById(courseMediaDO); return; } continue; // éæ°å°è¯ } //è°ç¨æ¥è¯¢è§é¢ç»æ String result = getResult(code); result = "D:/heygem_data/face2face/temp" + result; videoUrls.add(result); // 妿æåï¼æ´æ°ç¶æä¸º1ï¼æåï¼ courseMediaDO.setStatus(1); courseMediaMapper.updateById(courseMediaDO); success = true; } catch (Exception e) { retryCount++; if (retryCount >= maxRetries) { // æè·å¼å¸¸ï¼è®°å½é误åå å¹¶æ´æ°ç¶æ courseMediaDO.setStatus(3); // 3 表示åæå¤±è´¥ courseMediaDO.setErrorReason(truncateErrorMsg("è§é¢åæä»»å¡å¤±è´¥ï¼è¯·è系管çåï¼é误信æ¯: " + e.getMessage())); courseMediaMapper.updateById(courseMediaDO); return; } try { // éè¯åçå¾ ä¸æ®µæ¶é´ï¼é¿å é¢ç¹è¯·æ± TimeUnit.SECONDS.sleep(2); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); // å¤ç䏿å¼å¸¸ break; } } } } String fileListPath = "D:/heygem_data/face2face/temp/filelist.txt"; try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileListPath))) { for (String path : videoUrls) { writer.write("file '" + path + "'\n"); } System.out.println("æä»¶å表已çæï¼" + fileListPath); } catch (IOException e) { e.printStackTrace(); } ProcessBuilder builder = new ProcessBuilder( "ffmpeg", "-f", "concat", "-safe","0", "-i", "DD:/heygem_data/face2face/temp/filelist.txt", "-c", "copy", "D:/heygem_data/face2face/temp/çæè§é¢.mp4" ); builder.redirectErrorStream(true); Process process = null; try { process = builder.start(); } catch (IOException e) { throw new RuntimeException(e); } } public String getResult(String taskCode) { // ä½¿ç¨ do-while 循ç¯è½®è¯¢ä»»å¡ç¶æ // å®ä¹åéåå¨è¿åç»æ String result = null; // åå§åç¶æä¸ºæªå®æ int status = -1; do { try { // è°ç¨æ¥å£è·åä»»å¡ç¶æï¼åè®¾ä½¿ç¨ Hutool ç HttpRequestï¼ String body = HttpRequest.get("http://192.168.3.161:8383/easy/query?code=" + taskCode) .execute() .body(); System.out.println("æ¥å£è¿åæ°æ®: " + body); // ä½¿ç¨ fastjson è§£æ JSON æ°æ® JSONObject jsonObject = JSON.parseObject(body); JSONObject data = jsonObject.getJSONObject("data"); // æåä»»å¡ç¶æåç»æ status = data.getIntValue("status"); // 妿任å¡å®æ if (status == 2) { result = data.getString("result"); System.out.println("ä»»å¡å·²å®æï¼ç»ææä»¶è·¯å¾: " + result); } else { System.out.println("ä»»å¡å°æªå®æï¼å½åè¿åº¦: " + data.getIntValue("progress") + "%"); } // çå¾ ä¸æ®µæ¶é´åè¿è¡ä¸ä¸æ¬¡è½®è¯¢ï¼é¿å é¢ç¹è¯·æ±ï¼ // æ¯é 5 ç§è½®è¯¢ä¸æ¬¡ Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); System.out.println("è°ç¨æ¥å£å¤±è´¥ï¼ç¨åéè¯..."); try { // åºç°å¼å¸¸æ¶ä¹çå¾ 5 ç§ Thread.sleep(5000); } catch (InterruptedException interruptedException) { interruptedException.printStackTrace(); } } // å½ status ä¸çäº 2 æ¶ç»§ç»å¾ªç¯ } while (status != 2); return result; } public Boolean reMegerMedia(CourseMediaDO courseMediaDO) { @@ -152,7 +312,7 @@ if (retryCount >= maxRetries) { // è¶ è¿éè¯æ¬¡æ°ï¼æ´æ°ç¶æåéè¯¯ä¿¡æ¯ courseMediaDO.setStatus(3); // 3 表示åæå¤±è´¥ courseMediaDO.setErrorReason(truncateErrorMsg("HTTP è¯·æ±æ¥é: " + execute.getStatus()+", æ¥éå 容: " + body)); courseMediaDO.setErrorReason(truncateErrorMsg("HTTP è¯·æ±æ¥é: " + execute.getStatus() + ", æ¥éå 容: " + body)); courseMediaMapper.updateById(courseMediaDO); return false; } yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceImpl.java
@@ -61,8 +61,26 @@ digitalHumansMapper.updateById(updateObj); if (updateObj.getStatus() == 2){ DigitalHumansTrailVO digitalHumansTrailVO = transferVO(updateObj.getId()); if (digitalHumansTrailVO.getIsTransparent() == 1) { digitalHumansMapper.update( new UpdateWrapper<DigitalHumansDO>() .lambda() .eq(DigitalHumansDO::getCode, digitalHumansTrailVO.getCode()) // æ¡ä»¶ï¼code çäºä¼ å ¥çå¼ .set(DigitalHumansDO::getFixVideoUrl,digitalHumansTrailVO.getVideoUrl()) ); } if (digitalHumansTrailVO.getIsTransparent() == 2) { digitalHumansMapper.update( new UpdateWrapper<DigitalHumansDO>() .lambda() .eq(DigitalHumansDO::getCode, digitalHumansTrailVO.getCode()) // æ¡ä»¶ï¼code çäºä¼ å ¥çå¼ .set(DigitalHumansDO::getStatus,6) ); digitalHumansServiceUtil.remoteHeyGemMatting(digitalHumansTrailVO); } //åçæ£è§é¢ digitalHumansServiceUtil.remoteHeyGemMatting(transferVO(updateObj.getId())); } //弿¥è®ç»æ¨¡å if (updateObj.getStatus() == 3){ yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceUtil.java
@@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.digitalcourse.service.digitalhumans; import cn.hutool.http.HttpException; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.iocoder.yudao.module.digitalcourse.controller.admin.digitalhumans.vo.DigitalHumansTrailVO; @@ -41,6 +42,8 @@ public class DigitalHumansServiceUtil { private static final String HEYGEM_CORE_URL = "heygem.core.url"; private static final String VIDEO2MOV = "video2mov"; private static final String VIDEO2MOV_URL = "video2mov.url"; private static final String HEYGEM_VOICE_DATA = "heygem.voice.data"; private static final String HEYGEM_FACE2FACE = "heygem.face2face"; private static final String EASEGEN_URL = "easegen.url"; @@ -60,9 +63,49 @@ private ConfigApi configApi; @Resource private FileApi fileApi; @Async public void remoteHeyGemMatting(DigitalHumansTrailVO digitalHumansTrailVO) { System.out.println(digitalHumansTrailVO); String video2movUrl = configApi.getConfigValueByKey(VIDEO2MOV); String extname = digitalHumansTrailVO.getVideoUrl().substring(digitalHumansTrailVO.getVideoUrl().lastIndexOf(".")); String modelFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + extname; String modelFilePath = Paths.get(video2movUrl, modelFileName).toString(); String substring = configApi.getConfigValueByKey(EASEGEN_URL) + digitalHumansTrailVO.getVideoUrl().substring(digitalHumansTrailVO.getVideoUrl().lastIndexOf("/")); try { Files.copy(Path.of(substring), Path.of(modelFilePath), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { throw new RuntimeException(e); } //modelFileName try { // åéPOSTè¯·æ± HttpResponse execute = HttpRequest.get(configApi.getConfigValueByKey(VIDEO2MOV_URL) + "?file=" + modelFileName).execute(); String body = execute.body(); // æ£æ¥ååºç¶æç æ¯å¦æå if (execute.getStatus() != 200) { digitalHumansMapper.update(new UpdateWrapper<DigitalHumansDO>().lambda().eq(DigitalHumansDO::getCode, digitalHumansTrailVO.getCode()).set(DigitalHumansDO::getStatus, 7)); return; } // è§£æååºï¼æ£æ¥æ¯å¦æéè¯¯ä¿¡æ¯ JSONObject responseJson = JSON.parseObject(body); String final_video_path = responseJson.getString("final_video_path"); byte[] content = Files.readAllBytes(Paths.get(final_video_path)); String fileUrl = fileApi.createFile(content); digitalHumansMapper.update( new UpdateWrapper<DigitalHumansDO>() .lambda() .eq(DigitalHumansDO::getCode, digitalHumansTrailVO.getCode()) // æ¡ä»¶ï¼code çäºä¼ å ¥çå¼ .set(DigitalHumansDO::getFixVideoUrl, fileUrl) .set(DigitalHumansDO::getStatus,2) ); System.out.println(responseJson); // å¤çä¸å¡é»è¾éè¯¯ï¼æ´æ°ç¶æåéè¯¯ä¿¡æ¯ } catch (HttpException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } @Async public void remoteHeyGemTrain(DigitalHumansTrailVO digitalHumansTrailVo){ @@ -75,12 +118,11 @@ } catch (IOException e) { throw new RuntimeException(e); } //todo è§é¢æ å¾ String extname = digitalHumansTrailVo.getVideoUrl().substring(digitalHumansTrailVo.getVideoUrl().lastIndexOf(".")); String extname = digitalHumansTrailVo.getFixVideoUrl().substring(digitalHumansTrailVo.getFixVideoUrl().lastIndexOf(".")); String modelFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + extname; String modelFilePath = Paths.get(temp, modelFileName).toString(); String substring = configApi.getConfigValueByKey(EASEGEN_URL)+digitalHumansTrailVo.getVideoUrl().substring(digitalHumansTrailVo.getVideoUrl().lastIndexOf("/")); String substring = configApi.getConfigValueByKey(EASEGEN_URL)+digitalHumansTrailVo.getFixVideoUrl().substring(digitalHumansTrailVo.getFixVideoUrl().lastIndexOf("/")); try { Files.copy(Path.of(substring), Path.of(modelFilePath), StandardCopyOption.REPLACE_EXISTING); yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java
@@ -192,7 +192,7 @@ File pdfFile = File.createTempFile("ppt_to_pdf_"+tempFileName, ".pdf"); String command; if (isWindows()) { command = String.format("\"C:\\Program Files\\LibreOffice\\program\\soffice.com\" --headless --convert-to pdf --outdir %s %s", pdfFile.getParent(), pptFile.getAbsolutePath()); command = String.format("\"E:\\LibreOffice\\LibreOffice\\program\\soffice.exe\" --headless --convert-to pdf --outdir %s %s", pdfFile.getParent(), pptFile.getAbsolutePath()); } else { command = String.format("libreoffice --headless --convert-to pdf --outdir %s %s", pdfFile.getParent(), pptFile.getAbsolutePath()); } yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/resources/mapper/digitalhumans/DigitalHumansMapper.xml
@@ -12,4 +12,8 @@ <select id="auditing"> select count(1) from digitalcourse_digital_humans where deleted = 0 and creator = #{creator} and status in (1,2,4) </select> <select id="selectByCode" resultType="cn.iocoder.yudao.module.digitalcourse.dal.dataobject.digitalhumans.DigitalHumansDO"> select * from digitalcourse_digital_humans where code = #{code} and deleted = 0 </select> </mapper> yudao-server/src/main/resources/application.yaml
@@ -12,8 +12,8 @@ servlet: # æä»¶ä¸ä¼ ç¸å ³é 置项 multipart: max-file-size: 50MB # å个æä»¶å¤§å° max-request-size: 50MB # 设置æ»ä¸ä¼ çæä»¶å¤§å° max-file-size: 500MB # å个æä»¶å¤§å° max-request-size: 500MB # 设置æ»ä¸ä¼ çæä»¶å¤§å° # Jackson é 置项 jackson: