From e1690656537264853f9705d6e1b3808931a25f4a Mon Sep 17 00:00:00 2001 From: sion123 <450702724@qq.com> Date: Thu, 9 Apr 2026 01:29:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(kling):=20=E4=BC=98=E5=8C=96=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E4=BA=BA=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE=E5=92=8C?= =?UTF-8?q?=E8=AF=86=E5=88=AB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 前端:新增签名URL存储,将视频下载为blob URL确保浏览器兼容播放 - 后端:移除视频/音频播放URL的Content-Type参数,简化签名URL生成逻辑 - 修复:使用签名URL调用人脸识别API,避免blob URL无法被外部API访问的问题 --- .../scripts/__pycache__/core.cpython-312.pyc | Bin 10994 -> 0 bytes .../kling/stores/useDigitalHumanStore.ts | 22 +++++++++++++++--- .../file/service/TikUserFileServiceImpl.java | 7 ++---- 3 files changed, 21 insertions(+), 8 deletions(-) delete mode 100644 .claude/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc diff --git a/.claude/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc b/.claude/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc deleted file mode 100644 index 39222d1a1a3c3ecb12d460aeca65fae0ec40a040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10994 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 { /** 视频预览URL */ const videoPreviewUrl = ref('') + /** 素材库视频的签名URL(用于识别API,不用于播放) */ + let signedVideoUrl = '' + /** 错误信息 */ const error = ref('') @@ -278,7 +281,19 @@ export const useDigitalHumanStore = defineStore('digitalHuman', () => { if (urlRes.code !== 0 || !urlRes.data) { throw new Error(urlRes.msg || '获取播放链接失败') } - videoPreviewUrl.value = urlRes.data + // 保存签名URL用于识别API + signedVideoUrl = urlRes.data + + // 下载视频到本地生成blob URL,确保浏览器能正常播放 + videoStep.value = 'uploading' + const response = await fetch(urlRes.data) + if (!response.ok) throw new Error('视频下载失败') + const blob = await response.blob() + // 释放旧的blob URL + if (videoPreviewUrl.value?.startsWith('blob:')) { + URL.revokeObjectURL(videoPreviewUrl.value) + } + videoPreviewUrl.value = URL.createObjectURL(blob) } catch (err: any) { videoStep.value = 'error' error.value = err.message || '获取播放链接失败' @@ -350,8 +365,8 @@ export const useDigitalHumanStore = defineStore('digitalHuman', () => { /** 识别已存在的视频 */ async function recognizeExistingVideo(video: Video): Promise { - // 使用已获取的带签名预览URL - return performFaceRecognition(video.id, videoPreviewUrl.value, false) + // 使用签名URL调用识别API(blob URL不可被外部API访问) + return performFaceRecognition(video.id, signedVideoUrl, false) } /** 执行人脸识别 */ @@ -564,6 +579,7 @@ export const useDigitalHumanStore = defineStore('digitalHuman', () => { videoFile.value = null selectedVideo.value = null videoPreviewUrl.value = '' + signedVideoUrl = '' videoSelectorVisible.value = false resetProcess() diff --git a/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/file/service/TikUserFileServiceImpl.java b/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/file/service/TikUserFileServiceImpl.java index 52c88f2251..f697fbb712 100644 --- a/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/file/service/TikUserFileServiceImpl.java +++ b/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/file/service/TikUserFileServiceImpl.java @@ -339,9 +339,7 @@ public class TikUserFileServiceImpl implements TikUserFileService { } // 视频播放URL不缓存,每次都生成新的签名URL(使用 filePath 而非 fileUrl,避免域名匹配问题) - // 根据文件扩展名推断 Content-Type,确保浏览器