remotion-dev/remotion · error
Only supporting MPEG-4 for .ts
Error message
Only supporting MPEG-4 for .ts
What it means
Thrown by readAdtsHeader() when the ADTS 'id' bit is 1, meaning MPEG-2 (ISO/IEC 13818-7) ADTS rather than MPEG-4 (ISO/IEC 14496-3). The parser only handles the MPEG-4 variant (id == 0). The bit is read right after the 12-bit sync word.
Source
Thrown at packages/media-parser/src/containers/transport-stream/adts-header.ts:27
return null;
}
const iterator = getArrayBufferIterator({
initialData: buffer,
maxBytes: buffer.byteLength,
logLevel: 'error',
});
iterator.startReadingBits();
const bits = iterator.getBits(12);
if (bits !== 0xfff) {
throw new Error('Invalid ADTS header ');
}
// MPEG Version, set to 0 for MPEG-4 and 1 for MPEG-2.
const id = iterator.getBits(1);
if (id !== 0) {
throw new Error('Only supporting MPEG-4 for .ts');
}
const layer = iterator.getBits(2);
if (layer !== 0) {
throw new Error('Only supporting layer 0 for .ts');
}
const protectionAbsent = iterator.getBits(1); // protection absent
const audioObjectType = iterator.getBits(2); // 1 = 'AAC-LC'
const samplingFrequencyIndex = iterator.getBits(4);
const sampleRate = getSampleRateFromSampleFrequencyIndex(
samplingFrequencyIndex,
);
iterator.getBits(1); // private bit
const channelConfiguration = iterator.getBits(3);
const codecPrivate = createAacCodecPrivate({
audioObjectType,View on GitHub (pinned to 78fe4bb3fd)
Solutions
- Re-encode the AAC to MPEG-4 ADTS: ffmpeg -i in.ts -c:a aac -mpegts_flags +mod0 out.ts (or simply re-encode AAC: ffmpeg -i in.ts -c:v copy -c:a aac out.ts).
- Confirm the ADTS variant with ffprobe; if MPEG-2 ADTS is required, transcode before parsing.
- Reject such files at ingest and request an MPEG-4 variant.
Example fix
// before
await parseMediaStream({src: 'mpeg2adts.ts'});
// after: re-encode audio as MPEG-4 AAC
// ffmpeg -i mpeg2adts.ts -c:v copy -c:a aac -tag:a aac out.ts
await parseMediaStream({src: 'out.ts'}); Defensive patterns
Strategy: validation
Validate before calling
// Inspect the ADTS id bit (MPEG-4 vs MPEG-2) before parsing.
function isMpeg4Adts(buf: Uint8Array): boolean {
// byte 1, bit 3 (after 12-bit sync): id == 0 means MPEG-4
return buf.length >= 2 && (buf[1] & 0x08) === 0;
}
if (!isMpeg4Adts(buffer)) {
throw new Error('Rejecting MPEG-2 ADTS — re-encode as MPEG-4');
} Type guard
function isMpeg4Adts(buf: Uint8Array): boolean {
return buf.length >= 2 && (buf[1] & 0x08) === 0;
} Try / catch
try {
const hdr = readAdtsHeader(buffer);
} catch (err) {
if (err instanceof Error && err.message === 'Only supporting MPEG-4 for .ts') {
// re-encode AAC: ffmpeg -i in.ts -c:v copy -c:a aac out.ts
} else throw err;
} Prevention
- Author AAC as MPEG-4 ADTS (id bit = 0).
- Use ffmpeg to re-encode MPEG-2 ADTS to MPEG-4.
- Validate ADTS variant with ffprobe before parsing.
When it happens
Trigger: An ADTS stream authored as MPEG-2 AAC (id bit set). Some older encoders and broadcast chains emit MPEG-2 ADTS.
Common situations: Older broadcast TS content, files produced by legacy AAC encoders, or content authored with tools that default to MPEG-2 ADTS.
Related errors
- Only supporting MPEG-4 for .aac
- Invalid ADTS header
- Only supporting layer 0 for .ts
- Invalid ADTS header - too short
- Expected length is null
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/10ec641f1eb68d68.
Report an issue: GitHub.