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