LaiTool 3.1.3
This commit is contained in:
@@ -102,6 +102,9 @@
|
||||
>
|
||||
设置
|
||||
</n-button>
|
||||
<div style="margin-left: 10px">
|
||||
<MonitorStatus />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="right-button">
|
||||
@@ -134,6 +137,7 @@ import { TranslateType } from '../../../../../define/enum/translate'
|
||||
import { ContainsChineseOrPunctuation } from '../../../../../define/Tools/common'
|
||||
import ImportWordAndSrt from '../../Original/Components/ImportWordAndSrt.vue'
|
||||
import GetWaterMaskRectangle from '../../Watermark/GetWaterMaskRectangle.vue'
|
||||
import MonitorStatus from './MonitorStatus.vue'
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
@@ -141,7 +145,8 @@ export default defineComponent({
|
||||
NCheckbox,
|
||||
NDropdown,
|
||||
NDivider,
|
||||
GetWaterMaskRectangle
|
||||
GetWaterMaskRectangle,
|
||||
MonitorStatus
|
||||
},
|
||||
|
||||
setup() {
|
||||
|
||||
@@ -0,0 +1,195 @@
|
||||
<template>
|
||||
<div style="display: flex; align-items: center; font-size: 12px; font-weight: bold">
|
||||
<div style="border: 1px dashed #ccc; padding: 5px">
|
||||
<div style="display: flex; align-items: center">
|
||||
<div style="width: 75px">提示词:</div>
|
||||
<n-progress
|
||||
type="line"
|
||||
style="width: 100px; cursor: pointer"
|
||||
status="info"
|
||||
:percentage="gptPromptPercentage"
|
||||
@click="ErrorPosition('gptPrompt')"
|
||||
rail-color="#bbb"
|
||||
indicator-placement="inside"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
style="display: flex; align-items: center"
|
||||
v-if="
|
||||
reverseManageStore.selectBook.type == 'mj_reverse' ||
|
||||
reverseManageStore.selectBook.type == 'sd_reverse'
|
||||
"
|
||||
>
|
||||
<div style="width: 75px">反推提示词:</div>
|
||||
<n-progress
|
||||
type="line"
|
||||
:class="test"
|
||||
style="width: 100px; cursor: pointer"
|
||||
status="info"
|
||||
:percentage="reversePromptPercentage"
|
||||
@click="ErrorPosition('reverseGptPrompt')"
|
||||
rail-color="#bbb"
|
||||
indicator-placement="inside"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="border: 1px dashed #ccc; padding: 5px; margin-left: 5px">
|
||||
<div style="display: flex; align-items: center">
|
||||
<div>提示词命令:</div>
|
||||
<n-progress
|
||||
type="line"
|
||||
style="width: 100px; cursor: pointer"
|
||||
status="info"
|
||||
:percentage="promptPercentage"
|
||||
rail-color="#bbb"
|
||||
@click="ErrorPosition('prompt')"
|
||||
indicator-placement="inside"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="border: 1px dashed #ccc; padding: 5px; margin-left: 5px">
|
||||
<div style="display: flex; align-items: center">
|
||||
<div>出图:</div>
|
||||
<n-progress
|
||||
type="line"
|
||||
style="width: 100px; cursor: pointer"
|
||||
status="info"
|
||||
:percentage="imagePercentage"
|
||||
@click="ErrorPosition('image')"
|
||||
rail-color="#bbb"
|
||||
indicator-placement="inside"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { NProgress, useMessage } from 'naive-ui'
|
||||
import { useReverseManageStore } from '../../../../../stores/reverseManage'
|
||||
import { useSoftwareStore } from '../../../../../stores/software'
|
||||
import { isEmpty } from 'lodash'
|
||||
|
||||
let gptPromptPercentage = ref(0)
|
||||
let promptPercentage = ref(0)
|
||||
let imagePercentage = ref(0)
|
||||
let reversePromptPercentage = ref(0)
|
||||
|
||||
let reverseManageStore = useReverseManageStore()
|
||||
let softwareStore = useSoftwareStore()
|
||||
let message = useMessage()
|
||||
|
||||
let test = ref('error-class')
|
||||
|
||||
// 计算所有的数据的百分比
|
||||
function ComputePercentage() {
|
||||
debugger
|
||||
if (
|
||||
reverseManageStore &&
|
||||
reverseManageStore.selectBookTaskDetail &&
|
||||
reverseManageStore.selectBookTaskDetail.length > 0
|
||||
) {
|
||||
let total = reverseManageStore.selectBookTaskDetail.length
|
||||
let gptPromptCount = 0
|
||||
let promptCount = 0
|
||||
let imageCount = 0
|
||||
let reversePromptCount = 0
|
||||
reverseManageStore.selectBookTaskDetail.forEach((item) => {
|
||||
if (!isEmpty(item.gptPrompt)) {
|
||||
gptPromptCount++
|
||||
}
|
||||
if (!isEmpty(item.prompt)) {
|
||||
promptCount++
|
||||
}
|
||||
|
||||
// 计算图片的百分比。这个条件比较复杂
|
||||
if (item.outImagePath) {
|
||||
imageCount++
|
||||
}
|
||||
|
||||
if (item.reversePrompt && item.reversePrompt.length > 0) {
|
||||
reversePromptCount++
|
||||
}
|
||||
})
|
||||
|
||||
// 计算推理提示词的百分比
|
||||
gptPromptPercentage.value = Math.floor((gptPromptCount / total) * 100)
|
||||
|
||||
// 计算合并提示词的百分比
|
||||
promptPercentage.value = Math.floor((promptCount / total) * 100)
|
||||
|
||||
imagePercentage.value = Math.floor((imageCount / total) * 100)
|
||||
|
||||
reversePromptPercentage.value = Math.floor((reversePromptCount / total) * 100)
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
// 这边开始计算
|
||||
ComputePercentage()
|
||||
|
||||
// 这边开始定时执行计算
|
||||
setInterval(() => {
|
||||
ComputePercentage()
|
||||
}, 5000)
|
||||
})
|
||||
|
||||
function ErrorPosition(type) {
|
||||
let index = -1
|
||||
softwareStore.skipRowIndex = 0
|
||||
if (type == 'gptPrompt') {
|
||||
// 找到第一个空的提示词数据
|
||||
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
|
||||
if (isEmpty(reverseManageStore.selectBookTaskDetail[i].gptPrompt)) {
|
||||
index = i
|
||||
break
|
||||
}
|
||||
}
|
||||
} else if (type == 'reverseGptPrompt') {
|
||||
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
|
||||
let element = reverseManageStore.selectBookTaskDetail[i]
|
||||
if (!element.reversePrompt || element.reversePrompt.length <= 0) {
|
||||
index = i
|
||||
break
|
||||
}
|
||||
}
|
||||
} else if (type == 'prompt') {
|
||||
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
|
||||
if (isEmpty(reverseManageStore.selectBookTaskDetail[i].prompt)) {
|
||||
index = i
|
||||
break
|
||||
}
|
||||
}
|
||||
} else if (type == 'image') {
|
||||
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
|
||||
if (isEmpty(reverseManageStore.selectBookTaskDetail[i].outImagePath)) {
|
||||
index = i
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
message.error('未知的操作类型')
|
||||
return
|
||||
}
|
||||
|
||||
if (index == -1) {
|
||||
message.success('全部已完成,不必跳转')
|
||||
return
|
||||
}
|
||||
|
||||
softwareStore.skip = {
|
||||
skipRowIndex: index + 1,
|
||||
clickCount: softwareStore.skip.clickCount++
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.error-class {
|
||||
color: red;
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
||||
@@ -1,6 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<n-data-table
|
||||
ref="datatable"
|
||||
:columns="columns"
|
||||
:data="reverseManageStore.selectBookTaskDetail"
|
||||
:max-height="maxHeight"
|
||||
@@ -10,8 +11,8 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ref, onMounted, defineComponent, onUnmounted, toRaw, h } from 'vue'
|
||||
import { useMessage, NDataTable, NImage, NInput } from 'naive-ui'
|
||||
import { ref, onMounted, defineComponent, watch, h } from 'vue'
|
||||
import { useMessage, NDataTable, NImage } from 'naive-ui'
|
||||
import { useSoftwareStore } from '../../../../../stores/software'
|
||||
import { useReverseManageStore } from '../../../../../stores/reverseManage'
|
||||
import DataTableShowGenerateImage from '../../Original/Components/DataTableShowGenerateImage.vue'
|
||||
@@ -33,6 +34,17 @@ export default defineComponent({
|
||||
let reverseManageStore = useReverseManageStore()
|
||||
let message = useMessage()
|
||||
let maxHeight = ref(0)
|
||||
let datatable = ref(null)
|
||||
|
||||
watch(
|
||||
() => softwareStore.skip,
|
||||
(newValue) => {
|
||||
let doc = document.querySelectorAll('.n-data-table-tr')
|
||||
let sk = doc[newValue.skipRowIndex]
|
||||
datatable.value.scrollTo({ el: sk })
|
||||
},
|
||||
{ deep: true }
|
||||
)
|
||||
|
||||
const createColumns = () => [
|
||||
{
|
||||
@@ -152,7 +164,8 @@ export default defineComponent({
|
||||
softwareStore,
|
||||
reverseManageStore,
|
||||
maxHeight,
|
||||
columns: createColumns()
|
||||
columns: createColumns(),
|
||||
datatable
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1,62 +1,67 @@
|
||||
<template>
|
||||
<div style="display: flex">
|
||||
<n-button strong secondary @click="ReturnMain" size="small">返回</n-button>
|
||||
<n-divider vertical style="height: 30px" />
|
||||
<!-- <n-button strong secondary @click="ReturnMain" size="small">一键全自动</n-button>
|
||||
<div style="display: flex; align-items: center">
|
||||
<div style="display: flex">
|
||||
<n-button strong secondary @click="ReturnMain" size="small">返回</n-button>
|
||||
<n-divider vertical style="height: 30px" />
|
||||
<!-- <n-button strong secondary @click="ReturnMain" size="small">一键全自动</n-button>
|
||||
<n-divider vertical style="height: 30px" /> -->
|
||||
<n-button :color="softwareStore.SoftColor.ORANGE" @click="ImportWord" size="small"
|
||||
>导入字幕/SRT</n-button
|
||||
>
|
||||
<n-button
|
||||
:color="softwareStore.SoftColor.ORANGE"
|
||||
style="margin-left: 10px"
|
||||
@click="CharacterLibrary"
|
||||
size="small"
|
||||
>角色分析(标签集)</n-button
|
||||
>
|
||||
<n-button
|
||||
:color="softwareStore.SoftColor.ORANGE"
|
||||
style="margin-left: 10px"
|
||||
@click="ImportPrompt"
|
||||
size="small"
|
||||
>导入提示词</n-button
|
||||
>
|
||||
<n-dropdown trigger="hover" :options="GptButtonOptions" @select="ButtonSelect">
|
||||
<n-button :color="softwareStore.SoftColor.ORANGE" @click="ImportWord" size="small"
|
||||
>导入字幕/SRT</n-button
|
||||
>
|
||||
<n-button
|
||||
:color="softwareStore.SoftColor.ORANGE"
|
||||
style="margin-left: 10px"
|
||||
@click="GetPromptAll"
|
||||
@click="CharacterLibrary"
|
||||
size="small"
|
||||
>一键推理提示词</n-button
|
||||
>角色分析(标签集)</n-button
|
||||
>
|
||||
</n-dropdown>
|
||||
<n-dropdown trigger="hover" :options="GenerateImageOptions" @select="ButtonSelect">
|
||||
<n-button
|
||||
:color="softwareStore.SoftColor.ORANGE"
|
||||
style="margin-left: 10px"
|
||||
@click="GenerateImageAll(true)"
|
||||
@click="ImportPrompt"
|
||||
size="small"
|
||||
>生成所有的图片</n-button
|
||||
>导入提示词</n-button
|
||||
>
|
||||
</n-dropdown>
|
||||
<n-dropdown trigger="hover" :options="GptButtonOptions" @select="ButtonSelect">
|
||||
<n-button
|
||||
:color="softwareStore.SoftColor.ORANGE"
|
||||
style="margin-left: 10px"
|
||||
@click="GetPromptAll"
|
||||
size="small"
|
||||
>一键推理提示词</n-button
|
||||
>
|
||||
</n-dropdown>
|
||||
<n-dropdown trigger="hover" :options="GenerateImageOptions" @select="ButtonSelect">
|
||||
<n-button
|
||||
:color="softwareStore.SoftColor.ORANGE"
|
||||
style="margin-left: 10px"
|
||||
@click="GenerateImageAll(true)"
|
||||
size="small"
|
||||
>生成所有的图片</n-button
|
||||
>
|
||||
</n-dropdown>
|
||||
|
||||
<n-dropdown trigger="hover" :options="ResetDataOptions" @select="ButtonSelect">
|
||||
<n-button
|
||||
:color="softwareStore.SoftColor.ORANGE"
|
||||
style="margin-left: 10px"
|
||||
@click="resetALLData"
|
||||
size="small"
|
||||
>重置数据</n-button
|
||||
>
|
||||
</n-dropdown>
|
||||
|
||||
<n-dropdown trigger="hover" :options="ResetDataOptions" @select="ButtonSelect">
|
||||
<n-button
|
||||
:color="softwareStore.SoftColor.ORANGE"
|
||||
style="margin-left: 10px"
|
||||
@click="resetALLData"
|
||||
@click="OpenPromptSetting"
|
||||
size="small"
|
||||
>重置数据</n-button
|
||||
>设置</n-button
|
||||
>
|
||||
</n-dropdown>
|
||||
|
||||
<n-button
|
||||
:color="softwareStore.SoftColor.ORANGE"
|
||||
style="margin-left: 10px"
|
||||
@click="OpenPromptSetting"
|
||||
size="small"
|
||||
>设置</n-button
|
||||
>
|
||||
</div>
|
||||
<div style="margin-left: 10px">
|
||||
<MonitorStatus />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -68,6 +73,7 @@ import { useReverseManageStore } from '../../../../../stores/reverseManage'
|
||||
import ImportWordAndSrt from '../Components/ImportWord/ImportWordAndSrt.vue'
|
||||
import CharacterAnalyze from '../Components/PresetLibrary/CharacterAnalyze.vue'
|
||||
import PromptSetting from '../../Original/Components/PromptSetting.vue'
|
||||
import MonitorStatus from '../Components/MonitorStatus.vue'
|
||||
import {
|
||||
BookBackTaskType,
|
||||
BookImageCategory,
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
<template>
|
||||
<div>
|
||||
<n-data-table
|
||||
ref="datatable"
|
||||
id="1111"
|
||||
classMame="cd-22223"
|
||||
:max-height="maxHeight"
|
||||
:loading="softwareStore.loading.originDatatableDataLoading"
|
||||
:row-key="rowKey"
|
||||
@@ -16,31 +18,8 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {
|
||||
ref,
|
||||
h,
|
||||
onMounted,
|
||||
defineComponent,
|
||||
onUnmounted,
|
||||
watch,
|
||||
toRaw,
|
||||
render,
|
||||
onBeforeUnmount,
|
||||
provide,
|
||||
nextTick
|
||||
} from 'vue'
|
||||
import {
|
||||
NDataTable,
|
||||
NImage,
|
||||
useMessage,
|
||||
NInput,
|
||||
NButton,
|
||||
NSwitch,
|
||||
NPopover,
|
||||
useDialog,
|
||||
NCheckbox,
|
||||
NIcon
|
||||
} from 'naive-ui'
|
||||
import { ref, h, onMounted, watch } from 'vue'
|
||||
import { NDataTable, useMessage } from 'naive-ui'
|
||||
import DatatableHeaderAfterGpt from '../Components/DatatableHeaderAfterGpt.vue'
|
||||
import DatatableAfterGpt from '../Components/DatatableAfterGpt.vue'
|
||||
import ODatatableHeaderCharacterAndScene from './ODataTableHeaderCharacterAndScene.vue'
|
||||
@@ -54,11 +33,21 @@ import DatatableHeaderGenerateImage from '../Components/DatatableHeaderGenerateI
|
||||
import DatatableGenerateImage from '../Components/DatatableGenerateImage.vue'
|
||||
import { useReverseManageStore } from '../../../../../stores/reverseManage'
|
||||
import { useSoftwareStore } from '../../../../../stores/software'
|
||||
import { set } from 'lodash'
|
||||
let reverseManageStore = useReverseManageStore()
|
||||
let softwareStore = useSoftwareStore()
|
||||
let maxHeight = ref(0)
|
||||
let message = useMessage()
|
||||
let datatable = ref(null)
|
||||
|
||||
watch(
|
||||
() => softwareStore.skip,
|
||||
(newValue) => {
|
||||
let doc = document.querySelectorAll('.n-data-table-tr')
|
||||
let sk = doc[newValue.skipRowIndex]
|
||||
datatable.value.scrollTo({ el: sk })
|
||||
},
|
||||
{ deep: true }
|
||||
)
|
||||
|
||||
onMounted(async () => {
|
||||
setTimeout(() => {
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
</n-form-item>
|
||||
<n-form-item label="选择预设" path="gptData">
|
||||
<n-select
|
||||
style="width: 160px"
|
||||
style="width: 200px"
|
||||
v-model:value="formValue.gptData"
|
||||
:options="gptDataOptions"
|
||||
placeholder="请选择提示词数据"
|
||||
@@ -37,6 +37,25 @@
|
||||
<n-button type="primary" @click="ActionStart">开始生成</n-button>
|
||||
</n-form-item>
|
||||
</n-form>
|
||||
<n-form :model="formValue" inline label-placement="left">
|
||||
<n-form-item path="isStream">
|
||||
<n-checkbox label="是否流式发送" v-model:checked="formValue.isStream" />
|
||||
</n-form-item>
|
||||
<n-form-item path="isSplit">
|
||||
<n-checkbox label="是否拆分发送" v-model:checked="formValue.isSplit" />
|
||||
</n-form-item>
|
||||
<n-form-item label="每次发送字符" path="splitNumber">
|
||||
<n-input-number
|
||||
v-model:value="formValue.splitNumber"
|
||||
:min="1"
|
||||
:show-button="false"
|
||||
:max="99999"
|
||||
></n-input-number>
|
||||
</n-form-item>
|
||||
<n-form-item path="splitNumber">
|
||||
<div style="color: red">注意:爆款开头不要分段发送</div>
|
||||
</n-form-item>
|
||||
</n-form>
|
||||
</div>
|
||||
<div style="display: flex; width: 100%">
|
||||
<div style="flex: 1; margin-right: 10px">
|
||||
@@ -61,21 +80,46 @@
|
||||
|
||||
<script>
|
||||
import { ref, onMounted, defineComponent, onUnmounted, toRaw, watch, h } from 'vue'
|
||||
import { useMessage, useDialog, NForm, NFormItem, NInput, NSelect, NButton, NIcon } from 'naive-ui'
|
||||
import {
|
||||
useMessage,
|
||||
useDialog,
|
||||
NForm,
|
||||
NFormItem,
|
||||
NInput,
|
||||
NSelect,
|
||||
NButton,
|
||||
NIcon,
|
||||
NCheckbox,
|
||||
NInputNumber
|
||||
} from 'naive-ui'
|
||||
import { SettingsOutline } from '@vicons/ionicons5'
|
||||
import ManageAISetting from './ManageAISetting.vue'
|
||||
import { useSoftwareStore } from '../../../../stores/software'
|
||||
import { isEmpty } from 'lodash'
|
||||
import { DEFINE_STRING } from '../../../../define/define_string'
|
||||
|
||||
export default defineComponent({
|
||||
components: { NForm, NFormItem, NInput, NSelect, NButton, NIcon, SettingsOutline },
|
||||
components: {
|
||||
NForm,
|
||||
NFormItem,
|
||||
NInput,
|
||||
NSelect,
|
||||
NButton,
|
||||
NIcon,
|
||||
SettingsOutline,
|
||||
NCheckbox,
|
||||
NInputNumber
|
||||
},
|
||||
setup() {
|
||||
let message = useMessage()
|
||||
let dialog = useDialog()
|
||||
let formValue = ref({
|
||||
gptType: undefined,
|
||||
gptData: undefined,
|
||||
gptAI: undefined
|
||||
gptAI: undefined,
|
||||
isStream: true,
|
||||
isSplit: false,
|
||||
splitNumber: 1000
|
||||
})
|
||||
let oldWord = ref(undefined)
|
||||
let newWord = ref(undefined)
|
||||
@@ -110,8 +154,41 @@ export default defineComponent({
|
||||
allPromptDataOptions.value = gptRes.data.promptData
|
||||
}
|
||||
|
||||
function debounce(func, wait) {
|
||||
let timeoutId
|
||||
let shouldExecute = true
|
||||
|
||||
return function (...args) {
|
||||
const context = this
|
||||
if (shouldExecute) {
|
||||
func.apply(context, args)
|
||||
shouldExecute = false
|
||||
timeoutId = setTimeout(() => {
|
||||
shouldExecute = true
|
||||
}, wait)
|
||||
} else {
|
||||
clearTimeout(timeoutId)
|
||||
timeoutId = setTimeout(() => {
|
||||
shouldExecute = true
|
||||
}, wait)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let UpdateWord = debounce((value) => {
|
||||
newWord.value = value
|
||||
}, 500)
|
||||
|
||||
onMounted(async () => {
|
||||
await InitServerGptOptions()
|
||||
// 这边监听流式返回数据
|
||||
window.api.setEventListen([DEFINE_STRING.GPT.GPT_STREAM_RETURN], (value) => {
|
||||
UpdateWord(value)
|
||||
})
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
window.api.removeEventListen(DEFINE_STRING.GPT.GPT_STREAM_RETURN)
|
||||
})
|
||||
|
||||
let ruleObj = (errorMessage) => {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<div id="video-canvas">
|
||||
<video ref="videoRef" muted :src="videoSrc" id="video" autoplay></video>
|
||||
<video style="width: 800px" ref="videoRef" muted :src="videoSrc" id="video" autoplay></video>
|
||||
<canvas
|
||||
ref="canvasRef"
|
||||
@mousemove="handleMouseMove"
|
||||
@@ -91,10 +91,7 @@ export default defineComponent({
|
||||
let reverseManageStore = useReverseManageStore()
|
||||
let videoRef = ref(null)
|
||||
let canvasRef = ref(null)
|
||||
let videoSrc = ref(
|
||||
props.videoSrc ||
|
||||
'D:\\文\\物价暴跌百万倍,我成了神豪-七猫\\1\\价暴跌百万倍,我成了神豪1_output_crop_00001.mp4'
|
||||
)
|
||||
let videoSrc = ref(props.videoSrc)
|
||||
let type = ref(props.type ? props.type : SubtitleSavePositionType.MAIN_VIDEO)
|
||||
let mark = ref(props.mark)
|
||||
let videoWidth = ref(props.videoWidth == null ? 800 : props.videoWidth)
|
||||
@@ -120,7 +117,6 @@ export default defineComponent({
|
||||
setTimeout(() => {
|
||||
video.play()
|
||||
isPlaying.value = true
|
||||
debugger
|
||||
let { width, height } = video.getBoundingClientRect()
|
||||
canvasRef.value.width = width
|
||||
canvasRef.value.height = height
|
||||
|
||||
Reference in New Issue
Block a user