fix(render): cap final mux to video duration

This commit is contained in:
Miguel Ángel
2026-07-25 21:14:18 +00:00
parent afc4e96bbe
commit 19258ea5ba
3 changed files with 11 additions and 1 deletions
@@ -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;
@@ -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) {
@@ -79,6 +79,7 @@ export async function runAssembleStage(input: AssembleStageInput): Promise<Assem
{
audioCodec: "aac",
preserveAudioPrimingEditList: normalizeResult.operation === "trim",
durationSeconds: normalizeResult.targetDurationSeconds,
},
job.config.fps,
);