tinyhumansai/openhuman · error
[meet-video-producer] capture failed
Error message
[meet-video-producer] capture failed
What it means
Capturing a composed mascot video frame failed in the meet video producer loop: converting the mascot canvas to a JPEG blob (canvas.toBlob / the frame capture step) rejected for one tick. The diagnostic log includes canvas dimensions, frame size and blob bytes to distinguish a capture that produced an empty/oversized blob from one that rejected outright; the frame is dropped and the loop continues on the next tick.
Source
Thrown at app/src/features/meet/MascotFrameProducer.tsx:314
canvasWidth: primaryCanvas.width,
canvasHeight: primaryCanvas.height,
frameWidth: frameW,
frameHeight: frameH,
jpegBytes: blob.size,
isSpeaking: isSpeakingRef.current,
// Dual-mascot diagnostics (issue #4277): whether we drew two
// cells this tick, and which slot the audio is on.
dualEnabled: dualEnabledNow,
secondaryMounted: dualEnabledNow ? Boolean(secondaryCanvas) : undefined,
activeMascotSlot: activeMascotSlotRef.current,
probe,
})
);
}
ws.send(buffer);
}
} catch (err) {
console.warn('[meet-video-producer] capture failed', err);
} finally {
inflightRef.current = false;
}
}, [session.requestId]);
useEffect(() => {
stoppedRef.current = false;
const SILENT_WAV =
'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEAQB8AAEAfAAABAAgAAABmYWN0BAAAAAAAAABkYXRhAAAAAA==';
const keepAliveAudio = document.createElement('audio');
keepAliveAudio.muted = true;
keepAliveAudio.loop = true;
keepAliveAudio.autoplay = true;
keepAliveAudio.preload = 'auto';
keepAliveAudio.src = SILENT_WAV;
keepAliveAudio.style.display = 'none';
document.body.appendChild(keepAliveAudio);View on GitHub (pinned to 7491200858)
Solutions
- Compare frameWidth/frameHeight and jpegBytes in the log — zero dimensions or zero bytes indicate an unmounted/blank canvas
- If frames drop repeatedly, check GPU/canvas pressure in the webview (the producer composites primary and secondary mascot canvases per tick)
- For one-off failures no action is needed — the producer loop retries on its interval
- If persistent, restart the meet session to recreate the canvas and WebSocket pipeline
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at app/src/features/meet/MascotFrameProducer.tsx:314 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17).
Data as JSON: /api/errors/a9e5af5fe5fe3f99.
Report an issue: GitHub.