remotion-dev/remotion · error · Error

No streams found

Error message

No streams found

What it means

Thrown by `selectStream` when the `streams` array passed to it is empty — i.e., the HLS master playlist contained zero `#EXT-X-STREAM-INF` entries. Without at least one variant stream, there is nothing to select and play.

Source

Thrown at packages/media-parser/src/containers/m3u/select-stream.ts:72

export const defaultSelectM3uAssociatedPlaylists: SelectM3uAssociatedPlaylistsFn =
	({associatedPlaylists}) => {
		if (associatedPlaylists.length === 1) {
			return associatedPlaylists;
		}

		return associatedPlaylists.filter((playlist) => playlist.default);
	};

export const selectStream = async ({
	streams,
	fn,
}: {
	streams: M3uStream[];
	fn: SelectM3uStreamFn;
}): Promise<M3uStream> => {
	if (streams.length < 1) {
		throw new Error('No streams found');
	}

	const selectedStreamId = await fn({streams});
	const selectedStream = streams.find(
		(stream) => stream.id === selectedStreamId,
	);

	if (!selectedStream) {
		throw new Error(`No stream with the id ${selectedStreamId} found`);
	}

	return Promise.resolve(selectedStream);
};

export const defaultSelectM3uStreamFn: SelectM3uStreamFn = ({streams}) => {
	return Promise.resolve(streams[0].id);
};

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Verify the `.m3u8` file is a master playlist containing at least one `#EXT-X-STREAM-INF` line.
  2. If the file is a media playlist (segment list), pass it directly rather than expecting stream selection.
  3. Check that the server is serving the complete manifest and not truncating it.
  4. Report the playlist at remotion.dev/report if it appears to be a valid master playlist with streams.
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-check that the manifest is a master playlist with streams
async function isMasterPlaylist(url: string): Promise<boolean> {
  const res = await fetch(url);
  const text = await res.text();
  return text.includes('#EXT-X-STREAM-INF');
}

Try / catch

try {
  await parseMedia({src: 'https://example.com/master.m3u8'});
} catch (e) {
  if (e instanceof Error && e.message === 'No streams found') {
    console.error('The M3U8 has no #EXT-X-STREAM-INF entries. Is this a media playlist?');
  }
  throw e;
}

Prevention

When it happens

Trigger: Parsing an HLS master playlist (`.m3u8`) that has no `#EXT-X-STREAM-INF` directives at all, so the stream list passed to `selectStream` is empty. This can also happen if stream parsing logic finds no valid stream-inf entries due to parse failures earlier in the pipeline.

Common situations: Passing a media playlist (which lists segments, not streams) where a master playlist is expected. A malformed or empty master playlist. A playlist that only contains `#EXT-X-MEDIA` (audio/subtitle) entries but no video variants. A truncated or partially-served manifest.

Related errors


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