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!

What it means

Thrown by use-probe when any input track reports isLive() === true. Remotion Convert (and Remotion's render pipeline) requires finite, seekable media; live streams have no determinable duration and cannot be seeked, so probing aborts.

Source

Thrown at packages/convert/app/components/use-probe.ts:71

			source:
				src.type === 'file' ? new BlobSource(src.file) : new UrlSource(src.url),
		});
	}, [src]);

	const getStart = useCallback(() => {
		const run = async () => {
			input.getFormat().then((format) => setContainer(format));
			input.source.getSize().then((s) => setSize(s));
			getVideoFrameRate(input).then(setFrameRate);
			getDurationOrCompute(input).then((duration) =>
				setDurationInSeconds(duration),
			);
			input.getMetadataTags().then((tags) => setMetadata(tags));

			const trx = await input.getTracks();
			for (const track of trx) {
				if (await track.isLive()) {
					throw new Error(
						'Live streams are not currently supported by Remotion. Sorry!',
					);
				}

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

			let hasAudioTrack = false;
			let hasVideoTrack = false;
			for (const track of trx) {
				if (track.isVideoTrack()) {
					hasVideoTrack = true;
					const codec = await track.getCodec();
					setVideoCodec(codec);

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Provide a finite, on-demand media file instead of a live stream.
  2. If the source is recorded-but-flagged-live, remux to set a finite duration and remove the live flag.
  3. Gate the input in the UI: reject URLs whose tracks report isLive() before initiating conversion.

Example fix

// before
const tracks = await input.getTracks();
for (const t of tracks) { /* throws if live */ }

// after
const tracks = await input.getTracks();
if (await Promise.any(tracks.map((t) => t.isLive()))) {
  showError('Live streams are not supported. Upload a file instead.');
  return;
}
Defensive patterns

Strategy: validation

Validate before calling

const tracks = await input.getTracks();
const liveFlags = await Promise.all(tracks.map((t) => t.isLive()));
if (liveFlags.some(Boolean)) {
  showError('Live streams are not supported. Please upload a file.');
  return;
}

Type guard

null

Try / catch

try { await probe(input); }
catch (e) {
  if (e.message.includes('Live streams')) showError('Use a finite media file instead.');
  else throw e;
}

Prevention

When it happens

Trigger: Loading an HLS/DASH/RTMP/SRT live source, or any track whose container signals a live broadcast flag. The probe iterates every track and throws on the first live one.

Common situations: Pointing the Convert UI at a live stream URL; using an HLS playlist with `#EXT-X-PLAYLIST-TYPE:EVENT`/no ENDLIST that mediabunny classifies as live; accidentally capturing an m3u8 from a live encoder.

Related errors


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