Broadcast Resolution (input)
1080p Out of a Model That Only Wants Multiples of 32
- width
- height
You set the width box to 1920 and the height box to 1080, because that's what video is. Then the sampler either throws a shape error or cheerfully returns something 1088 pixels tall. Neither of those is you being dumb - 1080 is not divisible by 32, and a lot of modern video models will not have it.
Broadcast Resolution (input) exists to do that arithmetic for you, once, in one place.
What it is, in the plumbing sense
This node draws no pixels and touches no model. It's a value node: four widgets in, two plain INTs out. Pick a delivery standard, pick an aspect ratio, and it hands you a width/height pair the generator will actually accept.
That makes it the boring, load-bearing kind of node. The classic failure with a dimension is deciding it in five widgets and forgetting one; a node that owns the number is the fix - the same pattern as ComfyUI's core PrimitiveInt nodes.
The math, concretely
Two things happen, in order.
First it computes your true target from the ladder: the resolution dropdown gives a native resolution, and the aspect_ratio is derived against it. Landscape ratios pin the height and derive the width, so 1080p at 16:9 is 1920x1080 and 1080p at 1.85:1 (Flat) is 1998x1080. Portrait ratios flip it: 1080p at 9:16 comes out 1080x1920.
Then it snaps up to your chosen multiple:
- 1080p 16:9 → 1920x1080 becomes 1920x1088
- 4K 16:9 → 3840x2160 becomes 3840x2176
- 1080p vertical → 1080x1920 becomes 1088x1920
- 1:1 at 1080p → 1080x1080 becomes 1088x1088
Up, never down. The source is blunt about why: a model fed fewer pixels than it expects errors out, so there's no round-down branch to fall into. The real-world version of this is LTX-2.3, where width and height must be divisible by 32 and off-grid values fail rather than round - a hard constraint, not a preference, which is why people keep building resize nodes specifically for it.
The true, un-snapped target doesn't come out as a wire - it goes into a shared cache that the output node reads later. That's also the one place this design can bite you.
The inputs you'll actually touch
resolution (default HD 1080p) has seven rungs: SD NTSC, SD PAL, HD 720p, HD 1080p, UHD 4K, 5K UHD, UHD 8K. aspect_ratio (default 16:9 Widescreen) has eight, including vertical 9:16, 1:1, 4:5 for Instagram feed, and the cinema ratios Flat and Scope.
multiple is the one worth thinking about. Default 32 - the README's framing is 32 for LTX/MiniMax, with 16 and 64 as the other sensible stops, and 0 to turn snapping off. For SD work, 32 is heavy-handed: SD NTSC at 16:9 computes to 854x480, which snaps to 864x480. Want the classic width exactly? Set 0 and accept the constraint you're signing up for.
cinema_delivery is the override. The tooltip says it straight: "Overrides resolution/aspect_ratio with a fixed DCI delivery container size." Pick DCI 4K Flat and the ladder widgets go dim and stop mattering - 3996x2160 becomes the target, snapped to 4000x2176. A clean way to stop pretending 4K UHD and 4K DCI are the same number.
The outputs
width and height, both INT. Wire them into the width/height inputs of whatever makes the latent - an Empty Latent, a video latent node, or an image resize on your i2v source frame so the conditioning image is already on-grid. That's the whole node; the other half of the pack handles the return trip.
Install
Same pack, same steps as the output node:
cd ComfyUI/custom_nodes
git clone https://github.com/UCHIJ/ComfyUI-BroadcastResolutions
Or search broadcast-resolutions / "Broadcast Video Profile Suite" in ComfyUI Manager, or use the CLI:
comfy node install comfyui-broadcast-resolutions
Restart ComfyUI and look in the Broadcast Video Profile category. No requirements.txt, no model downloads - pure Python plus a little frontend JS, so it won't add to your dependency-conflict pile. In a hobby where half of install time goes to chasing missing nodes, that's a real virtue.
Where people get burned
The 1088. It looks wrong, and if you save straight from the sampler it is wrong - you'll ship a video whose height is 1088. Fixing that is the output node's job. Skip it and you own the extra rows.
Two input nodes in one graph. The target lives in a single module-level dictionary, and the last node to execute writes it. Two input nodes with different profiles means both output nodes conform to whichever ran last. One per graph.
Custom profiles need exact strings. broadcast_profiles.json sits in the pack's web/ folder, and you can add your own standards to it. Python reads it at import time and the JS caches its fetch per page load, so: restart ComfyUI and hard-refresh the browser tab. Keep labels character-identical - the shipped aspect labels contain double spaces, and a mismatch there silently breaks a dropdown.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| resolution | COMBO | HD 1080p | 7 options: SD NTSC, SD PAL, HD 720p, HD 1080p, UHD 4K, 5K UHD, +1 |
| aspect_ratio | COMBO | 16:9 Widescreen (YouTube) | 8 options: 16:9 Widescreen (YouTube), 9:16 Vertical (Reels / TikTok / Shorts), 1:1 Square (Instagram / Universal), 4:3 Standard (legacy TV), 3:4 Vertical (legacy photo/grid), 4:5 Instagram Feed Portrait, +2 |
| cinema_delivery | COMBO | None | Overrides resolution/aspect_ratio with a fixed DCI delivery container size |
| multiple | INT | 320–128 | Snap dimensions UP to nearest multiple for generator nodes (0 = off) |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| width | INT | — |
| height | INT | — |