Nodes/VideoSeal Watermarking/VideoSeal Message (Binary)
ComfyUI Node

VideoSeal Message (Binary)

Reproduce your watermark without saving anything

By jc2shile·Created 2 months ago·Updated 2 months ago· 1
VideoSeal Message (Binary)
    • message
    nbits256
    seed0
    hex_string

    Reproduce your watermark without saving anything

    Leave the message field empty on VideoSeal Embed Watermark and the model rolls a random message for every clip you stamp. That's fine for "mark this and forget it" - but the entire point of watermarking is being able to prove a clip is yours later, and to do that you need to know exactly what you embedded. This node is the boring, reliable half of that job: it turns a seed into a deterministic string of 0s and 1s, so the same seed always produces the same message, run after run.

    It's the same idea as the seed value-nodes you've seen all over ComfyUI - one small node fanning a single value out to everything downstream, the pattern covered in the node-plumbing layer - except what fans out is a 256-bit binary string instead of an integer. Same seed → same bits, guaranteed, because the node reseeds a fresh torch.Generator before every draw.

    The inputs that matter

    Just three, and you'll realistically touch two:

    • nbits (default 256) - how many bits the message contains. Keep it in sync with the model you loaded: 256 for videoseal and pixelseal, 1024 for chunkyseal. The easy way to never get this wrong is to wire the model loader's nbits output into this input.
    • seed (default 0) - the reproducibility switch. Same seed, same message; change it and you get a different one. Note that 0 is a perfectly valid seed, not "unset."
    • hex_string (optional) - if you'd rather work with a memorable hex constant (a1b2c3) than a wall of bits, the node expands each hex digit to four bits and pads or truncates to nbits.

    The single output, message (STRING), plugs straight into the message input on VideoSeal Embed Watermark.

    Where it fits in the workflow

    The clean setup is loader → message → embed:

    VideoSealModelLoader ── nbits ──▶ VideoSealMessage ── message ──▶ VideoSeal Embed Watermark
    

    Embed the message, save the watermarked clip, and you can regenerate the exact message anytime by typing the seed back in - no need to keep a copy of what you embedded. That's what makes later detection meaningful: recovered bits that match your seed's message are your fingerprint. A random 256-bit message you never recorded is just noise when you go to verify.

    One gotcha worth knowing: if your message length and the model's nbits disagree, the embed node silently truncates or zero-pads to fit. The message you recover at detection will then be a different length than the one you think you embedded, which makes the comparison confusing. Wire the loader's nbits in and this never bites you.

    Installing

    VideoSealMessage ships in the ComfyUI-VideoSeal pack, alongside the model loader, embed, and detect nodes. Install once for the whole pack:

    • ComfyUI Manager: search "VideoSeal" and click install - dependencies handled for you.
    • Manual:
    cd ComfyUI/custom_nodes
    git clone https://github.com/jc2shile/ComfyUI-VideoSeal
    cd ComfyUI-VideoSeal
    pip install -r requirements.txt   # videoseal, omegaconf, einops
    

    Then restart ComfyUI. The good news for this particular node: it has no model download and no device handling - the heavy lifting (the ~500 MB checkpoint) happens on the VideoSeal Model Loader, not here. If you're using this node and nothing loads, the problem is upstream in the loader or its download, not in the message generator.

    CategoryVideoSeal

    Inputs (3)

    NameTypeDefaultDescription
    nbitsINT25616–4096
    seedINT00–2147483647
    hex_stringoptSTRING

    Outputs (1)

    NameTypeDescription
    messageSTRING