Nodes/ComfyUI-BytePlus-ModelArk/BytePlus Video Smoothness Enhance
ComfyUI Node

BytePlus Video Smoothness Enhance

Seedance clips stutter? This node was built for exactly that

By byteplus-sa·Created 8 days ago·Updated about 8 hours ago· 3
BytePlus Video Smoothness Enhance
  • video
  • VIDEO
  • comparison
  • inserted_frame_count
  • duplicate_frame_count
  • response
◄periodic_stutter▾►
◄duplicate_framesremove►
◄video_url►
◄comparisontrue►

A timing problem, not a resolution problem

Generated video has a specific failure that upscalers can't touch: the motion rhythm jumps. A few frames where the subject should be mid-step just aren't there, so the clip hitches. Separately, some clips come back with consecutive identical frames - the encoder padded them and the result reads as frozen for a beat.

The author's own description says this node was made for Seedance videos with occasional stutter, and that's the honest use case. It also applies to low-frame-rate footage, re-encoded video, and screen or game recordings. Note what it does not do: it doesn't change resolution at all. vCube (the other MediaKit node in this pack) is the one that changes pixel count. This one only touches timing.

This is the honest counterweight to a lesson in the upscaling KB: apply a good per-frame filter to video and fine texture jitters, because nothing forces consecutive frames to agree. Here the cloud pass is explicitly temporal - it looks across frames to decide what's missing.

The two switches

periodic_stutter - repair generates in-between frames where the rhythm jumps; detect only counts them and leaves the video alone. Under repair you get two nested options, and one of them is the setting worth understanding:

  • align_source_fps (default off) keeps the source frame rate, frame count and duration - for every frame it inserts, it removes a low-motion frame. Turn it on when the clip has to stay the same length: concatenating with other clips, muxing against audio, hitting a fixed timeline. Leave it off when you just want the smoothest result; the frame rate may rise.
  • insert_frame_indices - your manual override. Zero-based frame numbers, comma-separated: 80 inserts a frame between frames 80 and 81. These are always inserted, even when MediaKit's own quality check skips the automatic repair, which makes this the tool for a hitch you can see and the detector can't.

duplicate_frames - remove (default) or detect only. It runs after the stutter repair, on that repair's output, so you're cleaning the already-repaired clip rather than the original.

What it does and what you get back

Connect a video and it uploads to Comfy.org storage to get a link MediaKit will accept, submits the task, waits, and downloads the result right away - MediaKit links expire after 24 hours, so the node doesn't dawdle. Or pass a public link through the advanced video_url and skip the upload.

The comparison output is built locally, on the repaired clip's timeline - source left, repaired right, playing the same moment - so you can see whether the fix is real instead of squinting at two files.

The behaviour worth knowing: if MediaKit repairs nothing, or its quality check rejects the repair, the source passes straight through, no comparison is made, and the task is billed as detection only. Downstream nodes that use comparison are skipped rather than fed a None, so nothing explodes.

Outputs: VIDEO (repaired, or the source), comparison, inserted_frame_count, duplicate_frame_count, and response with the raw task JSON. Keep in mind both counts are detection counts - a positive inserted_frame_count can sit next to a video that wasn't actually repaired.

Install

ComfyUI Manager → search BytePlus ModelArk (ComfyUI BytePlus ModelArk & AI MediaKit), or:

cd ComfyUI/custom_nodes
git clone https://github.com/byteplus-sa/ComfyUI-BytePlus-ModelArk
pip install -r ComfyUI-BytePlus-ModelArk/requirements.txt

Three dependencies (byteplus-python-sdk-v2[ark], httpx, sniffio), installed with the Python ComfyUI runs, then restart. ComfyUI 0.31.0 or newer. Then Settings → BytePlus with the AI MediaKit key - this node wants BYTEPLUS_VOD_MEDIAKIT_API_KEY, not a ModelArk key, and MediaKit runs in ap-southeast-1 only. Wrong-product key is the most common Invalid API Key here.

Common issues

  • Length and size caps. Up to 4K, and up to 35 seconds while a repair is on. Detection alone has no length limit - which is the useful trick: run detect only on anything, see what the detector finds, then decide whether the repair is worth paying for. The 35 s cap covers Seedance 2.5's 30-second maximum comfortably, and both limits are checked before upload, so an oversized clip fails fast with a message instead of burning a task.
  • "It didn't do anything." Check inserted_frame_count. Zero, with a passthrough video, is a legitimate outcome: nothing detected, or the quality check declined to repair. That's a pass, not a bug.
  • Upload friction. A connected video goes to Comfy.org storage first and needs a Comfy.org login; if that's the blocker, use video_url with a public link.
  • Where's the file? This node saves nothing. Wire VIDEO into Save Video.
CategoryBytePlus ModelArk/MediaKit

Inputs (5)

NameTypeDefaultDescription
periodic_stutterCOMBOPeriodic stutter: sudden jumps in the motion rhythm. 'repair' generates in-between frames; 'detect only' counts them without changing the video.
duplicate_framesCOMBOremoveConsecutive identical frames. 'remove' drops them; 'detect only' counts them. Runs after the stutter repair, on its result.
videooptVIDEOVideo to repair: up to 4K, and up to 35 s while a repair is on (detect only has no length limit). Uploaded to Comfy.org storage first (needs a Comfy.org login); or set video_url instead.
video_urloptSTRINGPublic http(s) link to the source video (mp4, avi or mov), instead of connecting a video. Nothing is uploaded to Comfy.org.
comparisonoptBOOLEANtrueAlso build a side-by-side video: the source on the left, the repaired video on the right, in sync.

Outputs (5)

NameTypeDescription
VIDEOVIDEOThe repaired video; the source video when nothing was repaired.
comparisonVIDEOSource (left) and repaired video (right) side by side. Nodes using it are skipped when nothing was repaired or comparison is off.
inserted_frame_countINTFrames the detector found missing for periodic stutter (not counting insert_frame_indices). A detection count: the repair may have been skipped.
duplicate_frame_countINTFrames detected as repeats of the frame before.
responseSTRINGThe MediaKit task as JSON.