fix(render): cap trimmed audio container duration

This commit is contained in:
Miguel Ángel
2026-07-25 21:14:18 +00:00
parent 9289551e98
commit afc4e96bbe
2 changed files with 7 additions and 0 deletions
@@ -91,6 +91,7 @@ describe("buildPadTrimAudioArgs", () => {
expect(operation).toBe("trim");
const filterIdx = args.indexOf("-af");
expect(args[filterIdx + 1]).toBe("atrim=duration=15.000000,asetpts=PTS-STARTPTS");
expect(args[args.indexOf("-t") + 1]).toBe("15.000000");
const codecIdx = args.indexOf("-c:a");
expect(args[codecIdx + 1]).toBe("aac");
expect(args[args.indexOf("-b:a") + 1]).toBe("192k");
@@ -201,6 +201,12 @@ export function buildPadTrimAudioPlan(
audioPath,
"-af",
`atrim=duration=${targetSec},asetpts=PTS-STARTPTS`,
// `atrim` limits decoded samples but does not cap muxer timestamps
// introduced by encoder delay/flush. The output duration contract
// is enforced at the container boundary as well; without `-t`, a
// long primed source can retain its original tail after re-encode.
"-t",
targetSec,
"-c:a",
"aac",
"-b:a",