{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreibzekufydukgt6dckg4mtfj7rzq322k2kqzhqqgi35ebmttm3kzvi",
    "uri": "at://did:plc:pgryn3ephfd2xgft23qokfzt/app.bsky.feed.post/3mlfa62fglpi2"
  },
  "path": "/t/1st-movie-clip/175306#post_20",
  "publishedAt": "2026-05-09T01:45:08.000Z",
  "site": "https://discuss.huggingface.co",
  "tags": [
    "Frame skipping issues #150 - Gourieff/ComfyUI-ReActor",
    "Face Tracking when position changes throughout video #130 - Gourieff/ComfyUI-ReActor",
    "ComfyUI-VideoHelperSuite README",
    "VHS_LoadVideo docs",
    "ComfyUI-VideoHelperSuite detailed guide",
    "“select_every_nth” and “skip_first_frames” mismatch #497",
    "Wan 2.2 - Best practices to continue videos",
    "RIFE + MetaBatch drops one frame per batch #625"
  ],
  "textContent": "Hmm… Although this seems to be a known issue that occasionally occurs in practice, isolating the problem is essential to finding a solution:\n\n* * *\n\n# What I think is happening\n\nThis no longer looks like a simple “wrong FPS” problem.\n\nIt looks much more like a **frame-sequence integrity** problem, with **ReActor face-tracking/detection weakness** layered on top.\n\nThe clearest current match is this ReActor discussion:\n\n  * Frame skipping issues #150 - Gourieff/ComfyUI-ReActor\n\n\n\nThat thread is very close to your symptom:\n\n  * face swap can look fine at first\n  * then frames get skipped/cut\n  * especially when the face turns or becomes harder to detect\n\n\n\nAnd the practical advice there is important:\n\n> split the video into frames, do face swap as a batch image process, then reconstruct the video.\n\nThat is not just theory. It is the most relevant “similar case → recommended workflow change” I found.\n\nThere is also this feature request:\n\n  * Face Tracking when position changes throughout video #130 - Gourieff/ComfyUI-ReActor\n\n\n\nThat matters because it tells you directly that **stable face-lock over time is still a weak point** in this toolchain.\n\n* * *\n\n# Why changing FPS does not fix the jump\n\nThis part actually makes sense once you separate **frame loading** from **video playback**.\n\nAccording to the VideoHelperSuite docs:\n\n  * `force_rate` can discard or duplicate frames\n  * `frame_load_cap` sets the maximum number of frames returned\n  * `skip_first_frames` offsets the start\n  * `select_every_nth` intentionally skips frames\n  * `Video Combine.frame_rate` only changes how many input frames are shown per second\n\n\n\nRelevant sources:\n\n  * ComfyUI-VideoHelperSuite README\n  * VHS_LoadVideo docs\n  * ComfyUI-VideoHelperSuite detailed guide\n\n\n\nSo if the sequence is already damaged **before** `Video Combine`, then changing output FPS will only:\n\n  * speed it up\n  * slow it down\n  * shorten it\n  * lengthen it\n\n\n\nIt will **not** recreate missing motion continuity.\n\nThat is why your tests feel maddening:\n\n  * the face swap can still look correct\n  * but the motion still jumps\n  * and FPS only changes playback speed\n\n\n\nThat behavior is exactly what the docs would predict.\n\n* * *\n\n# The two most likely causes in your case\n\n## Cause 1 — ReActor is not handling all frames equally well\n\nThis is most likely when:\n\n  * the face turns\n  * the face gets smaller\n  * the face blurs\n  * the face shifts position\n  * the face becomes partially occluded\n\n\n\nThat is the closest match to the ReActor frame-skipping discussion.\n\n## Cause 2 — the workflow is not feeding the exact frame batch you think it is\n\nThis is most likely when:\n\n  * `frame_load_cap` is too low\n  * `skip_first_frames` is not what you think\n  * `select_every_nth` is not `1`\n  * `force_rate` is changing cadence\n  * preview and output do not match\n\n\n\nThis is not hypothetical. There is a current VideoHelperSuite issue specifically about preview/output mismatch when `select_every_nth` and `skip_first_frames` are used:\n\n  * “select_every_nth” and “skip_first_frames” mismatch #497\n\n\n\nSo you can absolutely end up debugging the wrong segment if the frame-loading settings are not clean.\n\n* * *\n\n# The core rule for debugging\n\nTreat the workflow as **three separate jobs** :\n\n  1. **Load the correct frames**\n  2. **Swap the faces on those frames**\n  3. **Play those frames back as video**\n\n\n\nRight now, job **3** is probably not the main problem.\n\nJobs **1** and **2** are.\n\nThat is why the best next step is not “try more FPS values.”\nIt is “prove the frame sequence is intact.”\n\n* * *\n\n# The anchor number you should keep in mind\n\nA clip that is:\n\n  * **6 seconds**\n  * at **12 FPS**\n\n\n\nshould contain about:\n\n  * **72 frames**\n\n\n\nThat is the number to keep checking against.\n\nYour main question for every test is:\n\n> did roughly 72 frames enter the graph, and did the same number survive?\n\n* * *\n\n# Revised workflow plan\n\nDo these **in order**.\n\nDo not jump ahead.\n\nDo not change extra settings while testing.\n\n* * *\n\n## Test 1 — Full-clip truth test\n\n### Goal\n\nProve whether the simplest path\n\n`Load Video -> ReActor -> Video Combine`\n\ncan preserve the full clip cleanly.\n\n### Use this exact graph\n\n  * Load reference image\n  * Load video\n  * ReActor\n  * Video Combine\n\n\n\nFor this test:\n\n  * **No RIFE**\n  * **No MetaBatch**\n  * **No extra repair nodes**\n  * **No extra helpers**\n\n\n\nKeep it as plain as possible.\n\n### Exact settings\n\nNode | Setting | Value to test first | Why\n---|---|---|---\n`Load Video` | `force_rate` | `0` **or** `12` | `0` keeps source cadence; `12` is okay if you want to lock to source. Avoid forcing some other rate while debugging.\n`Load Video` | `frame_load_cap` | `0` **or** `72+` | You do not want to accidentally cap a 72-frame clip below full length.\n`Load Video` | `skip_first_frames` | `0` | No offset. Start at the beginning.\n`Load Video` | `select_every_nth` | `1` | This means “use every frame.”\n`Load Video` | `Advanced Preview` | `ON` | VHS docs say Advanced Preview reflects settings like `skip_first_frames` and `frame_load_cap`.\n`ReActor` | face-swap settings | leave unchanged | First prove sequence stability before retuning the swap.\n`Video Combine` | `frame_rate` | `12` | Match the source/loaded sequence.\n\n### What to look for\n\nAfter running Test 1, check:\n\n  * Does the **Load Video preview** look like the full expected clip?\n  * Does the output feel like the full 6 seconds?\n  * Or does it already feel like only part of the motion survived?\n\n\n\n### How to interpret it\n\n**If Test 1 is already jumpy:**\n\n  * the problem is already present in the basic path\n  * so it is not mainly RIFE\n  * and it is not mainly final playback FPS\n\n\n\nThat points to:\n\n  * face detection/tracking weakness\n  * frame-load mismatch\n  * or both\n\n\n\n**If Test 1 is smooth:**\n\n  * your simplest path is okay\n  * later helpers or chunk boundaries are the more likely problem\n\n\n\n* * *\n\n## Test 2 — Tail-only chunk test\n\n### Goal\n\nFind out whether the workflow is **length-sensitive**.\n\nThis is the most useful test for your use case, because you only need to repair the broken tail of the clip anyway.\n\nThe VideoHelperSuite docs explicitly support processing videos in parts using:\n\n  * `frame_load_cap`\n  * `skip_first_frames`\n\n\n\nRelevant source:\n\n  * ComfyUI-VideoHelperSuite README\n\n\n\n### Keep the graph the same\n\nStill use only:\n\n  * Load reference image\n  * Load video\n  * ReActor\n  * Video Combine\n\n\n\nStill:\n\n  * **No RIFE**\n  * **No MetaBatch**\n\n\n\n### Test 2A — Last 24 frames\n\nNode | Setting | Value\n---|---|---\n`Load Video` | `force_rate` | `0` **or** `12`\n`Load Video` | `frame_load_cap` | `24`\n`Load Video` | `skip_first_frames` | `48`\n`Load Video` | `select_every_nth` | `1`\n`Load Video` | `Advanced Preview` | `ON`\n`ReActor` | face-swap settings | unchanged\n`Video Combine` | `frame_rate` | `12`\n\n### Test 2B — Last 36 frames\n\nNode | Setting | Value\n---|---|---\n`Load Video` | `force_rate` | `0` **or** `12`\n`Load Video` | `frame_load_cap` | `36`\n`Load Video` | `skip_first_frames` | `36`\n`Load Video` | `select_every_nth` | `1`\n`Load Video` | `Advanced Preview` | `ON`\n`ReActor` | face-swap settings | unchanged\n`Video Combine` | `frame_rate` | `12`\n\n### Test 2C — Last 48 frames\n\nNode | Setting | Value\n---|---|---\n`Load Video` | `force_rate` | `0` **or** `12`\n`Load Video` | `frame_load_cap` | `48`\n`Load Video` | `skip_first_frames` | `24`\n`Load Video` | `select_every_nth` | `1`\n`Load Video` | `Advanced Preview` | `ON`\n`ReActor` | face-swap settings | unchanged\n`Video Combine` | `frame_rate` | `12`\n\n### What you are trying to learn\n\nYou are asking:\n\n  * Can ReActor handle the last **24** frames cleanly?\n  * Can it handle the last **36** frames?\n  * Does it begin failing again at **48**?\n\n\n\n### How to interpret it\n\n**If 24 works, 36 works, and 48 fails:**\n\n  * the workflow is probably **length-sensitive**\n  * not fundamentally broken\n\n\n\n**If even 24 fails:**\n\n  * the problem is more likely tied to:\n    * face detection in that part of the clip\n    * preview/output mismatch\n    * or remaining runtime fragility\n\n\n\nThis test is extremely useful because it turns a vague “sometimes it jumps” problem into a measurable one.\n\n* * *\n\n## Test 3 — Frame-batch repair workflow\n\n### Goal\n\nStop hiding the real unit of work.\n\nThis is the biggest workflow improvement I would consider if Test 2 still shows instability.\n\nThe most direct ReActor advice for frame skipping is:\n\n> split the video into frames, do face swap as a batch image process, then reconstruct the video\n\nSource:\n\n  * Frame skipping issues #150 - Gourieff/ComfyUI-ReActor\n\n\n\n### Why this helps\n\nBecause it makes everything explicit:\n\n  * you can inspect the actual frames\n  * you can see exactly where the swap starts failing\n  * you can rerun only a bad chunk\n  * you remove a lot of uncertainty about whether the loader/combine changed the sequence\n\n\n\n### Revised graph\n\n  * Load reference image\n  * Load video\n  * ReActor on the image batch\n  * Save the swapped frames\n  * Rebuild / combine video\n  * Only later, optionally add interpolation\n\n\n\n### Exact settings for the first frame-batch test\n\nUse the safest tail chunk first:\n\nNode | Setting | Value\n---|---|---\n`Load Video` | `force_rate` | `0` **or** `12`\n`Load Video` | `frame_load_cap` | `24`\n`Load Video` | `skip_first_frames` | `48`\n`Load Video` | `select_every_nth` | `1`\n`Load Video` | `Advanced Preview` | `ON`\n`ReActor` | face-swap settings | unchanged\n`Save Image` | output | save the swapped frame batch\n`Video Combine` | `frame_rate` | `12`\n\n### What to do\n\n  1. Process the last **24** frames.\n  2. Save the swapped images.\n  3. Inspect them as images.\n  4. Check:\n     * are all frames present?\n     * do they look sequential?\n     * does the face break at one specific frame?\n     * does the frame count look right?\n  5. If that is good, try **36** , then **48**.\n\n\n\n### Why this is so useful\n\nThis tells you directly:\n\n  * whether the loader is giving the right frames\n  * whether ReActor is breaking on specific frames\n  * whether the jump is already present before final video combine\n\n\n\nThat is why this workflow is often more reliable than direct video-in/video-out when temporal instability appears.\n\n* * *\n\n# After the three tests\n\n## Add overlap instead of a hard join\n\nOnce one workflow is stable, process **more frames than the absolute minimum** you think you need.\n\nExample:\n\n  * if you think you only need the last **12** frames repaired,\n  * actually process the last **24–36** frames,\n  * then keep the cleanest part in the final assembly if needed\n\n\n\nWhy:\ncontinuation discussions around Wan/VACE say that **overlap** helps preserve motion continuity better than a hard boundary, with one reply suggesting about **15 frames** depending on motion.\n\nRelevant discussion:\n\n  * Wan 2.2 - Best practices to continue videos\n\n\n\nFor your workflow, the lesson is simple:\n\n  * **hard joins are fragile**\n  * **overlap is safer**\n\n\n\n## Reintroduce RIFE only after the raw sequence is stable\n\nDo **not** use RIFE as the first rescue tool while the raw swapped sequence is still unstable.\n\nThere is a current VideoHelperSuite issue showing that **RIFE + MetaBatch** can lose one frame per batch, shortening the output and causing desync, and that the correct fix there is **1-frame overlap between batches**.\n\nSource:\n\n  * RIFE + MetaBatch drops one frame per batch #625\n\n\n\nEven if you are not using MetaBatch right now, the lesson still matters:\n\n  * interpolation is another temporal process\n  * so only add it **after** the raw swapped frames are already stable\n\n\n\nThe order should be:\n\n  1. stable raw swapped frames\n  2. stable raw swapped clip\n  3. then interpolation for polish\n\n\n\n* * *\n\n# One-page copy-paste checklist\n\n\n    TEST 1 — FULL CLIP\n    Source clip: 6 sec @ 12 FPS (~72 frames)\n\n    Load Video:\n    - force_rate = 0 or 12\n    - frame_load_cap = 0 or >=72\n    - skip_first_frames = 0\n    - select_every_nth = 1\n    - Advanced Preview = ON\n\n    ReActor:\n    - leave current face-swap settings unchanged\n\n    Video Combine:\n    - frame_rate = 12\n\n    Goal:\n    - prove full-sequence stability\n\n\n\n    TEST 2A — LAST 24 FRAMES\n\n    Load Video:\n    - force_rate = 0 or 12\n    - frame_load_cap = 24\n    - skip_first_frames = 48\n    - select_every_nth = 1\n    - Advanced Preview = ON\n\n    ReActor:\n    - leave current face-swap settings unchanged\n\n    Video Combine:\n    - frame_rate = 12\n\n    Goal:\n    - test short tail stability\n\n\n\n    TEST 2B — LAST 36 FRAMES\n\n    Load Video:\n    - force_rate = 0 or 12\n    - frame_load_cap = 36\n    - skip_first_frames = 36\n    - select_every_nth = 1\n    - Advanced Preview = ON\n\n    ReActor:\n    - leave current face-swap settings unchanged\n\n    Video Combine:\n    - frame_rate = 12\n\n    Goal:\n    - test medium tail stability\n\n\n\n    TEST 2C — LAST 48 FRAMES\n\n    Load Video:\n    - force_rate = 0 or 12\n    - frame_load_cap = 48\n    - skip_first_frames = 24\n    - select_every_nth = 1\n    - Advanced Preview = ON\n\n    ReActor:\n    - leave current face-swap settings unchanged\n\n    Video Combine:\n    - frame_rate = 12\n\n    Goal:\n    - test longer tail stability\n\n\n\n    TEST 3 — FRAME-BATCH VERSION\n\n    Load Video:\n    - force_rate = 0 or 12\n    - frame_load_cap = 24 (start here)\n    - skip_first_frames = 48\n    - select_every_nth = 1\n    - Advanced Preview = ON\n\n    ReActor:\n    - leave current face-swap settings unchanged\n\n    Save swapped frames:\n    - inspect as individual images\n\n    Video Combine:\n    - frame_rate = 12\n\n    Goal:\n    - inspect exact frames and remove video-sequence ambiguity\n\n\n* * *\n\n# Final recommendation\n\nIf this were my setup, I would do this in order:\n\n  1. Run **Test 1** exactly as written\n  2. Run **Test 2** in this order:\n     * last 24 frames\n     * last 36 frames\n     * last 48 frames\n  3. If direct video swap still jumps, move immediately to **Test 3**\n  4. Once one path is stable, add **overlap**\n  5. Only then add **RIFE**\n\n\n\nThat is the most grounded, least wasteful path I can justify from the current docs and issue threads.\n\nIt is also the best way to stop guessing.",
  "title": "1st movie clip!"
}