long-video-chaining
WAN i2v로 30초 이상의 긴 영상을 색·대비 붕괴 없이 이어 만드는 절차. last-frame 체이닝의 3대 실패 모드(색 드리프트, 대비 누적, 모션 데드락)와 그 해결책인 "진행형 프롬프트 + ColorMatch 앵커" 레시피를 다룬다. SVI 2.0 Pro LoRA를 lightning 환경에 적용하면 안 되는 이유도 실측으로 기록되어 있다. "긴 영상", "장편 영상", "영상 이어붙이기", "체이닝", "색 드리프트", "color shift", "영상 일관성", "30초 영상", "1분 영상", "last frame", "SVI" 키워드에 트리거된다.
- License 许可
- MIT
- 最近更新
- 2026-10-07
- Stars
- ★ 3
- Forks
- 0
01 前言 Front Matter
- name
- long-video-chaining
- description
- WAN i2v로 30초 이상의 긴 영상을 색·대비 붕괴 없이 이어 만드는 절차. last-frame 체이닝의 3대 실패 모드(색 드리프트, 대비 누적, 모션 데드락)와 그 해결책인 "진행형 프롬프트 + ColorMatch 앵커" 레시피를 다룬다. SVI 2.0 Pro LoRA를 lightning 환경에 적용하면 안 되는 이유도 실측으로 기록되어 있다. "긴 영상", "장편 영상", "영상 이어붙이기", "체이닝", "색 드리프트", "color shift", "영상 일관성", "30초 영상", "1분 영상", "last frame", "SVI" 키워드에 트리거된다.
02 资源文件 5
- 脚本scripts/chain_correct.py8.7 KB
- 脚本scripts/chain_runner.py9.8 KB
- 脚本scripts/convert_svi.py1.6 KB
- 脚本scripts/make_strip.py2.2 KB
- 脚本scripts/README.md2.7 KB
03 SKILL.md 正文
장편 영상 체이닝 스킬
핵심 원칙 — 붕괴는 세 갈래이고, 서로 다른 약으로 잡는다
last-frame 체이닝(한 세그먼트의 마지막 프레임을 다음 세그먼트의 시작 프레임으로 넘기는 방식)이 실패하는 방식은 하나가 아니다. 세 가지가 동시에 일어나며, 각각 해법이 다르다.
| 실패 모드 | 증상 | 해법 |
|---|---|---|
| 색 드리프트 | 점점 어두워지거나 특정 채널이 빠짐 | ColorMatch 앵커 |
| 대비 누적 | 하이라이트가 타고 얼굴이 그늘로 들어감 | ColorMatch 앵커 |
| 모션 데드락 | seg2부터 같은 포즈로 얼어붙음 | 진행형 프롬프트 |
| 정체성 드리프트 | 얼굴이 점점 다른 사람이 됨 | 미해결 (§한계 참조) |
가장 많이 언급되는 "색 드리프트"는 실측해 보면 가장 약한 문제다. 20초 구간에서 휘도 변화가 겨우 -1.6이었다. 진짜 범인은 대비 누적과 모션 데드락이다.
정답 레시피 (D 레시피)
세 가지만 지키면 30초까지 안정적으로 간다. 실측 검증됨(2026-07-28, 6세그먼트 × 81프레임 = 30.1초).
1. 세그먼트마다 프롬프트를 진행시켜라
같은 모션 프롬프트를 반복해서 넣으면 seg2부터 포즈가 얼어붙는다. 모델이 "이미 다 한 동작"을 또 하려다가 멈춘다. 색이 멀쩡해도 영상이 안 움직이면 실패다.
동작을 서사처럼 이어서 써라.
SCRIPT = [
"she lifts the mug with both hands and takes a slow sip, steam curling upward",
"she lowers the mug onto the table and rests her chin on her hand, gazing out the window",
"she smiles faintly and brushes a strand of hair behind her ear",
"she turns her head back toward the camera and leans forward slightly",
"she picks up the mug again and cradles it against her chest",
"she straightens up and stretches her neck to one side",
]
네거티브에 static, still image, frozen pose, motionless를 반드시 넣어라.
2. ColorMatch 앵커를 디코드 뒤에 물려라
ComfyUI-KJNodes의 ColorMatch 노드를 VAEDecode 다음에 배치하고, image_ref에 1세그먼트의 첫 프레임(앵커)을 고정으로 물린다.
{
"21": {
"class_type": "ColorMatch",
"inputs": {
"image_ref": ["20", 0],
"image_target": ["13", 0],
"method": "mkl",
"strength": 1.0
}
}
}
method는mkl권장. 선택지:mkl,hm,reinhard,mvgd,hm-mvgd-hm,hm-mkl-hm- 앵커는 매 세그먼트 동일한 파일이어야 한다. 직전 세그먼트 프레임을 기준으로 삼으면 드리프트가 그대로 따라간다
- SaveAnimatedWEBP의
images를 ColorMatch 출력으로 재배선할 것
이 노드 하나가 대비 누적을 완전히 차단한다. 실측에서 std가 오르지 않고 오히려 미세하게 내려갔다.
3. 이음새 프레임 1장을 버려라
세그먼트 N의 마지막 프레임 = 세그먼트 N+1의 첫 프레임이므로, 이어붙일 때 중복이 생긴다.
allframes.extend(frames if i == 1 else frames[1:])
★ K 레시피 — 교정-확정 2패스 체이닝 (역동적 씬용 정답)
D 레시피는 모든 프레임의 색을 앵커에 맞춘다. 정적 씬에서는 완벽하지만, 조명이 정당하게 변해야 하는 씬에서는 그 변화까지 눌러버린다. 카메라가 움직이는 씬에서 D(=F)는 색은 잡았으나 5세그먼트에서 구도가 붕괴했다.
K는 클립 내부는 자유롭게 두고 끝점만 교정한다.
1) 탐색 패스 A → (자유 생성, end_image 없음) → 마지막 프레임 B
2) 교정 B → ColorMatch(anchor) → B'
3) 확정 패스 A → B' (FLF2V, end_image=B') ← 이 클립을 채택
4) B'가 아니라 확정 클립의 실제 마지막 프레임이 다음 구간의 A
왜 3단계가 필요한가. B를 고쳐 B'를 만들고 다음 구간을 B'에서 시작하면, 앞 클립은 B로 끝나고 뒤 클립은 B'에서 시작하므로 이음새에서 화면이 튄다. A→B'를 다시 뽑아야 앞 클립이 B'로 끝난다. 비용은 2.1배지만 이음새가 원리적으로 사라진다.
카메라 이동 씬 실측 (2026-07-28, 5세그먼트 25초, 그늘 진입 프롬프트 포함)
| variant | seg1 | seg2 | seg3 | seg4 (그늘) | seg5 | 결과 |
|---|---|---|---|---|---|---|
| H 앵커없음 | 77.0 | 80.0 | 78.7 | 48.5 | 32.1 | 암흑, 회복 실패 |
| F 앵커1.0 | 76.2 | 76.3 | 76.2 | 75.6 | 75.4 | 색은 유지, 구도 붕괴 |
| K 2패스 | 80.6 | 81.2 | 81.3 | 78.3 | 79.8 | 전 구간 정상 |
K의 seg4를 보라. 탐색 패스에서는 휘도가 54.79까지 떨어졌다 — H와 똑같이 무너지기 시작한 것이다. 그런데 교정이 그것을 76.00으로 되돌렸고, 확정 패스가 78.30으로 끝났다. 무너진 프레임을 다음 구간에 넘기지 않은 것이 차이를 만들었다.
교정량이 seg4·5에서 20.8 / 20.0으로 급증한 것이 그 증거다. 앞 구간에서는 1~7 수준이었다.
프레임 확인 결과 인물 동일성도 5구간 내내 유지되었다. 정체성 드리프트가 완전히 해결된 것은 아니지만, D/F 대비 뚜렷하게 낫다.
지표 읽는 법
- 이음새 = 앞 클립 마지막 ↔ 뒤 클립 첫 프레임 차이. 2.1~2.7이 바닥값이며 0이 되지 않는다. WAN이 start_image를 첫 프레임으로 100% 재현하지 못하는 VAE 라운드트립 손실이므로 방식의 결함이 아니다
- 목표 이탈 = 확정 클립 마지막 프레임이 B'에서 벗어난 정도. 3.4~5.6으로 일정했다.
end_image를 줘도 정확히 도착하지는 않는다는 뜻이므로, 이 값이 누적되지 않는지를 감시하라 - 교정량 = 무너지려는 정도의 척도. 급증하면 그 구간에서 붕괴가 시작된 것이다
D vs K 선택 기준
| D (전 프레임 색고정) | K (끝점 교정 2패스) | |
|---|---|---|
| 속도 | 120s/구간 | 250s/구간 (2.1배) |
| 정적 씬 안정도 | ±0.3 (최고) | ±1.5 |
| 조명 변화 표현 | 불가 | 가능 |
| 카메라 이동 씬 | 5세그에서 붕괴 | 25초까지 유지 |
- 카메라 고정 + 조명 일정 → D. 빠르고 더 안정적이다
- 카메라 이동 / 조명 변화 / 야외 → K
실측 대조 데이터 (2026-07-28)
RTX 5070 Ti 16GB / Wan2.2 I2V 14B fp8_scaled / lightning 6step 2-stage / 832×480 / 81f@16fps / cfg 1.0 / seed 고정
| 조건 | 구성 | 휘도 드리프트 | 대비 std(R) | 모션 | 판정 |
|---|---|---|---|---|---|
| A | 반복 프롬프트 | -1.6 | 84.25 → 87.06 ↑ | 데드락 | ✗ 포즈 고정 |
| C | 진행형 프롬프트 | +6 ~ +14 변동 | 83.79 → 90.20 ↑↑ | 살아남 | △ 대비 누적 |
| D | 진행형 + ColorMatch | -0.01 ~ +0.34 | 76.24 → 75.09 ↓ | 살아남 | ◎ 정답 |
| B2/E | + SVI 2.0 Pro | — | — | — | ✗✗ 출력 붕괴 |
속도: 세그먼트당 120~130초. 30초 영상 ≈ 12분, 1분 영상 ≈ 25분.
함정
함정 1 — SVI 2.0 Pro LoRA는 PEFT 포맷이라 조용히 무시된다
epfl-vita/svi-model의 SVI LoRA는 키 네이밍이 ComfyUI 네이티브와 다르다. LoraLoaderModelOnly에 넣으면 에러도 경고도 없이 그냥 아무 일도 일어나지 않는다.
| 키 형식 | 키 수 | |
|---|---|---|
| SVI 원본 | blocks.0.cross_attn.k.lora_A.default.weight |
800 |
| ComfyUI 네이티브 | diffusion_model.blocks.0.cross_attn.k.lora_down.weight (+ .alpha) |
1200 |
증상: LoRA를 얹은 결과가 안 얹은 결과와 소수점까지 완전히 동일하다.
효과가 약한 게 아니다. 완전히 같으면 로드 자체가 안 된 것이다. 반드시 safetensors로 파일을 직접 열어 키 이름을 확인하라.
변환은 scripts/convert_svi.py로 한다. prefix 부착 + lora_A→lora_down + lora_B→lora_up + alpha=rank 생성.
함정 2 — 그런데 변환해서 적용하면 화면이 박살난다
키를 제대로 변환해 실제로 적용하면, lightning 환경에서 세로 줄무늬 노이즈로 화면 전체가 붕괴한다.
원인 추정: SVI 권장 조건은 cfg 1.5 / shift 8 / steps 6인데, lightning LoRA 환경은 cfg 1.0이다. 두 LoRA가 같은 레이어를 경쟁적으로 수정하는 것으로 보인다.
lightning + SVI 조합은 쓰지 마라. 재도전하려면 lightning을 빼고 정규 steps(20+) / cfg 1.5로 별도 검증할 것.
함정 3 — std 급락은 개선이 아니다
SVI 붕괴 케이스에서 대비 std가 84 → 28로 떨어졌다. 수치만 보면 "드리프트가 완벽히 잡혔다"고 읽힌다.
실제로는 화면이 뭉개져 정보가 사라진 것이었다. 표준편차가 낮아지는 건 안정화일 수도 있고 붕괴일 수도 있다. 반드시 프레임을 눈으로 확인하라. 수치만 보고 판정하면 정반대 결론에 도달한다.
측정 프로토콜
세그먼트마다 아래를 기록하라. scripts/chain_runner.py에 구현되어 있다.
- 휘도
0.299R + 0.587G + 0.114B— 앵커 대비 드리프트 - 채널별 std — 대비 누적 탐지. 단조 증가하면 열화 신호
- motion energy — 연속 프레임 간 평균 절대차. 낮으면 화면이 멈춘 것
- pose delta — 세그먼트 첫 프레임 대 마지막 프레임 차이. 낮으면 데드락
판정은 수치 + 프레임 스트립 이미지를 함께 볼 것. 세그먼트별 마지막 프레임을 가로로 이어 붙인 비교 스트립을 만들면 열화가 한눈에 보인다.
함정 4 — 어두워지는 조명 변화를 프롬프트에 넣지 마라 (카메라 씬 실측)
체이닝은 마지막 프레임에 남은 정보만으로 다음 세그먼트를 그린다. 그래서 프레임이 어두워지면 다음 세그먼트가 참조할 정보 자체가 사라지고, 한 번 어두워지면 되돌아오지 못한다.
2026-07-28 카메라 이동 씬 실측. 프롬프트 시퀀스에 she passes into deep shade under a shop awning(4세그)을 의도적으로 넣었다.
| variant | 앵커 | seg1~3 | seg4 (그늘 진입) | seg5 (복귀 시도) |
|---|---|---|---|---|
| H | 없음 | 정상 | 휘도 78.7 → 48.5 | 32.1 — 거의 암흑, 회복 실패 |
| F | 1.0 | 정상 | 75.6 (억제됨) | 구도 붕괴, 엉뚱한 차량이 화면 점거 |
| G | 0.5 | 정상 | 60.8 | 휘도 80.5로 "회복"했으나 인물이 완전히 다른 사람으로 교체됨 |
셋 다 실패했다. 카메라 이동 씬에서 이 레시피의 실용 한계는 **4세그먼트(약 20초)**다.
그리고 이 실험은 함정 3을 다시 증명했다. G의 seg5는 휘도가 정상 범위로 돌아왔고 수치만 보면 "앵커 0.5가 정답"으로 읽힌다. 실제 프레임을 보면 검은 머리의 다른 인물이 서 있다. 수치가 좋아진 이유가 회복이 아니라 장면 교체였다.
대응:
- 조명 프롬프트는 밝아지는 방향만 쓰거나, 아예 조명을 언급하지 마라
- 어두운 구간이 서사상 필요하면 그 구간을 별도 클립으로 따로 생성하고 편집에서 붙여라. 체이닝으로 관통시키지 마라
- 세그먼트 넘기기 전에 마지막 프레임의 휘도를 검사하고, 임계 이하(예: 50)면 체인을 끊고 새 키프레임으로 재시작하라
한계 — 이 레시피가 검증된 범위
⚠ 정적 씬에서만 검증되었다. 실측 장면은 카페에 앉은 인물의 상반신이었고, 카메라 고정 · 배경 고정 · 인물 위치 거의 고정이었다. 이런 조건에서는 체이닝이 유리하다. 넘겨받는 마지막 프레임과 다음 세그먼트가 그려야 할 장면이 거의 같기 때문이다.
카메라 이동 씬 — 검증됨, 한계 20초 (2026-07-28 실측, 함정 4 참조)
거리를 걷는 인물 + 돌리/팬/풀백. seg1~3(15초)까지는 앵커 유무와 무관하게 양호했고, 카메라 워크도 프롬프트대로 반영됐다. seg4부터 세 조건 모두 붕괴했다. 원인은 카메라 이동 자체가 아니라 어두워지는 프레임을 넘긴 것이었다.
따라서 카메라 이동 씬에서는:
- 목표 길이를 20초 이내로 잡고, 그 이상은 클립을 나눠 편집에서 붙일 것
- 앵커 strength는 1.0 유지. 0.5는 붕괴를 늦추지 못했고 오히려 장면 교체를 은폐했다
- 조명 변화 프롬프트를 넣지 말 것
아직 검증 안 된 것들:
- 인물이 화면 밖으로 나갔다 들어오는 씬
- 장면 전환이 포함된 시퀀스
- 60초 이상의 길이 (정적 씬에서도 30초까지만 확인)
- 다중 인물 씬
정체성 드리프트는 미해결이다. 색은 잡히지만 얼굴은 세그먼트마다 조금씩 달라진다. 30초에서는 티가 덜 나고, 1분을 넘기면 눈에 걸린다. 이건 색 문제와 다른 축이므로 다른 해법이 필요하다.
- IPAdapter로 레퍼런스 얼굴 고정
- 캐릭터 LoRA 적용
- 세그먼트마다
i2i-cleanup패키지로 얼굴만 재정렬
셋 다 미검증이다. 시도할 때는 반드시 대조군을 두어라.
★ 먼저 확인할 것 — 그 모델은 애초에 몇 초까지 한 방인가 (2026-08-07 추가)
체이닝을 설계하기 전에 반드시 대상 모델의 단발 최대 길이부터 확인하라. 체이닝은 이음새·색 드리프트·정체성 드리프트를 반드시 동반한다. 한 방에 되는 구간을 굳이 쪼개면 손해만 본다.
| 모델 | 단발 훈련 범위 | 체이닝 필요 시점 |
|---|---|---|
| WAN 2.2 I2V | 81f @16fps ≈ 5초 | 5초 초과 |
| MiniMax H3 | 362f @24fps ≈ 15초 | 15초 초과 |
H3는 length 툴팁에 훈련 범위가 명시되어 있다(trained range is ~124-362).
832×480 / 20step에서 15.08초 단발 생성이 738초에 실측 완료됐다 — 체이닝 없이.
H3로 체이닝할 때의 차이점 (자세한 내용은 minimax-h3 스킬):
MiniMaxH3ImageToVideo에first_frame/last_frame이 둘 다 있어 K 레시피가 노드 개조 없이 그대로 성립한다- ⚠ 오디오 이음새라는 새 실패 축이 생긴다. H3는 오디오를 네이티브로 동시 생성하므로 세그먼트마다 앰비언스 레벨·톤이 튄다. ColorMatch에 해당하는 오디오 앵커 수단이 없다. 유력 대응은 세그먼트 오디오를 버리고 전체 길이 오디오를 별도로 한 번 생성해 덮어쓰는 것이다(미검증)
대안 경로 (미검증, 참고용)
이 레시피가 막히면 아래를 검토하라. 모두 2026-07 기준 조사 결과이며 실측하지 않았다.
- VACE (
wan2.1_vace_1.3B) — 프레임 패딩 + 마스크로 temporal outpainting. 커뮤니티에서 color match보다 열화 억제가 낫다는 평 - WanVideoWrapper context options — Wan2.2에서 ping-pong 아티팩트 미해결 이슈(#1373) 있음. 권장하지 않음
- FramePack / FramePack-F1 — anti-drifting sampling. HunyuanVideo 기반이라 Wan2.2 대비 프롬프트 추종 열세
- InfiniteTalk — 오디오 구동 장편. 1분 초과 시 color shift + identity 열화가 공식 문서에 명시됨
실행 스크립트
scripts/ 에 동봉되어 있다. ComfyUI HTTP API를 직접 호출하므로 ComfyUI가 떠 있어야 한다.
chain_runner.py— 체이닝 실행 + 측정. variant 프리셋(C/D/E)으로 대조 실험 가능convert_svi.py— SVI LoRA를 ComfyUI 네이티브 포맷으로 변환make_strip.py— 세그먼트별 마지막 프레임 비교 스트립 생성
사용법은 scripts/README.md 참조.
04 同仓库更多 Skills
generate-video
claude-play-bridge MCP 서버로 영상을 생성한다. 로컬 ComfyUI의 영상 워크플로 패키지(MiniMax H3 = 영상+오디오 동시 생성, WAN 2.2 i2v, Z-Image→영상)를 호출한다. 렌더가 수 분~수십 분 걸리므로 async 큐잉 + 파일 폴링이 기본 절차다. "영상", "동영상", "비디오", "video", "i2v", "t2v", "클립 만들어", "움직이는", "애니메이션 영상" 요청에 트리거된다.
generate-image
claude-play-bridge MCP 서버로 이미지를 생성한다. 기본 백엔드는 ComfyUI(로컬 GPU, 워크플로 패키지 기반)이고, 사용자가 명시적으로 요청할 때만 GPT/Gemini 백엔드를 사용한다.
generate-image-openai
OpenAI/GPT 이미지 생성(GPT Image 품질 / 텍스트 렌더링·이미지 편집 강점). 기본 백엔드는 Codex CLI 구독(건당 과금 없음). ⚠️ 사용자가 이 백엔드를 명시적으로 지정했을 때만 사용한다(예 "GPT로/OpenAI로 그려줘"). 기본 이미지 생성은 generate-image(ComfyUI)이며, 사용자가 콕 집어 요청하지 않았다면 절대 OpenAI를 자동으로 선택하지 마라.
generate-spritesheet
Gemini 이미지 생성으로 게임용 아이콘 스프라이트시트를 만들고 자동 슬라이스한다. 아이콘, UI 리소스, 뱃지, 마커 등 여러 개의 동일 카테고리 에셋이 필요할 때 사용한다.
generate-image-gemini
Gemini API로 이미지를 생성한다. 패널 배경, UI 리소스, 아이콘, 장면 삽화 등 디자인 리소스 제작에 사용한다. ComfyUI가 없을 때의 이미지 생성 대안이기도 하다.
workflow-research
새 ComfyUI 워크플로우를 설계하거나 신규 모델, 양자화 모델, LoRA 개발 전략을 비교할 때 분석 틀을 잡는다.