CineTimeline Save Video (Normalized Audio)
The CineTimeline save node that fixes your audio levels before you ever hear them
- video
- video
- segment_manifest
MiniMax H3 outputs video with native audio - dialogue, ambience, the whole mix comes out of the same generation pass, which is still rare enough to be the whole reason people use models like it. The catch is that the level of that audio is whatever the model felt like giving you. This node is the pack's answer: it saves your segment and loudness-normalizes the audio on the way out, so you're not discovering at assembly time that shot three is 6 dB louder than everything else.
You'll find it at the end of the segment-render branch of the pack's H3 workflow, right after decoding. Wire the VIDEO in, and it handles the rest.
What it actually does
Under the hood it's a save node with a post-processing pass bolted on. The video gets written to ComfyUI/output/<filename_prefix>, then the saved file's audio is measured with FFmpeg's EBU R128 filter and normalized: a 55 Hz highpass, a light afftdn denoise, then loudnorm targeting about -16 LUFS with a -1.5 dBTP true-peak ceiling and LRA 11. The video stream is copied (no re-encode), the audio is re-encoded to AAC 192k, and the file is atomically replaced in place. One nuance worth knowing: the gain is adaptive. If the source is already near or above the target, it won't pump it up past a 10 dB cap - loudnorm fixes levels, it doesn't resurrect a clipped or brickwalled track.
The inputs that matter:
video- your rendered segment. The only non-negotiable one.filename_prefix- where it lands, defaultH3-CineTimeline/segments/segment.format- container,mp4default.codec- a dynamic combo.autojust reuses the input codec; pickh264→re-encodeif you want a specific CRF (default 23).latent_path- optional, and this is the sneaky-important one. If you point it at the segment's saved AV latent file, the node hashes it and emits asegment_manifestJSON recordingshot_id,render_run_id, the latent's SHA-256, and (for motion-context shots) the previous segment's version lineage.
That manifest is the pack's versioning glue: CineTimeline's "assemble complete movie" step reads it to verify that the continuation latent you're splicing from is exactly the one registered for the previous shot. Skip latent_path and you get an empty manifest string and a fine, normalized video - you just lose the continuity audit trail.
Installing it
The pack is Apache-2.0 with no Python dependencies of its own (its pyproject.toml declares an empty dependencies list), so this node needs nothing beyond ComfyUI's bundled FFmpeg/imageio:
cd ComfyUI/custom_nodes
git clone https://github.com/bo341805sg/ComfyUI-CineTimeline
# restart ComfyUI
Or search "CineTimeline" in ComfyUI Manager and hit install. The heavy dependencies in the README (KJNodes' Sage attention patch, minimax-h3-audio-T8) belong to the H3 sampling chain, not to this save node - though if you're running the pack's full workflow you'll be installing those anyway.
Gotchas
- The node re-muxes with
+faststart, so the saved file streams nicely, but the audio track is always transcoded - don't treat it as a lossless pass. - If normalization fails mid-run the node raises instead of silently saving the un-normalized file. The file it was working on is cleaned up, so you don't get a half-processed artifact.
- It's an output node and it's built on ComfyUI's newer V3 authoring API (
io.ComfyNode), so if you're poking at the source, expect the new-style schema - that's normal for a fresh pack, not a sign it's broken. - Expect loudness around -16 LUFS from this segment-level save. The pack's final-master normalization (the separate complete-movie save) targets -15 LUFS / -1 dBTP - don't panic when the two differ; they're different stages of the pipeline.
This is the node you reach for when you're done iterating on previews and want a segment you could hand to an editor without embarrassment. It's quiet, it's unglamorous, and it saves you an hour of chasing levels later.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | — | |
| filename_prefix | STRING | CineTimeline/segments/segment | — |
| format | COMBO | mp4 | 2 options: auto, mp4 |
| codec | COMBO | 2 options: [object Object], [object Object] | |
| latent_pathopt | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| segment_manifest | STRING | — |