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