yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/digitalhumans/vo/DigitalHumansSaveReqVO.java
@@ -69,5 +69,6 @@ private String fixPictureUrl; //修复视频 private String fixVideoUrl; //是否为透明背景视频 1是 2否 private Integer isTransparent; } yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/digitalhumans/vo/DigitalHumansTrailVO.java
@@ -14,5 +14,6 @@ private String useModel; private String accountId; private String videoUrl; private Integer isTransparent; } yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/digitalhumans/DigitalHumansDO.java
@@ -134,5 +134,6 @@ private String referenceAudioText; private String asrFormatAudioUrl; private Integer isTransparent; } yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceImpl.java
@@ -60,6 +60,10 @@ DigitalHumansDO updateObj = BeanUtils.toBean(updateReqVO, DigitalHumansDO.class); digitalHumansMapper.updateById(updateObj); if (updateObj.getStatus() == 2){ //受理扣视频 digitalHumansServiceUtil.remoteHeyGemMatting(transferVO(updateObj.getId())); } //异步训练模型 if (updateObj.getStatus() == 3){ digitalHumansServiceUtil.remoteHeyGemTrain(transferVO(updateObj.getId())); @@ -72,6 +76,10 @@ DigitalHumansDO digitalHumans = this.getDigitalHumans(id); DigitalHumansTrailVO build = DigitalHumansTrailVO.builder().build(); if (StrUtil.isBlank(digitalHumans.getVideoUrl())) build.setVideoUrl(digitalHumans.getVideoUrl()); if (StrUtil.isBlank(digitalHumans.getFixVideoUrl())) build.setFixVideoUrl(digitalHumans.getFixVideoUrl()); if (digitalHumans.getIsTransparent() != null) { build.setIsTransparent(digitalHumans.getIsTransparent()); } BeanUtils.copyProperties(digitalHumans, build); build.setAccountId(digitalHumans.getCreator()); return build; yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceUtil.java
@@ -60,6 +60,10 @@ private ConfigApi configApi; @Resource private FileApi fileApi; public void remoteHeyGemMatting(DigitalHumansTrailVO digitalHumansTrailVO) { System.out.println(digitalHumansTrailVO); } @Async public void remoteHeyGemTrain(DigitalHumansTrailVO digitalHumansTrailVo){ String origin_audio = configApi.getConfigValueByKey(HEYGEM_VOICE_DATA) + "/origin_audio"; @@ -147,9 +151,8 @@ throw new RuntimeException(e); } String picFilePath = Paths.get(pngPath , picFileName).toString(); int frameTime = 3; // 截取第 5 秒的画面 extractFrame(modelFilePath, picFilePath, frameTime); extractFrame(modelFilePath, picFilePath); byte[] fileContent = Files.readAllBytes(Paths.get(picFilePath)); // 读取文件内容 String fileUrl = fileApi.createFile(fileContent); @@ -220,10 +223,11 @@ * @param outputImagePath 输出图片路径 * @param frameTime 截取的时间点 */ public static void extractFrame(String videoPath, String outputImagePath, int frameTime) { public static void extractFrame(String videoPath, String outputImagePath) { ProcessBuilder processBuilder = new ProcessBuilder( "ffmpeg","-i", videoPath,"-ss", String.valueOf(frameTime), "-vframes", "1", "ffmpeg", "-i", videoPath, "-vf", "select=eq(n\\,0)", // 选择第0帧 "-vsync", "vfr", // 防止重复帧 "-q:v", "2", outputImagePath ); @@ -390,4 +394,6 @@ } } }