From c66d8ad131d3643913b7ceb0ce5fd88766abda8c Mon Sep 17 00:00:00 2001
From: du <13220750630.163.com>
Date: 星期一, 07 四月 2025 14:48:51 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 easegen-front/src/views/chooseTemplate/index.vue                                                                                                              |   15 +-
 easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue                                                                                 |  271 ++++++++++++++++++++++++++++++++++++++
 easegen-front/src/views/digitalcourse/digitalhumans/index.vue                                                                                                 |   16 +
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java |   75 ++++++++--
 easegen-front/src/views/digitalcourse/digitalhumans/DigitalHumansForm.vue                                                                                     |    8 -
 5 files changed, 352 insertions(+), 33 deletions(-)

diff --git a/easegen-front/src/views/chooseTemplate/index.vue b/easegen-front/src/views/chooseTemplate/index.vue
index 952879b..ed64afd 100644
--- a/easegen-front/src/views/chooseTemplate/index.vue
+++ b/easegen-front/src/views/chooseTemplate/index.vue
@@ -1566,14 +1566,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/easegen-front/src/views/digitalcourse/digitalhumans/DigitalHumansForm.vue b/easegen-front/src/views/digitalcourse/digitalhumans/DigitalHumansForm.vue
index 848ea7d..142f6f2 100644
--- a/easegen-front/src/views/digitalcourse/digitalhumans/DigitalHumansForm.vue
+++ b/easegen-front/src/views/digitalcourse/digitalhumans/DigitalHumansForm.vue
@@ -47,13 +47,6 @@
       <el-form-item v-if="formData.useModel == 2" :label="t('digitalhumans.video')" prop="videoUrl">
         <!-- 鍘熸湰鑷甫鐨勮棰戜笂浼� -->
         <UploadFile v-if="!(formData.videoUrl || formData.fixVideoUrl)" v-model="formData.videoUrl" :fileType="['mp4','mov']" :limit="1" @on-success="handleFileSuccess('videoUrl', $event)"/>
-        <!-- 鍚庢湡娣诲姞鐨勫幓闄ょ豢骞曠殑 -->
-        <!-- <div v-if="!(formData.videoUrl || formData.fixVideoUrl)" >
-          <CES2 @start="StartCes" @Thnd="End" msg="Welcome to Your Vue.js App"/>
-          <div style="color: red;" v-show="isUploading"  >
-              褰撳墠姝e湪澶勭悊骞朵笂浼犱腑锛岃鑰愬績绛夊緟...
-          </div>
-        </div> -->
         <!-- 鍘熻棰戞挱鏀惧櫒 -->
         <!-- <video-player v-if="formData.videoUrl || formData.fixVideoUrl" :property="videoProperty"/> -->
          <!-- 鏂扮殑瑙嗛鎾斁鍣� -->
@@ -105,7 +98,6 @@
 import {VideoPlayerProperty} from "@/components/DiyEditor/components/mobile/VideoPlayer/config";
 import { useUpload } from '@/components/UploadFile/src/useUpload'
 import { el } from 'element-plus/es/locale';
-import CES2 from './CES2.vue'
 import { any } from 'vue-types';
 
 const { t } = useI18n() // 鍥介檯鍖�
diff --git a/easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue b/easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue
new file mode 100644
index 0000000..8064faf
--- /dev/null
+++ b/easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue
@@ -0,0 +1,271 @@
+<template>
+    <Dialog :title="dialogTitle" v-model="dialogVisible">
+      <el-form
+        ref="formRef"
+        :model="formData"
+        :rules="formRules"
+        label-width="120px"
+        v-loading="formLoading"
+      >
+        <el-form-item :label="t('digitalhumans.name')" prop="name">
+          <el-input v-model="formData.name" :placeholder="t('common.inputText') + t('digitalhumans.name')" />
+        </el-form-item>
+        <el-form-item :label="t('digitalhumans.code')" prop="code" v-if="false" > // 褰撳墠鏁板瓧浜鸿棰戠殑缂栫爜绫诲瀷
+          <el-input v-model="formData.code" :placeholder="t('common.inputText') + t('digitalhumans.code')" />
+        </el-form-item>
+        <el-form-item :label="t('digitalhumans.gender')" prop="gender">
+          <el-select v-model="formData.gender" :placeholder="t('common.selectText')+t('digitalhumans.gender')">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item :label="t('digitalhumans.useModel')" prop="useModel" v-if="false" > //鏁板瓧浜烘ā寮忛�夋嫨妗�
+          <el-select v-model="formData.useModel" :placeholder="t('common.selectText')+t('digitalhumans.useModel')">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.USE_MODEL)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="Number(dict.value)"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鑳屾櫙鏍峰紡" prop="isTransparent">
+          <el-select v-model="formData.isTransparent" placeholder="璇烽�夋嫨鏄惁鍘婚櫎鑳屾櫙">
+            <el-option value="1" label="閫忔槑鑳屾櫙"/>
+            <el-option value="2" label="缁垮箷鑳屾櫙"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="formData.useModel == 1" :label="t('digitalhumans.picture')" prop="pictureUrl">
+          <UploadImg v-if="formData" v-model="formData.fixPictureUrl" />
+          <UploadImg v-else v-model="formData.pictureUrl" />
+        </el-form-item>
+  
+        <!-- <el-form-item v-if="formData.useModel == 2" :label="t('digitalhumans.video')" prop="videoUrl"> -->
+        <el-form-item v-if="false" :label="t('digitalhumans.video')" prop="videoUrl">
+          <!-- 鍘熸湰鑷甫鐨勮棰戜笂浼� -->
+          <UploadFile v-if="!(formData.videoUrl || formData.fixVideoUrl)" v-model="formData.videoUrl" :fileType="['mp4','mov']" :limit="1" @on-success="handleFileSuccess('videoUrl', $event)"/>
+          <!-- 鍘熻棰戞挱鏀惧櫒 -->
+          <!-- <video-player v-if="formData.videoUrl || formData.fixVideoUrl" :property="videoProperty"/> -->
+           <!-- 鏂扮殑瑙嗛鎾斁鍣� -->
+          <VideoPlayerMov  v-if="formData.videoUrl || formData.fixVideoUrl" :property="videoProperty"/>
+        </el-form-item>
+  <!--      <el-form-item :label="鎶犲浘鏍囪瘑" prop="matting">
+          <el-select v-model="formData.matting" :placeholder="璇烽�夋嫨鎶犲浘鏍囪瘑">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.DIGITALCOURSE_DIGITALHUMAN_MATTING)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>-->
+        <el-form-item :label="t('digitalhumans.posture')" prop="posture">
+          <el-select v-model="formData.posture" :placeholder="t('common.selectText') + t('digitalhumans.posture')">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.DIGITALCOURSE_DIGITALHUMAN_POSTURE)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item :label="t('digitalhumans.type')" prop="type">
+          <el-select v-model="formData.type" :placeholder="t('common.selectText') + t('digitalhumans.type')">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.DIGITALCOURSE_DIGITALHUMAN_TYPE)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="submitForm" type="primary" :disabled="formLoading" :loading="isUploading" >{{t('common.ok')}}</el-button>
+        <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
+      </template>
+    </Dialog>
+  </template>
+  <script setup lang="ts">
+  import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
+  import * as DigitalHumansApi from '@/api/digitalcourse/digitalhumans'
+  import VideoPlayer from "@/components/DiyEditor/components/mobile/VideoPlayer/index.vue";
+  import VideoPlayerMov from "@/components/DiyEditor/components/mobile/VideoPlayer_mov/index.vue";
+  import {DiyComponent} from "@/components/DiyEditor/util";
+  import {VideoPlayerProperty} from "@/components/DiyEditor/components/mobile/VideoPlayer/config";
+  import { useUpload } from '@/components/UploadFile/src/useUpload'
+  import { el } from 'element-plus/es/locale';
+  import { any } from 'vue-types';
+  
+  const { t } = useI18n() // 鍥介檯鍖�
+  const message = useMessage() // 娑堟伅寮圭獥
+  
+  const { uploadUrl, httpRequest } = useUpload() //涓婁紶鏂规硶
+  const dialogVisible = ref(false) // 寮圭獥鐨勬槸鍚﹀睍绀�
+  const dialogTitle = ref('') // 寮圭獥鐨勬爣棰�
+  const formLoading = ref(false) // 琛ㄥ崟鐨勫姞杞戒腑锛�1锛変慨鏀规椂鐨勬暟鎹姞杞斤紱2锛夋彁浜ょ殑鎸夐挳绂佺敤
+  const formType = ref('') // 琛ㄥ崟鐨勭被鍨嬶細create - 鏂板锛泆pdate - 淇敼
+  const formData = ref({
+    id: undefined,
+    expireStatus: undefined,
+    finishTime: undefined,
+    gender: undefined,
+    matting: undefined,
+    name: undefined,
+    code: undefined,
+    pictureUrl: undefined,
+    posture: undefined,
+    snapshotHeight: undefined,
+    snapshotUrl: undefined,
+    snapshotWidth: undefined,
+    type: undefined,
+    useGeneralModel: undefined,
+    useModel: undefined,
+    status: undefined,
+    isTransparent: undefined,
+  })
+  
+  // 褰撳墠鏄惁姝e湪涓婁紶瑙嗛
+  const isUploading = ref(false)
+  
+  const videoProperty = {
+    videoUrl: '',
+    posterUrl: '',
+    autoplay: false,
+    style: {
+      bgType: 'color',
+      bgColor: '#fff',
+      marginBottom: 8,
+      height: 300
+    }
+  } as DiyComponent<VideoPlayerProperty>
+  
+  watch(()=> formData.value.videoUrl,(newVal,oldValue)=>{
+    if (newVal && newVal.length > 0){
+      videoProperty.videoUrl = formData.value.fixVideoUrl || newVal
+    }
+  })
+  const formRules = reactive({
+    gender: [{ required: true, message: '鎬у埆涓嶈兘涓虹┖', trigger: 'change' }],
+    name: [{ required: true, message: '鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }],
+    pictureUrl: [{ required: true, message: '鍥剧墖URL涓嶈兘涓虹┖', trigger: 'blur' }],
+    posture: [{ required: true, message: '濮垮娍涓嶈兘涓虹┖', trigger: 'change' }],
+    snapshotHeight: [{ required: true, message: '蹇収楂樺害涓嶈兘涓虹┖', trigger: 'blur' }],
+    snapshotUrl: [{ required: true, message: '蹇収URL涓嶈兘涓虹┖', trigger: 'blur' }],
+    snapshotWidth: [{ required: true, message: '蹇収瀹藉害涓嶈兘涓虹┖', trigger: 'blur' }],
+    type: [{ required: true, message: '绫诲瀷涓嶈兘涓虹┖', trigger: 'change' }],
+    useGeneralModel: [{ required: true, message: '浣跨敤閫氱敤妯″瀷涓嶈兘涓虹┖', trigger: 'change' }],
+    isTransparent: [{ required: true, message: '鏄惁鍘婚櫎鑳屾櫙涓嶈兘涓虹┖', trigger: 'change' }],
+    status: [{ required: true, message: '鐘舵�佷笉鑳戒负绌�', trigger: 'change' }],
+    videoUrl: [{ required: true, message: '瑙嗛涓嶈兘涓虹┖', trigger: 'blur' }]
+  })
+  const formRef = ref() // 琛ㄥ崟 Ref
+  
+  const StartCes = () => {
+    console.log( " ----- 寮�濮� ----- " )
+    isUploading.value = true
+  }
+  
+  const End = (res)=>{
+    const FileObject = {
+      file:res
+    }
+    httpRequest( FileObject ).then( response =>{
+      console.log(response)
+      formData.value.videoUrl = response.data;
+    } ).finally( res => {
+      isUploading.value = false
+    } )
+  
+  }
+  
+  /** 鎵撳紑寮圭獥 */
+  const open = async (type: string, id?: number) => {
+    dialogVisible.value = true
+    dialogTitle.value = t('action.' + type)
+    formType.value = type
+    resetForm()
+    // 淇敼鏃讹紝璁剧疆鏁版嵁
+    if (id) {
+      formLoading.value = true
+      try {
+        formData.value = await DigitalHumansApi.getDigitalHumans(id)
+      } finally {
+        formLoading.value = false
+      }
+    }else{
+      InitHumMODEL()
+    }
+  }
+  defineExpose({ open }) // 鎻愪緵 open 鏂规硶锛岀敤浜庢墦寮�寮圭獥
+  
+  /** 鎻愪氦琛ㄥ崟 */
+  const emit = defineEmits(['success']) // 瀹氫箟 success 浜嬩欢锛岀敤浜庢搷浣滄垚鍔熷悗鐨勫洖璋�
+  const submitForm = async () => {
+    // 鏍¢獙琛ㄥ崟
+    await formRef.value.validate()
+    // 鎻愪氦璇锋眰
+    formLoading.value = true
+    try {
+      const data = formData.value as unknown as DigitalHumansApi.DigitalHumansVO
+      if (formType.value === 'create') {
+        await DigitalHumansApi.createDigitalHumans(data)
+        message.success(t('common.createSuccess'))
+      } else {
+        await DigitalHumansApi.updateDigitalHumans(data)
+        message.success(t('common.updateSuccess'))
+      }
+      dialogVisible.value = false
+      // 鍙戦�佹搷浣滄垚鍔熺殑浜嬩欢
+      emit('success')
+    } finally {
+      formLoading.value = false
+    }
+  }
+  
+  /** 閲嶇疆琛ㄥ崟 */
+  const resetForm = () => {
+    formData.value = {
+      id: undefined,
+      expireStatus: undefined,
+      finishTime: undefined,
+      gender: undefined,
+      matting: undefined,
+      name: undefined,
+      code: undefined,
+      pictureUrl: undefined,
+      posture: undefined,
+      snapshotHeight: undefined,
+      snapshotUrl: undefined,
+      snapshotWidth: undefined,
+      type: undefined,
+      useGeneralModel: undefined,
+      useModel: undefined,
+      status: undefined,
+    }
+    formRef.value?.resetFields()
+  }
+  const handleFileSuccess = (fileType,response) => {
+    if (fileType === 'videoUrl') {
+      formData.value.videoUrl = response.data;
+    }
+  };
+  
+  // 淇敼榛樿鐨勬暟瀛椾汉瑙嗛妯″紡涓鸿棰�
+  
+  const InitHumMODEL = ()=>{
+    let ModelList = getIntDictOptions( DICT_TYPE.USE_MODEL )
+    for (let index = 0; index < ModelList.length; index++) {
+      const element = ModelList[index];
+      if( element.label === "瑙嗛" ){
+        formData.value.useModel = Number( element.value )
+      }
+    }
+  }
+  
+  </script>
+  
\ No newline at end of file
diff --git a/easegen-front/src/views/digitalcourse/digitalhumans/index.vue b/easegen-front/src/views/digitalcourse/digitalhumans/index.vue
index 3b6167f..e0ecd01 100644
--- a/easegen-front/src/views/digitalcourse/digitalhumans/index.vue
+++ b/easegen-front/src/views/digitalcourse/digitalhumans/index.vue
@@ -173,7 +173,7 @@
           <el-button
             link
             type="primary"
-            @click="openForm('detail', scope.row.id)"
+            @click="OpenLookformRef('detail', scope.row.id)"
             v-hasPermi="['digitalcourse:digital-humans:delete']"
           >
             {{t('digitalhumans.view')}}
@@ -190,8 +190,10 @@
     />
   </ContentWrap>
 
-  <!-- 琛ㄥ崟寮圭獥锛氭坊鍔�/淇敼 -->
+  <!-- 琛ㄥ崟寮圭獥锛氭坊鍔� -->
   <DigitalHumansForm ref="formRef" @success="getList" />
+  <!-- 琛ㄥ崟寮圭獥锛氫慨鏀� -->
+  <LookDigitalHumansForm ref="LookformRef" @success="getList" />
   <!-- 澶勭悊 -->
   <AuditForm ref="auditFormRef" @success="getList" />
 </template>
@@ -203,6 +205,7 @@
 import download from '@/utils/download'
 import * as DigitalHumansApi from '@/api/digitalcourse/digitalhumans'
 import DigitalHumansForm from './DigitalHumansForm.vue'
+import LookDigitalHumansForm from './LookDigitalHumansForm.vue'
 import AuditForm from './AuditForm.vue'
 import { useUserStoreWithOut } from '@/store/modules/user'
 const userStore = useUserStoreWithOut() // 鐢ㄦ埛淇℃伅缂撳瓨
@@ -260,13 +263,20 @@
   handleQuery()
 }
 
-/** 娣诲姞/淇敼鎿嶄綔 */
+/** 娣诲姞鎿嶄綔 */
 const formRef = ref()
 const auditFormRef = ref()
 const openForm = (type: string, id?: number) => {
   formRef.value.open(type, id)
 }
 
+/* 淇敼鎿嶄綔 */
+const LookformRef = ref()
+const OpenLookformRef = ( type: string, id?:number ) => {
+  LookformRef.value.open( type, id )
+}
+
+
 const openAuditForm = (type: string, id?: number) => {
   auditFormRef.value.open(type, id)
 }
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