alyssaxuu/screenity · error

❌ No supported MIME types found

Error message

❌ No supported MIME types found

What it means

createMediaRecorder calls selectRecorderMime(stream) and throws when no MIME type offered by MediaRecorder.isTypeSupported matches the available tracks (audio/video combination). Without a supported container/codec string, MediaRecorder cannot be constructed reliably.

Source

Thrown at src/pages/Recorder/mediaRecorderUtils.js:32

// boxes whose MediaRecorder then throws from start(), which loses the recording.
export function selectRecorderMime(stream = null) {
  return (
    MIME_TYPES.find(
      (type) =>
        MediaRecorder.isTypeSupported(type) &&
        (!type.includes("mp4") || canStartMp4Recorder(stream, type)),
    ) || null
  );
}

export function createMediaRecorder(
  stream,
  { audioBitsPerSecond, videoBitsPerSecond }
) {
  const mimeType = selectRecorderMime(stream);

  if (!mimeType) {
    throw new Error("❌ No supported MIME types found");
  }

  const recorder = new MediaRecorder(stream, {
    mimeType,
    audioBitsPerSecond,
    videoBitsPerSecond,
  });
  // Carry our own container/mime: recorder.mimeType reflects it too, but the
  // browser can normalize the string.
  recorder.__screenityContainer = containerForMime(mimeType);
  recorder.__screenityMime = mimeType;
  return recorder;
}

View on GitHub (pinned to 512606387b)

Solutions

  1. Check MediaRecorder support and show a fallback (e.g. WebCodecs-based recording) before starting
  2. Extend selectRecorderMime's candidate list to include more codecs/containers (mp4, h264, vp9, vp8, opus, aac)
  3. Update the browser to a version with MediaRecorder codec support
  4. Feature-detect window.MediaRecorder and isTypeSupported at app startup and surface a clear UX message

Example fix

// before
const mimeType = selectRecorderMime(stream);
if (!mimeType) throw new Error("❌ No supported MIME types found");
// after
const mimeType = selectRecorderMime(stream)
  ?? (MediaRecorder.isTypeSupported("video/webm") ? "video/webm" : null);
if (!mimeType) return startWebCodecsFallback(stream);
Defensive patterns

Strategy: fallback

Validate before calling

const supported = typeof MediaRecorder !== "undefined" &&
  ["video/webm;codecs=vp9,opus","video/webm;codecs=vp8,opus","video/webm","video/mp4"]
    .some(t => MediaRecorder.isTypeSupported(t));
if (!supported) startWebCodecsFallback();

Type guard

function canRecordMime(stream) {
  return typeof MediaRecorder !== "undefined" &&
    ["video/webm;codecs=vp9,opus","video/webm;codecs=vp8,opus","video/mp4"]
      .some(t => MediaRecorder.isTypeSupported(t));
}

Try / catch

try {
  recorder = await createMediaRecorder(stream, opts);
} catch (e) {
  if (String(e.message).includes("No supported MIME types")) {
    recorder = new WebCodecsRecorder(stream, opts); // fallback engine
  }
}

Prevention

When it happens

Trigger: The browser's MediaRecorder.isTypeSupported returns false for every candidate MIME for the given stream — e.g. a browser without MediaRecorder codec support, or a stream whose track kinds do not match any probed combination.

Common situations: Unsupported or uncommon browser (no webm/mp4 H.264 recording support), Safari/older Edge with limited codec sets, headless or embedded webviews lacking MediaRecorder codecs, hardware where H.264 encoding is disabled.

Related errors


AI-assisted analysis of alyssaxuu/screenity@512606387b (2026-09-02). Data as JSON: /api/errors/410c31f42671e93e. Report an issue: GitHub.