From 19258ea5ba47067e9d5756b122051c467ece0b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Sat, 18 Jul 2026 19:13:00 +0000 Subject: [PATCH] fix(render): cap final mux to video duration --- packages/engine/src/services/chunkEncoder.ts | 5 +++++ packages/producer/src/services/distributed/assemble.ts | 6 +++++- .../producer/src/services/render/stages/assembleStage.ts | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/engine/src/services/chunkEncoder.ts b/packages/engine/src/services/chunkEncoder.ts index e30272644..a2d301781 100644 --- a/packages/engine/src/services/chunkEncoder.ts +++ b/packages/engine/src/services/chunkEncoder.ts @@ -79,6 +79,8 @@ export interface MuxVideoWithAudioOptions extends Partial< audioCodec?: "aac"; /** Preserve a priming edit list known to have been created by AAC re-encoding. */ preserveAudioPrimingEditList?: boolean; + /** Hard cap copied audio to the already-encoded video's exact duration. */ + durationSeconds?: number; } async function shouldCopyAacSidecar( @@ -706,6 +708,9 @@ export async function muxVideoWithAudio( // output container metadata. `-c:v copy` is retained; no re-encode. args.push("-r", fpsToFfmpegArg(fps)); } + if (config?.durationSeconds !== undefined) { + args.push("-t", String(config.durationSeconds)); + } args.push("-y", outputPath); const processTimeout = config?.ffmpegProcessTimeout ?? DEFAULT_CONFIG.ffmpegProcessTimeout; diff --git a/packages/producer/src/services/distributed/assemble.ts b/packages/producer/src/services/distributed/assemble.ts index df1f93c64..91f56ed90 100644 --- a/packages/producer/src/services/distributed/assemble.ts +++ b/packages/producer/src/services/distributed/assemble.ts @@ -323,7 +323,11 @@ export async function assemble( audioForMux, muxOutputPath, abortSignal, - { audioCodec: "aac", preserveAudioPrimingEditList }, + { + audioCodec: "aac", + preserveAudioPrimingEditList, + durationSeconds: padTrimResult.targetDurationSeconds, + }, { num: plan.dimensions.fpsNum, den: plan.dimensions.fpsDen }, ); if (!muxResult.success) { diff --git a/packages/producer/src/services/render/stages/assembleStage.ts b/packages/producer/src/services/render/stages/assembleStage.ts index ab218249b..6a2adf483 100644 --- a/packages/producer/src/services/render/stages/assembleStage.ts +++ b/packages/producer/src/services/render/stages/assembleStage.ts @@ -79,6 +79,7 @@ export async function runAssembleStage(input: AssembleStageInput): Promise