From 3f3760641eb5efd3eeb18f3f183ca788dce4921d Mon Sep 17 00:00:00 2001 From: 康鲁杰 <60095866+KangLujie@users.noreply.github.com> Date: 星期二, 25 三月 2025 09:54:25 +0800 Subject: [PATCH] 截取数字人视频中的一张图片 --- yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceUtil.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 54 insertions(+), 4 deletions(-) diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceUtil.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceUtil.java index debbb40..393850e 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceUtil.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceUtil.java @@ -58,7 +58,9 @@ @Resource private ConfigApi configApi; - + @Resource + private FileApi fileApi; + @Async public void remoteHeyGemTrain(DigitalHumansTrailVO digitalHumansTrailVo){ String origin_audio = configApi.getConfigValueByKey(HEYGEM_VOICE_DATA) + "/origin_audio"; String temp = configApi.getConfigValueByKey(HEYGEM_FACE2FACE) + "/temp"; @@ -81,7 +83,6 @@ } catch (IOException e) { throw new RuntimeException(e); } - // 闊抽鏂囦欢璺緞 String audioFileName = modelFileName.replace(extname, ".wav"); @@ -137,8 +138,22 @@ // 澶勭悊涓氬姟閫昏緫閿欒锛屾洿鏂扮姸鎬佸拰閿欒淇℃伅 String referenceAudioText = responseJson.getString("reference_audio_text"); String asrFormatAudioUrl = responseJson.getString("asr_format_audio_url"); - // 濡傛灉鎴愬姛锛屾洿鏂扮姸鎬佷负0锛堟垚鍔燂級 + // 濡傛灉鎴愬姛锛岃幏鍙栦竴甯у綋鍥剧墖 + String picFileName = modelFileName.replace(extname, ".png"); + String pngPath = configApi.getConfigValueByKey(EASEGEN_URL) + "\\human_picture"; + try { + Files.createDirectories(Path.of(pngPath)); + } catch (IOException e) { + throw new RuntimeException(e); + } + String picFilePath = Paths.get(pngPath , picFileName).toString(); + int frameTime = 3; // 鎴彇绗� 5 绉掔殑鐢婚潰 + extractFrame(modelFilePath, picFilePath, frameTime); + byte[] fileContent = Files.readAllBytes(Paths.get(picFilePath)); // 璇诲彇鏂囦欢鍐呭 + + String fileUrl = fileApi.createFile(fileContent); + System.out.println(fileUrl); digitalHumansMapper.update( new UpdateWrapper<DigitalHumansDO>() .lambda() @@ -146,6 +161,7 @@ .set(DigitalHumansDO::getStatus, 0) // 鏇存柊瀛楁 status 涓� 0 .set(DigitalHumansDO::getAsrFormatAudioUrl,asrFormatAudioUrl) .set(DigitalHumansDO::getReferenceAudioText,referenceAudioText) + .set(DigitalHumansDO::getPictureUrl,fileUrl) ); success = true; }catch (Exception e){ @@ -166,7 +182,6 @@ } } } - } /** * 璋冪敤 FFmpeg 鎻愬彇闊抽 @@ -198,6 +213,41 @@ e.printStackTrace(); } } + + /** + * 璋冪敤 FFmpeg 鎻愬彇瑙嗛甯� + * @param videoPath 瑙嗛鏂囦欢璺緞 + * @param outputImagePath 杈撳嚭鍥剧墖璺緞 + * @param frameTime 鎴彇鐨勬椂闂寸偣 + */ + public static void extractFrame(String videoPath, String outputImagePath, int frameTime) { + ProcessBuilder processBuilder = new ProcessBuilder( + "ffmpeg","-i", videoPath,"-ss", String.valueOf(frameTime), + "-vframes", "1", + "-q:v", "2", + outputImagePath + ); + + processBuilder.redirectErrorStream(true); // 鍚堝苟閿欒杈撳嚭 + + try { + Process process = processBuilder.start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + + int exitCode = process.waitFor(); // 绛夊緟鎵ц瀹屾瘯 + if (exitCode == 0) { + System.out.println("鍥剧墖宸叉垚鍔熸彁鍙栧埌锛�" + outputImagePath); + } else { + System.out.println("FFmpeg 鎵ц澶辫触锛岄敊璇唬鐮侊細" + exitCode); + } + } catch (IOException | InterruptedException e) { + System.out.println("FFmpeg 鎵ц澶辫触锛屽彂鐢熷紓甯革細" + e.getMessage()); + } + } public void remoteTrain(DigitalHumansTrailVO digitalHumansTrailVo){ //璁粌鍓嶆牎楠� -- Gitblit v1.9.3