UNPKG

woolball-client

Version:

Client-side library for Woolball enabling secure browser resource sharing for distributed AI task processing

72 lines (71 loc) 2.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.videoCompression = void 0; let videoEncoder = null; let videoDecoder = null; async function videoCompression(data) { const { input, codec = 'vp09.00.10.08', bitrate = 2000000, width, height, framerate, keyFrameInterval = 150, ...options } = data; try { if (!('VideoEncoder' in globalThis) || !('VideoDecoder' in globalThis)) { throw new Error('WebCodecs API não está disponível neste navegador.'); } const inputData = typeof input === 'string' ? JSON.parse(input) : input; const encoderConfig = { codec, width: width || inputData.width, height: height || inputData.height, bitrate, framerate: framerate || 30, latencyMode: 'realtime', alpha: 'discard', }; const encodedChunks = []; if (!videoEncoder) { videoEncoder = new VideoEncoder({ output: (chunk, metadata) => { encodedChunks.push(chunk); }, error: (error) => { throw new Error(`Erro no encoder: ${error.message}`); } }); } videoEncoder.configure(encoderConfig); if (inputData.frames) { let frameCounter = 0; for (const frame of inputData.frames) { const videoFrame = new VideoFrame(frame.data, { timestamp: frame.timestamp, duration: frame.duration, }); const keyFrame = frameCounter % keyFrameInterval === 0; videoEncoder.encode(videoFrame, { keyFrame }); videoFrame.close(); frameCounter++; } } else if (inputData.encodedChunks) { } await videoEncoder.flush(); const chunks = encodedChunks.map(chunk => { const buffer = new ArrayBuffer(chunk.byteLength); chunk.copyTo(buffer); return buffer; }); const blob = new Blob(chunks, { type: `video/webm; codecs=${codec}` }); const reader = new FileReader(); const base64Promise = new Promise((resolve, reject) => { reader.onload = () => resolve(reader.result); reader.onerror = reject; }); reader.readAsDataURL(blob); const base64 = await base64Promise; return { video: base64 }; } catch (error) { throw error; } } exports.videoCompression = videoCompression;