remotion-dev/remotion · error · Error

Live streams are not currently supported by Remotion. Sorry!

Error message

Live streams are not currently supported by Remotion. Sorry! Source: ${src}

What it means

Thrown inside useWindowedAudioData() when mediabunny reports the source is a live stream (audioTrack.isLive() === true, line 136-141). Remotion needs deterministic, finite media to schedule frames, so live sources (HLS/DASH live, RTMP relays, radio streams) are rejected up front. The error includes the offending src and is forwarded through cancelRender().

Source

Thrown at packages/media-utils/src/use-windowed-audio-data.ts:137

			});

			const onAbort = () => {
				input.dispose();
			};

			signal.addEventListener('abort', onAbort, {once: true});

			try {
				const durationInSeconds = await input.computeDuration();

				const audioTrack = await input.getPrimaryAudioTrack();

				if (!audioTrack) {
					throw new Error('No audio track found');
				}

				if (await audioTrack.isLive()) {
					throw new Error(
						'Live streams are not currently supported by Remotion. Sorry! Source: ' +
							src,
					);
				}

				if (await audioTrack.isRelativeToUnixEpoch()) {
					throw new Error(
						'Streams with UNIX timestamps are not currently supported by Remotion. Sorry! Source: ' +
							src,
					);
				}

				const canDecode = await audioTrack.canDecode();

				if (!canDecode) {
					throw new Error('Audio track cannot be decoded');
				}

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Use a finite, recorded version of the media (VOD HLS playlist, downloadable MP4/MP3, downloaded file) instead of the live source.
  2. If you must react to live audio in a browser UI (not a Remotion render), do not use useWindowedAudioData; use a plain Web Audio analyser in client React.
  3. For HLS, switch from TYPE=LIVE to TYPE=VOD or TYPE=EVENT playlists, or render a segment list to a static file first.
  4. Download the live stream offline (e.g. streamlink/ffmpeg) to a finite file and point the hook at that file.

Example fix

// before (live radio stream -> rejected)
useWindowedAudioData({src: 'https://radio.example/live.m3u8', ...});

// after (record first, then render from the finite file)
// offline: streamlink --output radio.mp3 https://radio.example/live best
useWindowedAudioData({src: staticFile('radio.mp3'), ...});
Defensive patterns

Strategy: validation

Validate before calling

// Reject obvious live-stream URLs before handing them to the hook
function looksLikeLiveStream(src: string): boolean {
  const s = src.toLowerCase();
  return /(?:^|\/)live[._/-]/.test(s)
    || s.endsWith('.m3u8') && !s.includes('vod')
    || /^rtmp:|^rtsp:|^udp:/.test(s);
}

if (looksLikeLiveStream(src)) {
  throw new Error(`Use a recorded/VOD source for Remotion; ${src} appears to be live.`);
}

Type guard

async function isLiveMediabunny(src: string): Promise<boolean> {
  const {Input} = await import('mediabunny');
  const input = new Input({source: src});
  try {
    const track = await input.getPrimaryAudioTrack();
    return track ? await track.isLive() : false;
  } finally {
    input.dispose();
  }
}

Try / catch

// Forwarded to cancelRender(); use an ErrorBoundary to fall back to a non-live asset:
// <ErrorBoundary fallback={<Waveform src={staticFile('fallback.mp3')} ... />}>
//   <WindowedWaveform src={liveUrl} ... />
// </ErrorBoundary>

Prevention

When it happens

Trigger: Passing an HLS .m3u8 of a live event, an RTMP/RTSP radio relay URL, a DASH live manifest, a YouTube/Twitch stream URL, or any source whose container advertises LIVE.

Common situations: Mistakenly using a live endpoint (e.g. radio station stream) instead of a recorded VOD; using the live variant of an HLS playlist instead of the VOD/Event playlist; pulling a 'watch?v=' URL instead of a downloadable media URL; radio/podcast services that stream in real time.

Related errors


AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12). Data as JSON: /api/errors/2b8d562ab8837e27. Report an issue: GitHub.