离屏canvas

This commit is contained in:
feie9456 2025-09-23 12:59:26 +08:00
parent 0619bafbf9
commit 2bbca1c5e3

View File

@ -10,8 +10,8 @@ const videoEl = ref<HTMLVideoElement | null>(null)
const canvasEl = ref<HTMLCanvasElement | null>(null) const canvasEl = ref<HTMLCanvasElement | null>(null)
let ctx: CanvasRenderingContext2D | null = null let ctx: CanvasRenderingContext2D | null = null
// fetch // fetch
let procCanvasEl: HTMLCanvasElement | null = null let procCanvasEl: OffscreenCanvas | null = null
let procCtx: CanvasRenderingContext2D | null = null let procCtx: OffscreenCanvasRenderingContext2D | null = null
// SVG overlay // SVG overlay
const viewW = ref(0) const viewW = ref(0)
const viewH = ref(0) const viewH = ref(0)
@ -235,10 +235,8 @@ function resizeCanvasToVideo(video: HTMLVideoElement, canvas: HTMLCanvasElement)
canvas.style.width = '100%' canvas.style.width = '100%'
canvas.style.height = 'auto' canvas.style.height = 'auto'
// //
if (!procCanvasEl) procCanvasEl = document.createElement('canvas') if (!procCanvasEl) procCanvasEl = new OffscreenCanvas(canvas.width, canvas.height)
procCanvasEl.width = canvas.width if (!procCtx) procCtx = procCanvasEl.getContext('2d', {willReadFrequently: true})
procCanvasEl.height = canvas.height
if (!procCtx) procCtx = procCanvasEl.getContext('2d')
// SVG // SVG
viewW.value = canvas.width viewW.value = canvas.width
viewH.value = canvas.height viewH.value = canvas.height
@ -306,10 +304,8 @@ async function startStream() {
if (!ctx) throw new Error('CanvasRenderingContext2D 获取失败') if (!ctx) throw new Error('CanvasRenderingContext2D 获取失败')
resizeCanvasToVideo(videoEl.value, canvasEl.value) resizeCanvasToVideo(videoEl.value, canvasEl.value)
// //
if (!procCanvasEl) procCanvasEl = document.createElement('canvas') if (!procCanvasEl) procCanvasEl = new OffscreenCanvas(canvasEl.value.width, canvasEl.value.height)
procCanvasEl.width = canvasEl.value.width procCtx = procCanvasEl.getContext('2d', {willReadFrequently: true})
procCanvasEl.height = canvasEl.value.height
procCtx = procCanvasEl.getContext('2d')
if (!procCtx) throw new Error('离屏 CanvasRenderingContext2D 获取失败') if (!procCtx) throw new Error('离屏 CanvasRenderingContext2D 获取失败')
// //
@ -392,10 +388,8 @@ async function startFilePlayback() {
if (!ctx) throw new Error('CanvasRenderingContext2D 获取失败') if (!ctx) throw new Error('CanvasRenderingContext2D 获取失败')
resizeCanvasToVideo(videoEl.value, canvasEl.value) resizeCanvasToVideo(videoEl.value, canvasEl.value)
// //
if (!procCanvasEl) procCanvasEl = document.createElement('canvas') if (!procCanvasEl) procCanvasEl = new OffscreenCanvas(canvasEl.value.width, canvasEl.value.height)
procCanvasEl.width = canvasEl.value.width procCtx = procCanvasEl.getContext('2d', {willReadFrequently: true})
procCanvasEl.height = canvasEl.value.height
procCtx = procCanvasEl.getContext('2d')
if (!procCtx) throw new Error('离屏 CanvasRenderingContext2D 获取失败') if (!procCtx) throw new Error('离屏 CanvasRenderingContext2D 获取失败')
// //
@ -701,7 +695,7 @@ async function loop() {
} }
// fetch // fetch
if (shouldStartFetch) { /* if (shouldStartFetch) {
isFetching.value = true isFetching.value = true
const payload = framesBuffer.slice() // const payload = framesBuffer.slice() //
fetch('/api/predict', { fetch('/api/predict', {
@ -720,10 +714,10 @@ async function loop() {
predictionHorizon = 0 predictionHorizon = 0
} }
}) })
.catch(() => { /* 忽略错误,不影响主循环 */ }) .catch(() => { })
.finally(() => { isFetching.value = false }) .finally(() => { isFetching.value = false })
} }
} catch (e: any) { */ } catch (e: any) {
// HUD // HUD
err.value = e?.message ?? String(e) err.value = e?.message ?? String(e)
} }