Nodes/ComfyUI VideoMark(视频水印)/VideoMark Video(视频一站式)
ComfyUI Node

VideoMark Video(视频一站式)

Watermark and end cards in one node, if your ComfyUI is new enough

By kaerozhi·Created 3 days ago·Updated 2 days ago· 2
VideoMark Video(视频一站式)
  • video
  • logo
  • logo_mask
  • video
modecorner
positionbottom_right
text© 2026 kaero
opacity0.85
scale20.0
margin32
use_texttrue
use_logofalse
layoutvertical
color#FFFFFF
stylesoft
use_stroketrue
stroke_width3
stroke_color#000000
stroke_opacity0.55
use_shadowtrue
shadow_color#000000
shadow_opacity0.40
shadow_offset5
shadow_blur8
angle0.0
font(内置兜底字体·中文会显示为方块)
font_file
float_pathdiagonal
float_cycles1.0
seed0
start_pct0.000
end_pct1.000
fade_frames0
tile_gap90
title_modeoff
title_seconds2.0
title_text
title_bg_color#000000
logo_file
text_in

VIDEO in, VIDEO out, everything done

VideoMark Video is the pack's convenience node: feed it a ComfyUI VIDEO, and it paints the watermark onto the frames, optionally glues a copyright card on the head and/or tail, keeps audio in sync, and hands you a VIDEO back. One node instead of three - no decode-to-IMAGE step, no re-encode step, and no frame rate to declare by hand, because it reads that off the video.

This is the node for the 2026 workflow shape where the model already emits a VIDEO. LTX-2 and MiniMax H3 land there, and Wan pipelines reach it through Create Video. If your graph currently ends … → Save Video, dropping this in the middle is a two-wire change.

The tradeoff of a convenience node is that it hides its seams, and this one has three: the card's text size follows the watermark's scale rather than having its own, the card never gets a stroke, and there's no separate head/tail text. If you want to style the card and the watermark independently, you want Overlay + Title chained instead. If you want "watermark plus a copyright card, don't make me think", this is the one.

No community signal to lean on either - a corpus search for "videomark" across two years of r/StableDiffusion, r/comfyui and r/civitai comes back empty, and most actual watermark discussion there is about removing marks, not adding them.

How it works

It pulls the video apart with get_components(): an IMAGE tensor plus frame_rate, audio, metadata and alpha. The watermark renderer is the same code the Overlay uses - one RGBA stamp sized to the frames, alpha-composited per frame, stroke and shadow baked in - and the card, if enabled, is title_seconds × fps frames of solid colour with text and logo laid out the same way, concatenated at the ends.

Then it rebuilds a VIDEO, preserving the input's bit depth and colour space and writing the frame rate back. One honest detail: if cards changed the frame count, the original alpha channel no longer matches the picture, so it's dropped rather than encoded wrong. Source with real transparency loses it. Everything is numpy + Pillow - no dependencies, no VRAM, no model.

The inputs you'll actually touch

  • video - the only required input; everything else has a default.
  • mode (corner, center, floating, tile) with position, then text, opacity, scale, margin. Same rules as the Overlay: scale is a percentage of frame width so it survives a resolution change, margin is in pixels, and center/tile want opacity down around 0.12–0.22.
  • title_mode - off (default), head, tail, both - with title_seconds (2 is standard) and title_text. Leave title_text empty and it inherits text, which means one text_in wire feeds both the watermark and the card.
  • title_bg_color for the card, plus style and the stroke/shadow controls for the watermark, and the optional logo / logo_mask / logo_file trio - use_logo is off by default, and a wired logo beats the uploaded file.

text_in behaves like the rest of the pack: connected and non-empty wins, blank falls back to the typed text. Output is a single video, straight into Save Video.

Install

# ComfyUI Manager: search "comfyui-videomark"
cd ComfyUI/custom_nodes
git clone https://github.com/kaerozhi/comfyui-videomark.git

Also available as comfy node install comfyui-videomark. No pip step: the pack declares zero dependencies and rides on the torch/numpy/Pillow ComfyUI already ships. Restart afterwards.

Where people get burned

The node isn't there at all. It only registers if your ComfyUI exposes the comfy_api.latest VIDEO types. The pack imports them at load time and skips the node entirely if they're missing, printing a [VideoMark] line about the failed VIDEO import to the console. On an older install you get Overlay and Title and no sign of the third node. Updating ComfyUI is the fix - it isn't a pack bug, and it's the one gotcha unique to this node.

A card bigger than you expected. Card text and logo sizes follow scale, the watermark's own percentage. Bump scale for a bigger card and you've made the watermark bigger too. Chained Overlay + Title avoids that, since Title has its own logo_scale and text_scale.

A watermark that isn't there. If rendering throws, the node logs one [VideoMark] line and passes the video through untouched. You get a clean clip, not an error - read the console before debugging your wiring.

Missing font glyphs. 黑体 (simhei) has no ©, so a copyright line renders as a box there. Use 微软雅黑 / 宋体 / 楷体, or point font_file at a font file.

Dark shadow on dark footage. Invisible by definition. Keep the stroke, or set shadow_color light - same advice as the rest of the pack.

Editing the panel without a restart. The panel under web/ is scanned at startup, so changing an existing JS file only needs Ctrl+Shift+R, while adding a new one needs a ComfyUI restart.

CategoryVideoMark

Inputs (39)

NameTypeDefaultDescription
videoVIDEO
modeCOMBOcorner水印方式: corner 固定贴四角之一(最不挡画面,日常首选) center 画面正中,建议 opacity 压到 0.15~0.25 floating 在安全区内游走 / 周期跳位(防盗最强,观感最差) tile 全画面平铺,最难裁掉抹除
positionCOMBObottom_rightcorner 模式贴哪个角。 右下角最不挡主体;若右下角有平台 UI 遮挡(点赞/分享按钮),改用左上角。
textSTRING© 2026 kaero水印文字,支持多行(直接回车换行)。
opacityFLOAT0.850.02–1不透明度。参考值: 四角固定 0.75~1.0(要看得清) 居中 / 平铺 0.12~0.22(再高就影响观赏) 浮动 0.25~0.45(太低会被压暗后抹掉)
scaleFLOAT20.01–100水印宽度占画面宽度的百分比。换分辨率不用改,会自动等比换算。 文字水印 15~25 比较舒服;logo 水印 8~18。
marginINT320–600距画面边缘的安全边距(像素)。浮动 / 平铺同样受它约束,图章不会被切掉。 参考:736×992 用 24~40;1080p 用 36~64。
use_textBOOLEANtrue关掉可临时只留 logo,不必删掉文字内容。
use_logoBOOLEANfalse打开才会绘制 logo。 图片来源二选一:面板里「上传 Logo」(存成上面的 logo_file), 或者把 LoadImage 的 IMAGE 接到 logo 输入口(接线优先)。
layoutCOMBOverticallogo 与文字同时存在时的排布:vertical 上下排(logo 在上),horizontal 左右排(logo 在左)。
colorSTRING#FFFFFF文字颜色。支持 #RRGGBB / #RGB / r,g,b / 英文颜色名。
styleCOMBOsoft水印样式预设 —— 一键换整套描边 / 投影参数: soft 描边 + 投影,两者都淡(默认) 明暗背景都读得清,又不像实心描边那样抢画面 plain 两个都关 —— 最不干扰画面,但亮背景上可能糊掉 outline 只留实心描边 —— 画面明暗变化剧烈时才需要 outline_shadow 描边 + 投影都拉满 —— 最清楚,同时也最显眼 manual 不用预设,完全按下面四个控件的数值来 注意:选预设时下面的描边/投影数值会被预设覆盖,要自己调就选 manual。
use_strokeBOOLEANtrue描边开关(仅 style=manual 生效,其余预设会接管)。 描边是沿文字外圈描的一圈边,在明暗变化大的镜头上比字本身还显眼 —— 觉得水印太重,优先降 stroke_opacity,而不是直接关掉。
stroke_widthINT30–24描边粗细(像素)。只在描边打开时生效。画面明暗变化大时给 2~4 就够。
stroke_colorSTRING#000000描边颜色。
stroke_opacityFLOAT0.550–1描边自身的不透明度 —— 觉得描边太重就先降这个,比直接关掉更保留可读性。 1.0 = 实心黑边(最显眼);0.5~0.6 = 柔和一圈(默认);0 = 等于关掉描边。
use_shadowBOOLEANtrue投影开关(仅 style=manual 生效)。 投影把轮廓往外晕开一点:读得清,却不像描边那样在画面上糊一圈硬边。 ⚠ 深色投影在夜景 / 黑幕上是隐形的,纯暗调画面请靠描边(或把 shadow_color 调亮)。
shadow_colorSTRING#000000投影颜色。纯暗调画面里深色投影看不见,可改成 #FFFFFF 之类亮色。
shadow_opacityFLOAT0.400–1投影自身的不透明度。0.3~0.5 是「看得见轮廓但不抢眼」的甜区。
shadow_offsetINT5-80–80投影偏移(像素,向右下为正)。4~8 像自然投影; 0 则变成四周对称的柔和光晕,观感更轻,贴角时也不占边距。
shadow_blurINT80–100投影模糊半径(像素)。越大越柔。6~14 自然;0 = 硬边(等于把字复制一份)。
angleFLOAT0.0-180–180水印整体旋转角度。平铺时配 -20~-30 度最难对齐抹除。
fontCOMBO(内置兜底字体·中文会显示为方块)中文字体。列表按「中文优先」排序(微软雅黑 / 黑体 / 宋体 / 楷体…)。 想用列表外的字体(手写体、商用字体),把下面 font_file 填成绝对路径即可,它会覆盖这里。 注意:黑体(simhei)没有 © 字形,用它会显示成方框 —— 含 © 的文字请用微软雅黑 / 宋体 / 楷体。
font_fileSTRING自定义字体文件绝对路径,例:D:/Fonts/思源黑体.otf 填写且文件存在时,忽略上面的字体下拉框。
float_pathCOMBOdiagonalfloating 模式的活动轨迹: diagonal / horizontal / vertical 匀速来回(三角波,端点不减速) circle 椭圆环路 random 均匀随机跳位,防盗最强但位置会突变
float_cyclesFLOAT1.00.1–200floating 模式:整段视频内来回走完的圈数。 1 = 整段走一个来回(很慢,适合长视频);4~8 = 明显游走但仍看得清。 random 轨迹下含义变为「位置切换次数」,建议设成 2×视频秒数(约每 0.5 秒跳一次)。 单张图片上没有「走」这回事:位置由 seed 定死成一个点,每次跑都一样。
seedINT00–4294967295仅 random 轨迹使用,固定后每次生成的位置一致,便于复现。
start_pctFLOAT0.0000–1水印出现的起始位置(占视频总长的比例)。0 = 片头就出现。 只对多帧序列有意义:单张图片整张算第 0 帧,这一项不影响它。
end_pctFLOAT1.0000–1水印消失的位置(占总长比例)。1 = 一直留到片尾。 例:0.6 → 1.0 表示只在后 40% 出现。 只对多帧序列有意义:单张图片整张算第 0 帧,这一项不影响它。
fade_framesINT00–240出现 / 消失时的淡入淡出帧数,0 = 硬切。 只对多帧序列有意义:单张图片没有淡入淡出可做,这一项不影响它。
tile_gapINT900–1200tile 模式下水印之间的间距(像素)。
title_modeCOMBOoff片头 / 片尾黑幕版权卡片。off = 不加。
title_secondsFLOAT2.00.1–60卡片时长(秒)。帧率取自输入视频,自动换算帧数。
title_textSTRING卡片文字。留空则复用上面的 text。
title_bg_colorSTRING#000000卡片底色。
logo_fileSTRINGlogo 文件名(相对 ComfyUI 的 input 目录)。 在可视化面板里点「上传 Logo」会自动填这一项,通常不用手改; 也可以手动填一个已经放进 input 目录的文件,例:logo/kaero.png 注意:若 logo 输入口接了线,以连线的图为准,这里会被忽略。
text_inoptSTRING可选。从外部接入文字(接上游拼字符串的节点,例如 String Function)。 接了线且内容非空 → **以连线为准**,面板里手填的文字自动让位; 断线、或上游传空字符串 → 回落到面板手填的文字。 典型用法:跑参数对比(侧视图 / 不同分辨率 / 不同 LoRA 强度 / 不同 seed)时, 把这一轮的参数拼成文字烧进画面,回看结果时一眼就知道是哪一套。 注意:它只吃「一段字符串」,节点不会替你填任何值 —— 要显示什么就在上游拼什么。
logooptIMAGE可选。带 alpha 通道的 PNG logo。接上后把 use_logo 打开才会生效。 透明度优先取 logo_mask;没接 mask 就用图片自带的 alpha 通道。
logo_maskoptMASK可选。logo 的透明度遮罩,留空则用 logo 图片自带 alpha。 ComfyUI 的「加载图像」会把 PNG 透明通道单独输出成 MASK,直接接过来即可。

Outputs (1)

NameTypeDescription
videoVIDEO