ReShot Pose Video
Skeleton clips that meet the model's spec, plus the keypoints as JSON
- video
- pose_video
- pose_frames
- fps
- keypoints_json
ReShot Pose Video is the video half of the pose pair: hand it a reference clip, get back an OpenPose-style skeleton video that already satisfies the frame-rate and frame-size rules of Seedance, MiniMax H3 or Wan, plus the same skeleton frames as an IMAGE batch and a JSON dump of every keypoint.
Use it when the reference is a dance, a scrap, a gymnastics move - anything where the limbs are the entire point and you don't care whether your character stands where the original did. The skeleton is a promise about the body and nothing else, which is why the approach is contested: motion-transfer research is drifting away from the stick figure precisely because DWPose deletes the depth and contact information that decides whether a character occupies the same space as the performance. Wan shows both halves of that: VACE has always taken DWPose or OpenPose control videos as its main conditioning, while the newer motion-transfer models on the same base threw the skeleton out. For a ControlNet or a reference-video input, the skeleton is the language those models speak. Limbs must be exact and staging doesn't matter: this node. Camera and room are the point: ReShot Depth Video.
What the preset handles
target picks the destination model's rules: seedance (24 fps, ×16), h3 (24 fps, ×32 - H3 clips run 4–15 s at 24 fps), wan (16 fps, ×16) or none (keep the fps, make dimensions even). Frames are resampled by timestamp, so 30 fps really becomes 24, and the frame is center-cropped rather than padded - a black border reads as something far away. fps is never raised, and audio is dropped.
The default target here is h3, and the README's favourite setting goes with it: max_side: 320. H3 reads a reference video better when it's small - the documented case is a depth clip, where a full-size silhouette starts dragging the generated character's face shape toward the reference's, and for a skeleton there's no reason to hand over more pixels than the stick figure needs. Small reference, big performance.
Inputs and outputs
Same five pose controls as the map node (full detail on the ReShot Pose Map page): hands (on), face (off - the face is what this pipeline exists to discard), smooth (on - raw estimates jitter, and the video model reads jitter as motion), detect_every (3; the tooltip puts 1 at about 2.5× slower on CPU), and max_side.
Four outputs, and the interesting one is the fourth:
pose_video- the VIDEO, for a reference-video input or Save Video.pose_frames- the same frames as an IMAGE batch, for a ControlNet'scontrol_videoinput or a preview.fps- FLOAT, the output frame rate after the preset, for Create Video if you're rebuilding the clip yourself.keypoints_json- STRING. Every skeleton in the pack'sreshot-pose/1format: per frame, per person, a stableid, 134[x, y]points and scores. A cleaned, tracked, smoothed motion-capture file - save it with a text node or feed your own tooling.
Install
ComfyUI Manager → ComfyUI-ReShot → Install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/maosika-ai/ComfyUI-ReShot
python -m pip install -r ComfyUI-ReShot/requirements.txt
The pose nodes need onnxruntime, pulled in by that requirements line - the CPU build, which works everywhere and is slow. On NVIDIA hardware, python -m pip install onnxruntime-gpu into the same Python ComfyUI runs on. First pose run downloads roughly 340 MB of weights; the depth half wants another 111 MB. Behind the Great Firewall, set export HF_ENDPOINT=https://hf-mirror.com before starting ComfyUI or both downloads hang.
Common issues
ReShot Pose Videomissing but the map node is there - ComfyUI too old for the VIDEO type. Update, or use the map node with Get Video Components.- Black frames in the output - the detector found nobody. That's a console warning and a black video, and a black control video tells the generator nothing.
- The video model produced a grey or skeleton-looking film - the same trap as the depth path: in your prompt for H3, state that only the actions and timing transfer and the look does not. Say what happens in the clip in words.
- Slow on a long clip - DWPose is not cheap.
detect_everyat 3 or higher and a GPUonnxruntimeare the two levers; the demo measurement ran 289 frames tracking people at N=3 with 80% of joints within 2 px of the every-frame result. - Output a few dozen pixels smaller than the source - the preset crop, on both axes, centered.
If you're paying per call for a reference-video API, run this once with target: h3, max_side: 320 and eye the pose_frames before you spend anything - a skeleton clip is very easy to judge by eye.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | From Load Video (or any node that outputs VIDEO). | |
| target | COMBO | h3 | Preset: seedance = 24 fps, x16; h3 = 24 fps, x32; wan = 16 fps, x16; none = keep fps, even dims. |
| handsopt | BOOLEAN | true | Draw the 21-point hands (grips and gestures). |
| faceopt | BOOLEAN | false | Draw the 68 face points. Off by default: the face shape is what ReShot throws away. |
| smoothopt | BOOLEAN | true | Track people across frames, hold joints that dip briefly, One-Euro smooth. Off = raw per-frame output. |
| detect_everyopt | INT | 31–30 | Run the person detector every N frames and follow the skeletons in between (cuts always re-detect). 1 = every frame, ~2.5x slower on CPU. |
| max_sideopt | INT | 00–4096 | Cap the output's longer side (0 = source size). e.g. 320 for MiniMax H3 reference videos. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| pose_video | VIDEO | — |
| pose_frames | IMAGE | — |
| fps | FLOAT | — |
| keypoints_json | STRING | — |