VideoMark Title(片头片尾版权页)
Two seconds of black and a copyright line, without leaving ComfyUI
- images
- logo
- logo_mask
- audio
- images
- audio
The bit the overlay node can't do
VideoMark Overlay stamps every frame you hand it, which is the wrong tool for a credit card - those live outside the clip. VideoMark Title renders card frames and splices them onto the front and/or back of an IMAGE batch, then returns the longer batch plus an audio track shifted to match. Head, tail, or both; text, logo, or both; about 2 seconds is the usual.
Why not just do it in an editor? Because that's one more turn of the export-review-reimport loop, and because a card you can re-queue is a card you'll actually update: change the year in the copyright line, hit queue, done. If you generate clips in batches - a Wan run, a side-view sweep, a LoRA comparison - a card that lands on every output beats remembering to add it afterwards.
Pack reputation note, since there isn't one: this is a young, low-profile pack with essentially no discussion in the r/StableDiffusion + r/comfyui + r/civitai corpus - a search for "videomark" across two years returns nothing. The watermark talk that does exist mostly runs the other way, people stripping marks rather than adding them. Judge this one on the code.
How it works
seconds × fps gives the frame count (max(1, round(seconds * fps))). A solid card of that many frames is rendered once - background colour, then text and optional logo laid out as a percentage of frame width - and concatenated before your batch, after it, or both. The card frames come out clean: they don't get the watermark. fade_frames fades the card in from pure black and back out, which on a black background reads as your text and logo fading in.
Connect an audio track and pad_audio inserts matching silence - seconds of it at the head, the tail, or both - so picture and sound still line up after the splice. That's the whole node: numpy and Pillow, no model, no dependencies.
The inputs you'll actually touch
fps- the one field that silently ruins renders. The node converts seconds to frames with it, so it has to match the rate you mux at (H3 commonly outputs 24). Get it wrong and your "2 second" card is 1.6 or 2.5.where-head,tail, orboth, plusseconds.text- multiline, so© 2026 you\nAll rights reservedworks; map it to a year you'll actually update. Optionaltext_inlets an upstream string node (Text Concatenate, String Function) take over the card text, and blank upstream falls back to the widget instead of blanking the card.bg_color(default pure black),use_text/use_logo,logo_scaleandtext_scale(both percentages of frame width; 20–30 suits a Chinese end card),text_colorandtext_stroke_width(leave at 0 on black, give it 2–4 if you lighten the background),fade_frames(8 by default, 0 for a hard cut).pad_audio- leave it on. Plus the optionalaudioinput and the same logo trio the Overlay uses:logo_file, or a wiredlogoIMAGE (the wire wins), withlogo_maskoverriding a PNG's own alpha.
Two outputs: images (the extended batch) and audio (the padded track, empty if you connected nothing).
Wiring it up
… video model → decode to IMAGE ──► VideoMark Title ──images──► video combine / SaveVideo
↑ ↑
audio ─┘───────────────────────┘
Put it after the Overlay, or you'll watermark your own copyright card. And note the node isn't an output node: if nothing downstream consumes images, the graph never executes it. Add a SaveImage or a combine node, or you'll conclude the node is broken.
Install
# ComfyUI Manager: search "comfyui-videomark"
cd ComfyUI/custom_nodes
git clone https://github.com/kaerozhi/comfyui-videomark.git
Or comfy node install comfyui-videomark. Nothing to pip install - this pack adds exactly zero to your Python environment. Restart ComfyUI so the built-in panel loads.
Where people get burned
Audio that drifts by exactly your card length. That's pad_audio off. A 2-second card with an unpadded track puts the whole soundtrack 2 seconds early against picture, and everything downstream is wrong. It's on by default; leave it.
A card holder with no card. use_logo defaults to off, so wiring a logo image changes nothing until you flip it - same trap as the Overlay.
黑体 (simhei) has no © glyph and renders a box where the symbol should be. Use 微软雅黑 / 宋体 / 楷体, or set font_file to an absolute path. If the font dropdown offers only the built-in fallback, font_file is your only option.
A card that looks like a black-to-white wipe. The fade starts from black, not from transparent - fine on purpose with a non-black bg_color, jarring by accident.
A card that's the wrong length after export. Almost always a mux rate that differs from fps, not the node.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| fps | FLOAT | 241–240 | 视频帧率,用来把「秒数」换算成帧数。 必须和最终合成视频的帧率一致,否则时长会不对(H3 常出 24fps)。 |
| where | COMBO | head | head 只在片头加,tail 只在片尾加,both 两头都加(各占一份 seconds)。 |
| seconds | FLOAT | 2.00.1–60 | 卡片时长(秒)。片尾版权声明 2 秒左右比较合适。 |
| text | STRING | © 2026 kaero 版权所有 · 禁止转载 | 卡片文字,支持多行。 |
| use_text | BOOLEAN | true | 关掉则只显示 logo。 |
| bg_color | STRING | #000000 | 卡片底色,默认纯黑。 |
| use_logo | BOOLEAN | false | 打开才会绘制 logo。图片来源同 Overlay:面板上传,或把 IMAGE 接到 logo 口。 |
| layout | COMBO | vertical | logo 与文字同时存在时的排布:vertical 上下排(logo 在上),horizontal 左右排(logo 在左)。 |
| logo_scale | FLOAT | 30.01–100 | logo 宽度占画面宽度的百分比。 |
| text_scale | FLOAT | 24.01–100 | 文字宽度占画面宽度的百分比。中文片尾字幕 20~30 比较大气。 |
| text_color | STRING | #FFFFFF | 卡片文字颜色。 |
| text_stroke_width | INT | 00–24 | 文字描边粗细。底色不是纯黑时建议给 2~4 保证可读性。 |
| text_stroke_color | STRING | #000000 | 文字描边颜色。 |
| font | COMBO | (内置兜底字体·中文会显示为方块) | 中文字体。列表按「中文优先」排序(微软雅黑 / 黑体 / 宋体 / 楷体…)。 想用列表外的字体(手写体、商用字体),把下面 font_file 填成绝对路径即可,它会覆盖这里。 注意:黑体(simhei)没有 © 字形,用它会显示成方框 —— 含 © 的文字请用微软雅黑 / 宋体 / 楷体。 |
| font_file | STRING | 自定义字体文件绝对路径,例:D:/Fonts/思源黑体.otf 填写且文件存在时,忽略上面的字体下拉框。 | |
| fade_frames | INT | 80–240 | 卡片淡入淡出帧数。黑底卡片下视觉上就是文字/logo 渐显渐隐;0 = 硬切。 |
| pad_audio | BOOLEAN | true | 给音频补等长静音,保证加了片头后音画不错位。 接音乐轨时务必保持打开。 |
| logo_file | STRING | logo 文件名(相对 ComfyUI 的 input 目录)。 在可视化面板里点「上传 Logo」会自动填这一项,通常不用手改; 也可以手动填一个已经放进 input 目录的文件,例:logo/kaero.png 注意:若 logo 输入口接了线,以连线的图为准,这里会被忽略。 | |
| text_inopt | STRING | 可选。从外部接入文字(接上游拼字符串的节点,例如 String Function)。 接了线且内容非空 → **以连线为准**,面板里手填的文字自动让位; 断线、或上游传空字符串 → 回落到面板手填的文字。 典型用法:跑参数对比(侧视图 / 不同分辨率 / 不同 LoRA 强度 / 不同 seed)时, 把这一轮的参数拼成文字烧进画面,回看结果时一眼就知道是哪一套。 注意:它只吃「一段字符串」,节点不会替你填任何值 —— 要显示什么就在上游拼什么。 | |
| logoopt | IMAGE | 可选。带 alpha 通道的 PNG logo。接上后把 use_logo 打开才会生效。 透明度优先取 logo_mask;没接 mask 就用图片自带的 alpha 通道。 | |
| logo_maskopt | MASK | 可选。logo 的透明度遮罩,留空则用 logo 图片自带 alpha。 ComfyUI 的「加载图像」会把 PNG 透明通道单独输出成 MASK,直接接过来即可。 | |
| audioopt | AUDIO | 可选。视频音轨。接进来才会做静音补齐,并从这个端口原样输出。 |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |