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-thumbnail's setVideoTrack when the primary video track reports isLive() === true. Thumbnail generation requires seeking/sampling discrete frames, which live streams do not support, so the hook refuses to proceed.

Source

Thrown at packages/convert/app/lib/use-thumbnail.ts:36

	const waveform = useMemo(() => {
		return makeWaveformVisualizer({
			onWaveformBars,
		});
	}, [onWaveformBars]);

	const execute = useCallback(() => {
		const getDuration = async () => {
			const duration = await input.computeDuration();
			waveform.setDuration(duration);
		};

		const setVideoTrack = async () => {
			const videoTrack = await input.getPrimaryVideoTrack();

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

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

				const videoSink = new VideoSampleSink(videoTrack);
				let samples = 0;
				const iterator = videoSink.samples();
				for await (const sample of iterator) {
					samples++;
					onVideoThumbnail(sample.toVideoFrame());
					sample.close();

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Provide a finite, on-demand media file for thumbnail generation.
  2. Remux the source to clear the live flag and establish a finite duration.
  3. Check isLive() before invoking the thumbnail hook and skip thumbnails for live inputs.

Example fix

// before
const videoTrack = await input.getPrimaryVideoTrack();
if (videoTrack && await videoTrack.isLive()) throw ...;

// after
const videoTrack = await input.getPrimaryVideoTrack();
if (videoTrack && await videoTrack.isLive()) {
  setThumbnailsEnabled(false); // gracefully disable
  return;
}
Defensive patterns

Strategy: validation

Validate before calling

const videoTrack = await input.getPrimaryVideoTrack();
if (videoTrack && await videoTrack.isLive()) {
  setThumbnailsEnabled(false);
  return;
}

Type guard

null

Try / catch

try { await setVideoTrack(); }
catch (e) {
  if (e.message.includes('Live streams')) { setThumbnailsEnabled(false); }
  else throw e;
}

Prevention

When it happens

Trigger: Loading a live HLS/DASH/RTMP source into the Convert UI; any input whose primary video track carries a live broadcast flag. Same root cause as error 190 but specifically in the thumbnail-generation path.

Common situations: Pasting a live m3u8/mpd URL; recorded-but-live-flagged HLS playlists; surveillance/IPC streams.

Related errors


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