Nodes/ComfyUI-OldTimeRadio/ CaptionBurn (SDH open captions on the silent video; default-OFF)
ComfyUI Node

CaptionBurn (SDH open captions on the silent video; default-OFF)

OTR_CaptionBurn

By jbrick2070·Created 5 months ago·Updated about 17 hours ago· 7
CaptionBurn (SDH open captions on the silent video; default-OFF)
    • video_path
    • report
    video_path
    burn_captionsfalse
    caption_stylesdh_standard
    fps25
    ffmpegffmpeg
    ledger_path
    output_path
    gate_in
    title_card_plan_json

    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.

    CategoryOldTimeRadio/v2/video

    Inputs (9)

    NameTypeDefaultDescription
    video_pathSTRINGSilent video from OTR_SilentComposite. Captions burn here; audio is added later by MasterAudioMux.
    burn_captionsoptBOOLEANfalseBurn SDH open captions into the video. Default OFF (clean master); enabled by the capability profile. Node 86 is the single caption owner.
    caption_styleoptCOMBOsdh_standardVisual 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.
    fpsoptINT251–120Frame rate used for caption timing math. Must match the incoming silent video's real rate or captions drift against speech.
    ffmpegoptSTRINGffmpegDEPRECATED 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_pathoptSTRINGOptional explicit timed-ledger path. Empty -> resolved from the video stem (otr_audio_dir / in-flight ledger).
    output_pathoptSTRINGCaptioned 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_inoptSTRINGOptional ordering signal (opaque STRING).
    title_card_plan_jsonoptSTRINGHero 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)

    NameTypeDescription
    video_pathSTRING
    reportSTRING