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
- Verify the `.m3u8` file is a master playlist containing at least one `#EXT-X-STREAM-INF` line.
- If the file is a media playlist (segment list), pass it directly rather than expecting stream selection.
- Check that the server is serving the complete manifest and not truncating it.
- 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
- Verify the M3U8 is a master playlist with at least one #EXT-X-STREAM-INF entry.
- Do not pass media (segment-list) playlists where stream selection is expected.
- Check that the server serves the complete manifest without truncation.
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
- Expected duration in m3u playlist
- No moov box found in header segment
- Stream does not have a resolution
- Expected m3u-text-value
- Expected m3u-playlist with src ${src}
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/87271a920e596fb6.
Report an issue: GitHub.