remotion-dev/remotion · error · Error
Does not PMT table with more than 1 entry, uncommon
Error message
Does not PMT table with more than 1 entry, uncommon
What it means
Thrown at parse-pmt.ts:63 when parsePmtTable produces a tables array whose length is not exactly 1. The loop runs from sectionNumber to lastSectionNumber inclusive, so a multi-section PMT (lastSectionNumber > sectionNumber) yields more than one entry and trips the guard. The library assumes a single-section PMT, which covers the vast majority of real-world streams.
Source
Thrown at packages/media-parser/src/containers/transport-stream/parse-pmt.ts:63
iterator.getBits(4); // reserved
const esInfoLength = iterator.getBits(12);
iterator.getBits(esInfoLength * 8);
streams.push({streamType, pid: elementaryPid});
const remaining = sectionLength - (iterator.counter.getOffset() - start);
if (remaining <= 4) {
break;
}
}
tables.push({
type: 'transport-stream-program-map-table',
streams,
});
}
if (tables.length !== 1) {
throw new Error('Does not PMT table with more than 1 entry, uncommon');
}
iterator.stopReadingBits();
return {
type: 'transport-stream-pmt-box',
tableId,
streams: tables[0].streams,
};
};
export const parsePmt = (iterator: BufferIterator): TransportStreamPMTBox => {
iterator.startReadingBits();
const tableId = iterator.getBits(8);
iterator.getBits(1); // syntax indicator
iterator.getBits(1); // private bit
iterator.getBits(4);View on GitHub (pinned to 78fe4bb3fd)
Solutions
- Re-mux to a single-section PMT: ffmpeg -i in.ts -c copy out.ts.
- If you genuinely need multi-section PMT support, file a feature request on @remotion/media-parser with the sample.
- Transcode to a different container (MP4, MKV) that does not segment program maps.
- Verify the PMT section_number/last_section_number with dvbsnoop.
Defensive patterns
Strategy: validation
Validate before calling
// Reject multi-section PMTs upstream by checking last_section_number
// Not directly exposed by ffprobe; rely on re-mux to collapse to single-section.
function normalizePmt(src: string): string {
const out = src + '.remux.ts';
execSync(`ffmpeg -y -i "${src}" -c copy "${out}"`);
return out;
} Try / catch
try { await parseMedia({src}); }
catch (e) { if (e instanceof Error && e.message === 'Does not PMT table with more than 1 entry, uncommon') { const norm = remux(src); await parseMedia({src: norm}); } else throw e; } Prevention
- Re-mux multi-program or multi-section transport streams with ffmpeg.
- Transcode to MP4/MKV if PMT segmentation cannot be normalized.
- File a feature request on @remotion/media-parser if you need multi-section PMT.
When it happens
Trigger: parsePmtTable pushes one entry per iteration of the sectionNumber..lastSectionNumber loop; if that range spans more than one value, tables.length > 1 and the guard fires. Triggered by multi-section PMTs (rare in practice) or by corruption that inflates lastSectionNumber.
Common situations: Streams from unusual broadcast muxers that segment the PMT; corrupt PMT section headers; theoretical edge cases the library has chosen not to support yet.
Related errors
- Invalid section length
- No stream found
- No PMT box found
- Invalid table ID: ${tableId}
- Invalid section length
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/eb16373a824d3044.
Report an issue: GitHub.