remotion-dev/remotion · error · Error

Invalid ADTS header - too short

Error message

Invalid ADTS header - too short

What it means

Thrown by handle-aac-packet.ts when readAdtsHeader() returns null. readAdtsHeader returns null only when buffer.byteLength < 9 (the minimum ADTS header size), so this throw means the AAC packet buffer was too short to even attempt a header parse.

Source

Thrown at packages/media-parser/src/containers/transport-stream/handle-aac-packet.ts:38

	offset,
	sampleCallbacks,
	logLevel,
	onAudioTrack,
	transportStream,
	makeSamplesStartAtZero,
}: {
	streamBuffer: TransportStreamPacketBuffer;
	programId: number;
	offset: number;
	sampleCallbacks: CallbacksState;
	logLevel: MediaParserLogLevel;
	onAudioTrack: MediaParserOnAudioTrack | null;
	transportStream: TransportStreamState;
	makeSamplesStartAtZero: boolean;
}) => {
	const adtsHeader = readAdtsHeader(streamBuffer.getBuffer());
	if (!adtsHeader) {
		throw new Error('Invalid ADTS header - too short');
	}

	const {channelConfiguration, codecPrivate, sampleRate, audioObjectType} =
		adtsHeader;

	const isTrackRegistered = sampleCallbacks.tracks.getTracks().find((t) => {
		return t.trackId === programId;
	});

	if (!isTrackRegistered) {
		const startOffset = makeSamplesStartAtZero
			? Math.min(
					streamBuffer.pesHeader.pts,
					streamBuffer.pesHeader.dts ?? Infinity,
				)
			: 0;
		transportStream.startOffset.setOffset({
			trackId: programId,

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Ensure the full TS packet (188 bytes) and complete PES payload are buffered before invoking the AAC handler.
  2. Re-mux or re-encode the TS: ffmpeg -i in.ts -c copy out.ts or ffmpeg -i in.ts -c:a aac out.ts.
  3. Add a length pre-check (>= 9 bytes) and skip short packets instead of throwing.

Example fix

// before
const adtsHeader = readAdtsHeader(streamBuffer.getBuffer());
if (!adtsHeader) throw new Error('Invalid ADTS header - too short');

// after: skip short buffers gracefully
if (streamBuffer.getBuffer().byteLength < 9) return null; // wait for / skip
Defensive patterns

Strategy: validation

Validate before calling

// Require at least 9 bytes (minimum ADTS header) before invoking the AAC handler.
const ADTS_MIN_LEN = 9;
if (streamBuffer.getBuffer().byteLength < ADTS_MIN_LEN) {
  // wait for more data / skip the short packet
  return null;
}

Type guard

function isLongEnoughForAdts(buf: Uint8Array): boolean {
  return buf.byteLength >= 9;
}

Try / catch

try {
  const hdr = readAdtsHeader(streamBuffer.getBuffer());
  if (!hdr) throw new Error('Invalid ADTS header - too short');
} catch (err) {
  if (err instanceof Error && err.message === 'Invalid ADTS header - too short') {
    // buffer short: wait for full PES / skip packet
  } else throw err;
}

Prevention

When it happens

Trigger: An AAC PES payload shorter than 9 bytes fed to handleAacPacket — e.g. a truncated TS packet, a fragmented PES that has not been reassembled, or a misrouted non-AAC packet.

Common situations: Truncated network reads of TS; partial PES reassembly; corrupt TS where the payload length is wrong; very short padding packets routed as AAC.

Related errors


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