视频抽帧
export async function captureFrame({ file, time = 0, isUseInterval = true }) {const map = new Map()try {if (!file) {throw new Error('file is required')}if (!file.file) {throw new Error('file.file is required')}if (!file.file.type.includes('video')) {throw new Error('file.file.type must be video')}const video = document.createElement('video')video.muted = truevideo.autoplay = truevideo.src = URL.createObjectURL(file.file)await new Promise((resolve) => video.oncanplay = resolve)const canvas = document.createElement('canvas')canvas.width = video.videoWidthcanvas.height = video.videoHeightfunction _clearCanvas() {canvas.getContext('2d')?.clearRect(0, 0, canvas.width, canvas.height);}function _drawImage() {canvas.getContext('2d')?.drawImage(video, 0, 0, canvas.width, canvas.height)}function _destroyVideoAndCanvas() {video.remove()canvas.remove()}function getBlob() {return new Promise((resolve) => {canvas.toBlob((blob) => resolve(blob));})}if (!isUseInterval) {video.currentTime = timeawait new Promise((resolve) => {video.onseeked = resolve;});_drawImage();const blob = await getBlob();map.set(blob, {url: URL.createObjectURL(blob),})_clearCanvas();} else {for (let i = 0; i < video.duration; i += time) {video.currentTime = iawait new Promise((resolve) => {video.onseeked = resolve;});_drawImage();const blob = await getBlob();map.set(blob, {url: URL.createObjectURL(blob),time: i});_clearCanvas();}}_destroyVideoAndCanvas();} catch (error) {console.error('Error capturing frame:', error)}return map
}