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

  1. 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).
  2. Confirm the ADTS variant with ffprobe; if MPEG-2 ADTS is required, transcode before parsing.
  3. 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

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


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