CaptionBurn (SDH open captions on the silent video; default-OFF)
OTR_CaptionBurn
- video_path
- report
Read the name twice: SDH open captions on the silent video; default-OFF. The default is the whole point. OldTimeRadio renders a clean master by default - no burned-in text - and OTR_CaptionBurn is the opt-in step that adds accessibility captions if you want them. It sits after OTR_SilentComposite (which produces the always-silent video) and before OTR_MasterAudioMux (which adds audio last, -c:a copy). Captions burn into the silent video; audio is never part of this node's job.
"SDH" means subtitles for the deaf and hard of hearing - dialogue plus the sound cues. "Open captions" means they're baked into the pixels, not a sidecar .srt. That's a deliberate choice here: the pack ships a single playable MP4, and burnt-in captions travel with it. caption_style is sdh_standard by default, with otr_crt as the retro-alternative if you want the captions to match the CRT aesthetic.
How it works
The node takes the silent video path, optionally reads a timed ledger (the captions' timings come from the episode's line timestamps), and burns text onto frames via ffmpeg. The output lands beside the input as <stem>_captioned.mp4. There's a ledger_path override if the automatic resolution from the video stem ever misses.
Where people get burned: the hero title card. OTR_SignalLostVideo emits a title_card_plan_json, and when that's present this node burns the title regardless of burn_captions - and any failure refuses to pass through. That's a hard contract: the title is the only copy left once the procedural draw is suppressed, so it must land. Don't wire a title-card plan in and expect burn_captions=False to skip the title.
The inputs that matter
video_path (required, from OTR_SilentComposite), then flip burn_captions to true, and pick caption_style. fps (25 default) and ffmpeg are standard. Outputs: the captioned video_path and a report string. gate_in is the usual ordering signal; the canonical graph wires it after the procgen blend.
Install and gotchas
Installs with the pack (ComfyUI Manager → ComfyUI-OldTimeRadio, restart; the v2.0-alpha branch is what has these nodes). Needs an ffmpeg binary on PATH - the pack shells out to it for everything video, so that's a system dependency, not a pip one. If captions don't appear, first check burn_captions is actually on - it defaults off every fresh drop, and the clean-master default is deliberate. If a title fails to burn, the node refuses loudly on purpose; check that title_card_plan_json from SignalLostVideo is well-formed rather than trying to bypass it.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| video_path | STRING | Silent video from OTR_SilentComposite. Captions burn here; audio is added later by MasterAudioMux. | |
| burn_captionsopt | BOOLEAN | false | Burn SDH open captions into the video. Default OFF (clean master); enabled by the capability profile. Node 86 is the single caption owner. |
| caption_styleopt | COMBO | sdh_standard | Visual style of the burned SDH captions. The OTR_CAPTION_STYLE env var may override the STYLE only -- no env var can turn burning on; only the burn_captions widget (or a supplied title-card plan, which forces the hero-title burn alone) does that. |
| fpsopt | INT | 251–120 | Frame rate used for caption timing math. Must match the incoming silent video's real rate or captions drift against speech. |
| ffmpegopt | STRING | ffmpeg | DEPRECATED and IGNORED (2026-09-04). A workflow value cannot name the binary this pack runs -- it arrives over an unauthenticated /prompt request. Set the OTR_FFMPEG environment variable to pin a build. |
| ledger_pathopt | STRING | Optional explicit timed-ledger path. Empty -> resolved from the video stem (otr_audio_dir / in-flight ledger). | |
| output_pathopt | STRING | Captioned mp4 path. Empty (the shipped default) -> <stem>_captioned.mp4 beside the input video. With burn OFF and no title plan the input passes through untouched. | |
| gate_inopt | STRING | Optional ordering signal (opaque STRING). | |
| title_card_plan_jsonopt | STRING | Hero title-card plan from OTR_SignalLostVideo. When present the title burns REGARDLESS of burn_captions and any failure REFUSES instead of passing through -- the title is the only copy left once the procgen draw is suppressed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video_path | STRING | — |
| report | STRING | — |