2 lines
14 KiB
JavaScript
2 lines
14 KiB
JavaScript
|
|
"use strict";const e=require("../../common/vendor.js"),i=require("../../config/api.js"),o={data:()=>({API_BASE:i.API_BASE,idleVideoUrl:"",talkingVideoUrl:"",currentVideoUrl:"",isVideoLoading:!0,videoContext:null,hasPlayedInitial:!1,callerName:"对方",voiceId:"",selectedDialect:"",selectedLanguageHint:"",selectedLanguageHintLabel:"",languageHintOptions:["中文(zh)","英文(en)","法语(fr)","德语(de)","日语(ja)","韩语(ko)","俄语(ru)"],dialectOptions:["广东话","东北话","甘肃话","贵州话","河南话","湖北话","江西话","闽南话","宁夏话","山西话","陕西话","山东话","上海话","四川话","天津话","云南话"],callDuration:"00:00",callStartTime:null,durationTimer:null,isIdle:!0,isSpeaking:!1,isRecording:!1,isProcessing:!1,processingText:"处理中...",messages:[],systemPrompt:"你是一位温暖的对话者,用亲切的语气与对方交流。",recorderManager:null,audioFilePath:"",audioContext:null,vadEnabled:!0,vadVoiceThreshold:.004,vadSilenceMs:2500,vadMaxDurationMs:6e4,vadSpeaking:!1,vadSilenceStart:null,vadMaxTimer:null,recordingStartTime:null,vadLastSoundTime:null,vadLastFrameTime:null,vadWatchTimer:null,autoListen:!0,autoLoopTimer:null,scrollTop:0}),onLoad(e){console.log("[VideoCall] 页面参数:",e),this.idleVideoUrl=decodeURIComponent(e.idleVideo||""),this.talkingVideoUrl=decodeURIComponent(e.talkingVideo||this.idleVideoUrl),this.voiceId=e.voiceId||"",this.callerName=decodeURIComponent(e.callerName||"对方"),console.log("[VideoCall] 待机视频URL:",this.idleVideoUrl),console.log("[VideoCall] 说话视频URL:",this.talkingVideoUrl),console.log("[VideoCall] 音色ID:",this.voiceId),this.downloadAndConvertVideo(),this.startCallTimer(),this.initRecorder(),this.initAudioContext(),this.initVideoContext(),this.startAutoLoop()},onUnload(){this.durationTimer&&clearInterval(this.durationTimer),this.vadMaxTimer&&(clearTimeout(this.vadMaxTimer),this.vadMaxTimer=null),this.vadWatchTimer&&(clearInterval(this.vadWatchTimer),this.vadWatchTimer=null),this.autoLoopTimer&&(clearInterval(this.autoLoopTimer),this.autoLoopTimer=null),this.audioContext&&this.audioContext.destroy()},methods:{async downloadAndConvertVideo(){if(!this.idleVideoUrl)return void e.index.showToast({title:"视频URL无效",icon:"none"});console.log("[VideoCall] ========== 视频加载 =========="),console.log("[VideoCall] 原始URL:",this.idleVideoUrl);const o=new URL(i.API_BASE).hostname,t=this.idleVideoUrl.includes("/static/videos/")||this.idleVideoUrl.includes(o);return this.idleVideoUrl.includes("grsai.com")||this.idleVideoUrl.includes("file49")?(console.log("[VideoCall] 检测到外部视频链接,直接使用URL播放"),this.currentVideoUrl=this.idleVideoUrl,this.talkingVideoUrl=this.idleVideoUrl,void console.log("[VideoCall] ========== 视频准备完成 ==========")):t?(console.log("[VideoCall] 检测到本地服务器视频,直接使用URL播放"),this.currentVideoUrl=this.idleVideoUrl,this.talkingVideoUrl=this.idleVideoUrl,void console.log("[VideoCall] ========== 视频准备完成 ==========")):(console.log("[VideoCall] 本地服务器视频,开始下载..."),e.index.showLoading({title:"视频加载中...",mask:!0}),void e.index.downloadFile({url:this.idleVideoUrl,success:i=>{console.log("[VideoCall] 下载响应状态码:",i.statusCode),200===i.statusCode?(console.log("[VideoCall] ✅ 视频下载成功"),console.log("[VideoCall] 临时路径:",i.tempFilePath),console.log("[VideoCall] 非APP环境,使用临时路径"),this.currentVideoUrl=i.tempFilePath,this.idleVideoUrl=i.tempFilePath,this.talkingVideoUrl=i.tempFilePath,e.index.hideLoading()):(console.error("[VideoCall] ❌ 视频下载失败,状态码:",i.statusCode),this.handleDownloadError())},fail:e=>{console.error("[VideoCall] ❌ 视频下载失败:",e),console.error("[VideoCall] 错误详情:",JSON.stringify(e)),this.handleDownloadError()}}))},handleDownloadError(){e.index.hideLoading(),console.log("[VideoCall] 下载失败,直接使用原URL播放"),this.currentVideoUrl=this.idleVideoUrl,e.index.showToast({title:"将直接播放网
|