Nodes/ComfyUI-OldTimeRadio/ VideoDirector (per-role model select)
ComfyUI Node

VideoDirector (per-role model select)

The dropdown panel that decides which video model plays which role

By jbrick2070·Created 5 months ago·Updated about 21 hours ago· 7
VideoDirector (per-role model select)
    • video_policy_json
    announcer_video_model
    music_video_model
    character_video_model
    announcer_image_model
    music_image_model
    character_image_model
    fps25
    canvas_w832
    canvas_h480
    seed_moderequest_hash
    request_seed0
    custom_models_json{}
    gate_in
    device_policydefault
    dtype_policyfp8_ok
    max_render_frames0

    If you're running the OldTimeRadio canonical workflow, this is the node you'll eventually want to touch, and the one with the scariest-looking interface. OTR_VideoDirector is a per-role model selector: it decides which video engine renders which kind of beat, and which image engine mints the stills behind them. It doesn't render anything itself. It produces a single JSON policy, video_policy_json, that downstream nodes (OTR_ShotLock, OTR_VideoRenderBatch) honor exactly.

    Here's the design that makes this node make sense: this pack is model-agnostic on purpose. There is no "primary" video model. There's a registry of engine adapters, and you pick one per role:

    • announcer_video_model - the announcer bookends (role A)
    • music_video_model - the opening/closing theme visuals (role B)
    • character_video_model - character dialogue beats, face + audio (role C)

    Each has a matching image-model dropdown (announcer_image_model, music_image_model, character_image_model) that supplies the stills the video lanes hold or move. That's six dropdowns, and they're all "registry IS the menu" - 32 video choices and 13 image choices at the time of writing, local and cloud mixed in.

    The default is the thing people miss. All three video roles ship set to still_flat, a procedural still/CRT floor - no GPU video checkpoint at all. The image roles default to z_image_turbo, an Apache-2.0 model. That's deliberate: the canonical workflow runs anywhere, even a laptop, before you ask for the heavy stuff. The heavy lanes - HuMo, LTX, Wan, AnimateDiff, MiniMax H3 - are upgrades you dial in later, one role at a time.

    And that's exactly what the README's VRAM table is for: it's the profile. Every engine's measured VRAM is listed per card class (8/12/16 GB), with ltx25_high_video measured at 14.48 GiB (explicitly 5080-only), h3_low_video at 7.28 GiB under an 8 GB clamp, wan22_high_video at 12.1 GiB, and so on. Read your card's column and pick from it. Two warnings the table makes you earn: the host RAM number is the one people miss (an 8 GB laptop with 16 GB of system RAM will choke regardless of VRAM), and two entries aren't commercial-clean - MiniMax H3 runs under a personal authorization that doesn't transfer to you, and the AnimateDiff motion module publishes no license grant. Fine for hobby, not cleared for resale.

    The other widgets are mostly set-and-forget: fps (25), canvas_w/canvas_h (832×480), seed_mode (request_hash for deterministic renders vs fixed), and request_seed (deliberately not named "seed" - this pack is weird about that). Two worth knowing if you're on a small card: device_policy (cuda/cpu/mps, explicitly no auto-detect) and max_render_frames, a render-length ceiling that the low-VRAM Wan lane uses to render 17 real frames and ping-pong them out rather than OOMing on the full span. custom_models_json lets you map a role to your own engine id when a role is set to "+ Add Custom Model".

    Install & gotchas. ComfyUI Manager → search "ComfyUI-OldTimeRadio", or git clone https://github.com/jbrick2070/ComfyUI-OldTimeRadio into custom_nodes/, check out v2.0-alpha, restart. If the node doesn't appear, you're on the wrong branch.

    The big gotcha: engines load one at a time with VRAM reclaim between them, and a pick that doesn't fit your card fails loudly mid-render - it won't substitute a lighter engine for you. That's a feature, but it means the dropdown pick is a promise. Start on still_flat for everything, get one full episode through, then upgrade roles one at a time and watch the console. Cloud lanes (cloud_kling_avatar, google_veo_video, …) are paid, off by default, and only switch on when you pick them. Choose your video model like you'd choose a meal: by what's on your card, not by what's coolest.

    CategoryOldTimeRadio/v2/video

    Inputs (16)

    NameTypeDefaultDescription
    announcer_video_modelCOMBOVideo model for ANNOUNCER beats (role A).
    music_video_modelCOMBOVideo model for MUSIC beats (role B).
    character_video_modelCOMBOVideo model for CHARACTER beats (face + audio, role C). Uses the saved dropdown value; profiles only retarget this when explicitly applied.
    announcer_image_modelCOMBOImage source for the announcer (feeds its video).
    music_image_modelCOMBOImage source for music beats.
    character_image_modelCOMBOImage engine that mints the still for character beats (the portrait-bearing shots). Profile/platform-owned: variants pin it per hardware tier; the runtime engine registry resolves the final engine.
    fpsINT251–60Frame rate the video plan budgets beats at. Profile/platform-owned; downstream stages read it from the plan, so change it via profile, not per-episode.
    canvas_wINT83216–7680Video plan canvas width (px). Profile/platform-owned per hardware tier; engines may declare their own native canvas that supersedes this at render.
    canvas_hINT48016–4320Video plan canvas height (px). Profile/platform-owned -- see canvas_w.
    seed_modeCOMBOrequest_hashrequest_hash (deterministic) | fixed.
    request_seedINT00–4294967295Base seed (NOT named 'seed' on purpose, V-7).
    custom_models_jsonoptSTRING{}When a role is set to '+ Add Custom Model', map the role key to a custom engine id here, e.g. {"character_video_model": "my_engine"}.
    gate_inoptSTRINGOptional ordering signal (opaque STRING).
    device_policyoptCOMBOdefaultLocal video render device. 'default' asks ComfyUI what this machine has and RECORDS what it chose; anything else is explicit and is never second-guessed.
    dtype_policyoptCOMBOfp8_okDtype lanes allowed for local video engines (fp8/fp4 artifacts are OFF on ROCm/MPS tiers).
    max_render_framesoptINT00–240Absolute per-clip RENDER-length ceiling in frames for local video engines (0 = unpinned = the engine's own maximum). Beat LENGTH is never changed by it -- this caps what an engine renders, never what the episode plays. TWO LANES CONSUME IT DIFFERENTLY. ltx_8gb takes it as a COVERAGE-PLANNING cap: the beat is partitioned into real clips of at most this many frames and chained, so the ceiling decides how many clips cover the beat. The 8GB Wan tier takes it as an adapter-side NATIVE cap: it pins 17, renders 17 real frames, and ping-pong-extends them to the beat's audio length rather than requesting the whole 177-frame span and dying in the VRAM cost model. A value at or above an engine's own maximum has no effect on that engine.

    Outputs (1)

    NameTypeDescription
    video_policy_jsonSTRING