From 0e7b0e885872459ad27492e84c0dce43a92a465e Mon Sep 17 00:00:00 2001 From: shenrongliang <1328040932@qq.com> Date: 星期四, 03 四月 2025 09:09:38 +0800 Subject: [PATCH] 配置修改,合成视频 --- easegen-front/src/views/chooseTemplate/index.vue | 15 ++++--- yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java | 75 ++++++++++++++++++++++++++++++------- 2 files changed, 68 insertions(+), 22 deletions(-) diff --git a/easegen-front/src/views/chooseTemplate/index.vue b/easegen-front/src/views/chooseTemplate/index.vue index d06b627..9fa14cf 100644 --- a/easegen-front/src/views/chooseTemplate/index.vue +++ b/easegen-front/src/views/chooseTemplate/index.vue @@ -1560,14 +1560,15 @@ warningStrArr.push( `鍦烘櫙<span style="color: red; font-weight: bold;">${i + 1}</span>鏃犳湁鏁堢殑鍙f挱鍐呭` ) - } else { - //鍒ゆ柇鍘婚櫎鏍囩鍚庣殑鍐呭闀垮害鏄惁瓒呰繃2000瀛� - if (plainText.length > 2000) { - warningStrArr.push( - `鍦烘櫙<span style="color: red; font-weight: bold;">${i + 1}</span>鍙f挱鍐呭瓒呰繃2000瀛楋紝璇峰噺灏戞垨鎷嗗垎鍦烘櫙` - ) - } } + // else { + // //鍒ゆ柇鍘婚櫎鏍囩鍚庣殑鍐呭闀垮害鏄惁瓒呰繃2000瀛� + // if (plainText.length > 2000) { + // warningStrArr.push( + // `鍦烘櫙<span style="color: red; font-weight: bold;">${i + 1}</span>鍙f挱鍐呭瓒呰繃2000瀛楋紝璇峰噺灏戞垨鎷嗗垎鍦烘櫙` + // ) + // } + // } } } diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java index a82ee9e..cde4060 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java @@ -26,16 +26,15 @@ import org.springframework.validation.annotation.Validated; import java.io.*; +import java.math.BigDecimal; import java.math.BigInteger; +import java.math.RoundingMode; 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.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -97,7 +96,7 @@ AuditionVO auditionVO = new AuditionVO(); auditionVO.setHumanId(String.valueOf(digitalHumansDO.getId())); for (AppCourseScenesMegerReqVO scene : scenes) { - + //TODO 鍏堝垽鏂槸鍚︽湁澶囨敞鍐呭 auditionVO.setText(scene.getBackground().getPptRemark()); String audition = serviceImpl.audition(auditionVO); // 鎻愬彇闊抽鏂囦欢鍚嶏紙璺緞鐨勬渶鍚庝竴閮ㄥ垎锛� @@ -107,32 +106,58 @@ // 鎻愬彇瑙嗛鏂囦欢鍚嶏紙璺緞鐨勬渶鍚庝竴閮ㄥ垎锛� 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; + String newFileName1 = "D:/heygem_data/face2face/temp/"+fileName1; + //鑾峰彇鏃堕棿鎴� + Date date = new Date(); + long timestamp = date.getTime(); + String newFileName2 = "D:/heygem_data/face2face/temp/"+timestamp+".mp4"; //鑾峰彇PPT鍐呭 - String cover = scene.getComponents().get(1).getCover(); + String cover = scene.getComponents().get(1).getSrc(); + cover = configApi.getConfigValueByKey("easegen.url") + scene.getComponents().get(1).getSrc().substring(scene.getComponents().get(1).getSrc().lastIndexOf("/")); + //鑾峰彇鑳屾櫙 String cover1 = scene.getBackground().getCover(); + cover1 = configApi.getConfigValueByKey("easegen.url") + scene.getBackground().getCover().substring(scene.getBackground().getCover().lastIndexOf("/")); + // 鍘绘帀鎵╁睍鍚� + int dotIndex = fileName1.lastIndexOf('.'); + String substring2 = fileName1.substring(0, dotIndex); // 鍚堟垚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 + "ffmpeg", + "-i", cover1, + "-i", cover, + "-i", substring1, + "-filter_complex", + "[0:v]scale=" + Math.round(scene.getBackground().getWidth()) + ":" + Math.round(scene.getBackground().getHeight()) + "[bg];" + + "[1:v]scale=" + Math.round(scene.getComponents().get(1).getWidth()) + ":" + Math.round(scene.getComponents().get(1).getHeight()) + "[v1];" + + "[bg][v1]overlay=x=" + Math.round(scene.getComponents().get(1).getMarginLeft()) + ":y=" + Math.round(scene.getComponents().get(1).getTop()) + "[img];" + + "[2:v]scale=" + Math.round(scene.getComponents().get(0).getWidth()) + ":" + Math.round(scene.getComponents().get(0).getHeight()) + "[v2];" + + "[img][v2]overlay=x=" + Math.round(scene.getComponents().get(0).getMarginLeft()) + ":y=" + Math.round(scene.getComponents().get(0).getTop()), + newFileName2 ); + System.out.println(newFileName2); builder.redirectErrorStream(true); Process process = null; try { process = builder.start(); + // 璇诲彇 FFmpeg 杈撳嚭锛堝彲閫夛級 + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + System.out.println(builder.command()); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + } catch (IOException e) { throw new RuntimeException(e); } - // 璇诲彇 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); } - //鏈�澶ч噸璇曟鏁� int maxRetries = 3; // 褰撳墠閲嶈瘯娆℃暟 @@ -145,8 +170,8 @@ HashMap<String, Object> objectObjectHashMap = new HashMap<>(); //闊抽璺緞 objectObjectHashMap.put("audio_url", fileName); - //瑙嗛璺緞锛堟棤澹帮級 - objectObjectHashMap.put("video_url", fileName1); + //瑙嗛璺緞 + objectObjectHashMap.put("video_url",timestamp+".mp4"); //鍞竴key锛堢敤浜庢煡璇級 String code = RandomUtil.randomString(32); //鍥哄畾鍊� @@ -191,10 +216,10 @@ String result = getResult(code); result = "D:/heygem_data/face2face/temp" + result; videoUrls.add(result); + System.out.println("椹卞姩瑙嗛鍚�"+result); // 濡傛灉鎴愬姛锛屾洿鏂扮姸鎬佷负1锛堟垚鍔燂級 courseMediaDO.setStatus(1); courseMediaMapper.updateById(courseMediaDO); - success = true; } catch (Exception e) { retryCount++; if (retryCount >= maxRetries) { @@ -213,7 +238,9 @@ break; } } + success = true; } + } String fileListPath = "D:/heygem_data/face2face/temp/filelist.txt"; try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileListPath))) { @@ -224,13 +251,24 @@ } catch (IOException e) { e.printStackTrace(); } + //鍘绘帀updateReqVO.getName()涓殑绌烘牸鍜岀壒娈婂瓧绗� + String newFileName = updateReqVO.getName().replaceAll("[\\s\\p{Punct}]", ""); 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" + "ffmpeg", "-f", "concat", "-safe","0", "-i",fileListPath , "-c", "copy", "D:/heygem_data/face2face/temp/"+"111111.mp4" ); builder.redirectErrorStream(true); Process process = null; try { process = builder.start(); + // 璇诲彇 FFmpeg 杈撳嚭锛堝彲閫夛級 + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + System.out.println(builder.command()); + System.out.println("鏈�缁堣棰戝凡鐢熸垚"); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + } catch (IOException e) { throw new RuntimeException(e); } @@ -238,6 +276,13 @@ } + // 鍥涜垗浜斿叆鏂规硶 + private static int round(double value) { + return BigDecimal.valueOf(value) + .setScale(0, RoundingMode.HALF_UP) + .intValue(); + } + public String getResult(String taskCode) { // 浣跨敤 do-while 寰幆杞浠诲姟鐘舵�� // 瀹氫箟鍙橀噺瀛樺偍杩斿洖缁撴灉 -- Gitblit v1.9.3