Topaz 视频高清修复
Rent Topaz for one clip instead of paying for the subscription
- input_video
- api_config
- video
- video_url
- task_id
- response
Topaz is the upscaler everyone benchmarks against and nobody wants to pay for. It's the paid default in every "what do I use for video upscaling" thread - 223 mentions in the first half of 2026, more than SUPIR and ESRGAN combined - and the loudest replies are people describing the open alternative that let them cancel the subscription. So a node that rents the thing per clip, from inside ComfyUI, is a much more interesting proposition than it first looks.
Topaz_Video_Upscale does exactly that. No Topaz install, no license, no GPU work on your side: you give it a video, it goes to the reseller endpoint, and a restored MP4 comes back as a ComfyUI VIDEO.
How it works
The node posts to the pack's video endpoint under the model id Topaz-Upscale-LowPirce - yes, spelled with the typo, because that's the string the endpoint documents and the pack ships it verbatim. Your source goes in one of two ways, and the node wants exactly one of them: a local input_video it uploads for you, or a public MP4 link in video_url. Give it both and it errors rather than picking a winner.
From there it's the standard job dance this pack does everywhere: submit, poll until the job reaches a terminal state with a progress bar ticking, download the result, then hand it back. The video output is the real thing - wire it into SaveVideo or any video node downstream. video_url is the API's temporary link, task_id is the remote job id, response is the raw JSON if you're logging.
The three inputs that matter
resolution is the output pixel budget: 720p, 1080p, 2K, 4K, defaulting to 1080p. The tooltip is worth trusting here - it preserves the source aspect ratio rather than stretching, so a 1:1 clip stays 1:1 and gets more pixels, not more width.
model is the restoration tier, sent as metadata.quality: Ultra, Max (default), High, Medium, Low. This is not a resolution ladder - it's how hard the model works. Low through Ultra all produce an upscaled clip; they differ in how much detail the restorer invents and what it costs you.
skip_error returns a placeholder video instead of aborting your workflow. Set it on when this node is one step in a longer chain, and leave it off when you'd rather fail loudly.
There's no prompt and no duration field, which is the giveaway that this stage is not generative. You're not describing anything. You're restoring footage.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/ComfyUI_Seedance.git
cd ..
python -m pip install -r custom_nodes/ComfyUI_Seedance/requirements.txt
Or in ComfyUI Manager, search ComfyUI Seedance and restart. The requirements file is requests>=2.28 - that's the entire dependency list, and there's no Topaz binary hiding anywhere in the pack because none is needed.
For the key, either add a Seedance API Config node and connect its api_config output (the input is optional on this node, but the key isn't), or:
export SEEDANCE_API_KEY=your_key_here
or drop SEEDANCE_API_KEY= and SEEDANCE_BASE_URL= into config/.env inside the plugin folder, which is gitignored and the tidiest option for a machine you use all the time.
Where people actually get stuck
The 50 MB upload cap. A local input_video must be an MP4 - the node checks the file's ftyp header, so a renamed .webm won't sneak through - and it must be under 50 MB. That's not a lot of 4K footage. Trim the clip, or host it and use video_url. This is the single most common "why won't it run" on this node.
Only one source. input_video and video_url are mutually exclusive by design. If you fill the URL field as a leftover and also connect a local video, validation fails. Clear the string.
Result URLs expire. The node downloads the file into your ComfyUI output folder for you, so your local copy is safe - but if you've been saving video_url values as your archive, they'll be dead in a while.
Cost. Ultra at 4K on a ten-second clip is the most expensive click in the pack. Do your pipeline testing at 720p/Low, confirm the result suits your footage, and only then push the setting up. And note the model id contains "LowPrice" (misspelled, but there it is) - that's the point of this shop: a cheaper route into a paid service, priced per job instead of per month.
Slow downloads. If the API reports success and the node sits at the end of its progress bar, check for a stale HTTP_PROXY or HTTPS_PROXY in your environment. The pack tries a direct session and then system curl, both of which a phantom proxy can defeat. SEEDANCE_CURL will point it at a specific binary if yours isn't on PATH.
One honest caveat: this is a wrapper around a third-party service reached through a reseller. Your clip leaves your machine, the upstream moderation applies, and quality is whatever the service behind the label delivers that week. It's a good deal for a handful of clips. If you're restoring video every single day, the open alternatives in the KB's upscaling coverage are worth pricing against it.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| video_url | STRING | Public MP4 URL. Leave empty when connecting input_video. | 公网 MP4 直链;连接 input_video 时留空。 | |
| resolution | COMBO | 1080p | Output pixel budget; the source aspect ratio is preserved. | 输出总像素档位,保持源视频宽高比,不拉伸。 |
| model | COMBO | Max | Restoration model, sent as metadata.quality. | 修复模型,作为 metadata.quality 提交;默认 Max。 |
| input_videoopt | VIDEO | One local MP4, uploaded automatically. Use either this input or video_url. | 单条本地 MP4,自动上传;与 video_url 二选一。 | |
| api_configopt | SEEDANCE_CONFIG | Connect Seedance API Config; otherwise SEEDANCE_API_KEY is used. | |
| skip_erroropt | BOOLEAN | false | Return an error placeholder without stopping other tasks. | 失败时返回占位错误视频,不中断其他任务。 |
| seedopt | INT | 00–18446744073709550000 | ComfyUI cache seed. Fixed reuses the cached result while all other inputs stay unchanged; randomize/increment/decrement starts a new execution. This value is not sent to models without documented seed support. | ComfyUI 缓存种子;Fixed 在其他输入不变时复用缓存,随机、递增或递减会触发新任务。未声明支持 seed 的模型不会收到此参数。 |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_url | STRING | — |
| task_id | STRING | — |
| response | STRING | — |