`<Audio>` at composition root resolves to `duration=Infinity` in ffmpeg filter graph

Open
#4 1 comment 0 reactions 0 assignees View on GitHub

@elwizard33 is already working on this.

Since Nov 2, 2026.

  • #25 by @elwizard33 — open

Assessment

Difficulty
3/5
Estimated time
Half a day
Newbie friendliness
55/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Quiet
Tech stack
react, typescript

Research direction

Start from the code that turns <Audio> into an ffmpeg atrim filter and see how it computes duration when there is no endAt and no wrapping <Sequence>. Reproduce with the MyChapter composition from the report and look at the filter string it builds. Done when that case either gets a finite bound from the composition's durationInFrames or fails early with a clear error naming the <Audio> src, and a test covers the no-endAt case.

Written by the indexing model from the issue text.

Description

Summary

A bare <Audio src={...} /> placed at the root of a <Composition> (no endAt prop, no wrapping <Sequence>) causes the renderer to emit duration=Infinity into the ffmpeg atrim filter, which crashes the render.

Reproduction

// MyChapter.tsx
import { CanvasElement, Audio, staticFile } from '@rendiv/core';

export const CHAPTER_DURATION = 3814;

export const MyChapter = () => (
  <CanvasElement id="MyChapter">
    <Audio src={staticFile('audio/chapter.mp3')} />
    {/* ...other content sized to CHAPTER_DURATION... */}
  </CanvasElement>
);

// index.tsx
<Composition
  id=\"MyChapter\"
  component={MyChapter}
  durationInFrames={CHAPTER_DURATION}
  fps={30}
  width={1920}
  height={1080}
/>

Run:

rendiv render src/index.tsx MyChapter out/MyChapter.mp4

Actual

FFmpeg exited with code 234:
[Parsed_atrim_0 @ 0x...] Unable to parse option value \"Infinity\" as duration
Error applying option 'duration' to filter 'atrim': Invalid argument
Failed to set value '[1:a]atrim=start=0.000000:duration=Infinity,asetpts=PTS-STARTPTS[aout]'
  for option 'filter_complex': Invalid argument

Expected

The renderer should treat `` without an explicit `endAt` as bounded by the parent composition's `durationInFrames` — same behavior as Remotion.

Workaround

Explicitly pass `endAt`:
```tsx
<Audio src={staticFile('audio/chapter.mp3')} endAt={CHAPTER_DURATION} />
```

This works, but every chapter master in the project needed the same one-line fix, and the failure mode (`duration=Infinity` from ffmpeg) was very far from the cause.

Suggested fixes (any one would help; all three would be ideal)

  1. Default `endAt` to composition duration. When `` has no `endAt` and no wrapping ``, treat it as `endAt = compositionDurationInFrames`.

  2. Guard the filter-graph emitter. Before serializing `atrim=duration=${value}`, `assert(Number.isFinite(value))` and throw with a useful message, e.g.:

    `Audio src="..." resolved to infinite duration. Pass endAt={N} or wrap in .`

  3. Mount-time lint. Walk the composition tree once and warn for any `` / `` / `` lacking a bounded `endAt` and a Sequence ancestor.

Environment

  • `@rendiv/core`: ^0.1.0
  • `@rendiv/cli`: ^0.1.0
  • ffmpeg: 7.0.2-static
  • OS: Debian inside Docker container (headless)
Dominant language
TypeScript
Stars
159
Forks
32
PR merge metrics
No merged PRs in 30d

Getting set up

This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from thecodacus/rendiv

All issues in thecodacus/rendiv

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.