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
JavaScript
;
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;