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

  1. Compare frameWidth/frameHeight and jpegBytes in the log — zero dimensions or zero bytes indicate an unmounted/blank canvas
  2. If frames drop repeatedly, check GPU/canvas pressure in the webview (the producer composites primary and secondary mascot canvases per tick)
  3. For one-off failures no action is needed — the producer loop retries on its interval
  4. 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.