From 0afb9937d0d95f6976ac06ff8a6595a5b9cbd26c Mon Sep 17 00:00:00 2001 From: shenrongliang <1328040932@qq.com> Date: 星期三, 16 四月 2025 17:18:37 +0800 Subject: [PATCH] 存储片头片尾 生成带片头片尾视频 --- yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/CourseMediaController.java | 22 +++++++ yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java | 3 + easegen-front/vite.config.ts | 2 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSubtitlesReqVO.java | 10 +++ yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java | 103 +++++++++++++++++++++++++++++++++ yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java | 2 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java | 8 ++ yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaService.java | 4 + 8 files changed, 149 insertions(+), 5 deletions(-) diff --git a/easegen-front/vite.config.ts b/easegen-front/vite.config.ts index b32a0dd..a69835c 100644 --- a/easegen-front/vite.config.ts +++ b/easegen-front/vite.config.ts @@ -36,7 +36,7 @@ open: env.VITE_OPEN === 'true', proxy: { '/admin-api': { - target: 'http://192.168.3.159:48080', + target: 'http://192.168.3.190:48080', changeOrigin: true, // 涓嶈 rewrite锛屽洜涓鸿淇濈暀瀹屾暣璺緞 } diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/CourseMediaController.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/CourseMediaController.java index 7f9b302..2170434 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/CourseMediaController.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/CourseMediaController.java @@ -126,9 +126,31 @@ return courseMediaService.createSubtitlesVideo(courseMediaSubtitlesReqVO); } + /** + * 鏇存柊瀛楀箷鏂囦欢 + * @param updateReqVO + * @return + */ + @PutMapping("/updateSubtitles") public CommonResult<Boolean> updateSubtitles(@Valid @RequestBody CourseMediaEditSReqVO updateReqVO) { courseMediaService.updateSubtitles(updateReqVO); return success(true); } + + /** + * 涓婁紶鐗囧ご鐗囧熬 + */ + @PostMapping("/createTrailer") + public CommonResult createTrailer(@RequestBody CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO){ + return courseMediaService.createTrailer(courseMediaSubtitlesReqVO); + } + + /** + * 鍚堟垚鐗囧ご鐗囧熬 + */ + @PostMapping("/createCompositeVideo") + public CommonResult createCompositeVideo(@RequestBody CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO){ + return courseMediaService.createCompositeVideo(courseMediaSubtitlesReqVO); + } } diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java index caa2e83..1cc3472 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java @@ -86,4 +86,7 @@ private String lang; private Integer pos; private String progressVideo; + private String titles; + private String trailer; + private String compositeVideo; } diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSubtitlesReqVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSubtitlesReqVO.java index 56d38f0..3f577a4 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSubtitlesReqVO.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSubtitlesReqVO.java @@ -10,7 +10,7 @@ @Schema(description = "缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "12757") private Long id; - + private String courseName; @Schema(description = "瀛楀箷鏂囦欢鍦板潃") private String subtitlesUrl; @Schema(description = "瀛楀箷鏂囦欢鐢熸垚鐘舵��1鍚堟垚涓紝2鎴愬姛锛�3澶辫触") @@ -21,4 +21,12 @@ private String videoUrl; private String lang; private String sentenceGap; + //濯掍綋閾炬帴 + private String previewUrl; + // 鐗囧ご鍦板潃 + private String titles; + //鐗囧熬鍦板潃 + private String trailer; + //鍚堟垚瑙嗛鍦板潃 + private String compositeVideo; } diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java index 761563d..348853c 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java @@ -99,4 +99,12 @@ private Integer pos; @TableField(exist = false) private String progressVideo; + + //鐗囧ご鍦板潃 + private String titles; + //鐗囧熬鍦板潃 + private String trailer; + + //鍚堟垚瑙嗛鍦板潃 + private String compositeVideo; } diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaService.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaService.java index c07cb5e..d56ed3a 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaService.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaService.java @@ -63,4 +63,8 @@ CommonResult createSubtitlesVideo(CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO); void updateSubtitles(CourseMediaEditSReqVO updateReqVO); + + CommonResult createTrailer(CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO); + + CommonResult createCompositeVideo(CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO); } diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java index 6b2cd38..1ecb592 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.digitalcourse.service.coursemedia; +import cn.hutool.core.io.FileUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -10,6 +11,7 @@ import cn.iocoder.yudao.module.digitalcourse.manager.MediaTaskManager; import cn.iocoder.yudao.module.digitalcourse.model.MediaTask; import cn.iocoder.yudao.module.infra.api.config.ConfigApi; +import cn.iocoder.yudao.module.infra.api.file.FileApi; import com.alibaba.fastjson.JSON; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -20,9 +22,10 @@ import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; import static cn.iocoder.yudao.module.digitalcourse.enums.ErrorCodeConstants.COURSE_MEDIA_NOT_EXISTS; @@ -42,6 +45,9 @@ @Resource private CourseMediaServiceUtil courseMediaServiceUtil; + + @Resource + private FileApi fileApi; @Override public Long createCourseMedia(CourseMediaSaveReqVO createReqVO) { @@ -222,4 +228,97 @@ updateObj.setSubtitlesStatus(2); courseMediaMapper.updateById(updateObj); } + + /** + * 涓婁紶鐗囧ご鐗囧熬 + * @param courseMediaSubtitlesReqVO + * @return + */ + @Override + public CommonResult createTrailer(CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO) { + CourseMediaDO courseMediaDO = new CourseMediaDO(); + courseMediaDO.setId(courseMediaSubtitlesReqVO.getId()); + courseMediaDO.setTrailer(courseMediaSubtitlesReqVO.getTrailer()); + courseMediaDO.setTitles(courseMediaSubtitlesReqVO.getTitles()); + int i = courseMediaMapper.updateById(courseMediaDO); + if (i>0){ + return CommonResult.success("鐗囧ご鐗囧熬涓婁紶鎴愬姛"); + } + return CommonResult.error(BAD_REQUEST.getCode(),"鐗囧ご鐗囧熬涓婁紶澶辫触"); + } + + /** + * 鍚堟垚鐗囧ご鐗囧熬瑙嗛 + * @param courseMediaSubtitlesReqVO + * @return + */ + @Override + public CommonResult createCompositeVideo(CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO) { + //鐗囧ご鍦板潃 + String titles = courseMediaSubtitlesReqVO.getTitles(); + titles = configApi.getConfigValueByKey("easegen.url") + titles.substring(titles.lastIndexOf("/")); + //鐗囧熬鍦板潃 + String trailer = courseMediaSubtitlesReqVO.getTrailer(); + trailer = configApi.getConfigValueByKey("easegen.url") + trailer.substring(trailer.lastIndexOf("/")); + String videoUrl = courseMediaSubtitlesReqVO.getVideoUrl(); + String previewUrl = courseMediaSubtitlesReqVO.getPreviewUrl(); + List<String> videoUrls = new ArrayList<>(); + videoUrls.add(titles); + if (videoUrl != null){ + videoUrl = configApi.getConfigValueByKey("easegen.url") + videoUrl.substring(videoUrl.lastIndexOf("/")); + videoUrls.add(videoUrl); + videoUrls.add(trailer); + } else if (previewUrl != null) { + previewUrl = configApi.getConfigValueByKey("easegen.url") + previewUrl.substring(previewUrl.lastIndexOf("/")); + videoUrls.add(previewUrl); + videoUrls.add(trailer); + } + //鍒ゆ柇鏂囦欢澶规槸鍚﹀瓨鍦紝濡傛灉涓嶅瓨鍦ㄥ氨鍒涘缓 + String filePath = configApi.getConfigValueByKey(HEYGEM_FACE2FACE) +"/compositeVideo/"; + File file = new File(filePath); + if (!file.exists()) { + file.mkdirs(); + } + String fileListPath = configApi.getConfigValueByKey(HEYGEM_FACE2FACE) +"/compositeVideo/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(); + } + //鍘绘帀updateReqVO.getName()涓殑绌烘牸鍜岀壒娈婂瓧绗� + String newFileName = courseMediaSubtitlesReqVO.getCourseName().replaceAll("[\\s\\p{Punct}]", ""); + ProcessBuilder builder = new ProcessBuilder( + "ffmpeg", "-f", "concat", "-safe","0", "-i",fileListPath , "-c", "copy", configApi.getConfigValueByKey(HEYGEM_FACE2FACE)+"/compositeVideo/"+newFileName+".mp4" +// q + ); + 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); + } + byte[] bytes = FileUtil.readBytes(FileUtil.file(configApi.getConfigValueByKey(HEYGEM_FACE2FACE) +"/compositeVideo/"+newFileName+".mp4")); + String compositeVideo = fileApi.createFile(bytes); + CourseMediaDO courseMediaDO = new CourseMediaDO(); + courseMediaDO.setId(courseMediaSubtitlesReqVO.getId()); + courseMediaDO.setCompositeVideo(compositeVideo); + int i = courseMediaMapper.updateById(courseMediaDO); + if (i>0){ + return CommonResult.success("瑙嗛鍚堟垚鎴愬姛"); + } + return CommonResult.error(BAD_REQUEST.getCode(),"瑙嗛鍚堟垚澶辫触"); + } } 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 041fc22..e147a34 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 @@ -304,7 +304,7 @@ //鍘绘帀updateReqVO.getName()涓殑绌烘牸鍜岀壒娈婂瓧绗� String newFileName = updateReqVO.getName().replaceAll("[\\s\\p{Punct}]", ""); ProcessBuilder builder = new ProcessBuilder( - "ffmpeg", "-f", "concat", "-safe","0", "-i",fileListPath , "-c", "copy", "D:/heygem_data/face2face/temp/"+"111111.mp4" + "ffmpeg", "-f", "concat", "-safe","0", "-i",fileListPath , "-c", "copy", configApi.getConfigValueByKey(HEYGEM_FACE2FACE)+"/temp/"+"111111.mp4" // q ); builder.redirectErrorStream(true); -- Gitblit v1.9.3