# 샷 컷

> 동영상의 모든 샷이 어디서 시작하고 끝나는지 파일 자체에서 측정합니다. 각 샷의 첫 프레임과 마지막 프레임을 이미지로 저장할 수도 있습니다.

Source: https://nodaro.ai/ko/docs/nodes/video/shot-cuts

**샷 컷** 노드는 동영상의 모든 샷이 어디서 시작하고 끝나는지 찾습니다. 각 샷을 시작, 끝, 길이와 함께 목록으로 만듭니다. **첫 프레임과 마지막 프레임 저장**을 켜면 각 샷의 첫 프레임과 마지막 프레임도 이미지로 받습니다.

노드는 파일 자체를 측정합니다. 디코딩한 모든 프레임을 바로 앞 프레임과 비교하며, 잔잔한 배경에서 크게 바뀐 프레임이 새 샷을 시작합니다. 이는 [동영상 마스크](https://nodaro.ai/docs/nodes/video/video-mask)가 동영상을 샷 단위로 마스킹할 때 쓰는 것과 같은 규칙입니다.

노드는 AI 모델이나 공급자 키 없이 로컬에서 실행되므로 모든 에디션에서 동작합니다.

## 사용 시기
- 광고, 예고편, 뮤직비디오 같은 편집의 샷 리스트를 얻어 샷 단위로 다시 만들거나 스타일을 바꿀 때.
- 모든 샷의 정지 이미지를 저장해 이미지 모델이나 동영상 모델의 레퍼런스 이미지로 쓸 때.
- 모든 샷의 길이를 한눈에 보며 편집의 템포를 잴 때.
- [구간 분할](https://nodaro.ai/docs/nodes/video/split-into-chunks) 전에 컷 지점을 찾을 때. 그 노드의 **샷** 모드는 같은 지점에서 동영상을 자릅니다.

## 빠른 시작
### 노드 추가
캔버스에서 Tab을 누르고 **동영상 › 자르기 및 합치기 › 샷 컷**을 선택하세요.

### 동영상 연결
동영상을 **동영상** 입력에 연결하세요. 예를 들어 [동영상 업로드](https://nodaro.ai/docs/nodes/video/upload-video) 노드에서 연결합니다.

### 프레임 저장 여부 선택
설정 패널을 여세요. 모든 샷의 첫 프레임과 마지막 프레임을 저장하려면 **첫 프레임과 마지막 프레임 저장**을 켜세요.

### 실행
노드에서 **실행**을 클릭하세요. 노드에 샷 수와 각 샷의 시작과 끝이 표시됩니다.

Workflow: 샷 컷이 광고의 모든 샷을 찾고, 필드 추출이 그 샷들을 다음 노드를 위한 목록으로 바꿉니다.

- 동영상 업로드 → 샷 컷 (동영상)
- 샷 컷 → 필드 추출

## 입력
| 입력 | 받는 것 | 하는 일 |
| --- | --- | --- |
| **동영상** | 동영상 업로드, 동영상 생성 같은 동영상 노드 | 측정할 동영상: MP4, MOV, MKV, WebM, 최대 30분. 필수입니다. |

## 출력
| 출력 | 전달하는 것 |
| --- | --- |
| **샷** | 샷 수, 컷 시간, 동영상 길이, 모든 샷을 데이터로 전달합니다. |
| **첫 프레임** | 프레임 저장을 켰을 때: 각 샷의 첫 프레임을 이미지 URL로 샷 순서대로 담은 목록. |
| **마지막 프레임** | 프레임 저장을 켰을 때: 각 샷의 마지막 프레임을 이미지 URL로 샷 순서대로 담은 목록. |

**샷** 출력은 다음과 같습니다.

```json
{
"shotCount": 3,
"cutsSec": [2.5, 6.042],
"durationSec": 9,
"shots": [
{ "index": 0, "startSec": 0, "endSec": 2.5, "durationSec": 2.5, "firstFrameUrl": "https://…", "lastFrameUrl": "https://…" },
{ "index": 1, "startSec": 2.5, "endSec": 6.042, "durationSec": 3.542, "firstFrameUrl": "https://…", "lastFrameUrl": "https://…" },
{ "index": 2, "startSec": 6.042, "endSec": 9, "durationSec": 2.958, "firstFrameUrl": "https://…", "lastFrameUrl": "https://…" }
]
}
```

| 필드 | 의미 |
| --- | --- |
| `cutsSec` | 새 샷이 각각 시작하는 위치. 오름차순이며 `0`은 없습니다. 샷이 하나뿐인 동영상은 `cutsSec: []`이고, 동영상 전체를 덮는 샷 하나가 있습니다. |
| `durationSec` | 동영상의 길이. 마지막 샷이 여기서 끝납니다. |
| `startSec`, `endSec` | 동영상의 첫 프레임부터의 초. 밀리초까지 표시합니다. |
| `firstFrameUrl`, `lastFrameUrl` | PNG 이미지로, 프레임 저장을 켰을 때만 들어 있습니다. 마지막 프레임은 다음 컷 바로 앞의 프레임이거나 동영상의 마지막 프레임입니다. 한 프레임짜리 샷은 첫 프레임과 마지막 프레임이 같은 이미지입니다. |

## 설정
| 설정 | 하는 일 |
| --- | --- |
| **첫 프레임과 마지막 프레임 저장** | 기본값은 꺼짐입니다. 켜면 노드가 모든 샷의 첫 프레임과 마지막 프레임도 이미지로 저장합니다. 가격은 같습니다. 프레임은 샷이 최대 1,000개인 동영상에서 저장됩니다. |

### 컷으로 세는 것
- **하드 컷**은 새 샷을 시작합니다. 한 프레임이 앞뒤 프레임과 크게 다를 때입니다.
- **점진적 전환은 컷이 아닙니다.** 디졸브나 검은 화면으로의 페이드는 변화를 여러 프레임에 나누므로 앞뒤의 샷이 하나로 세어집니다.
- **플래시.** 두세 프레임 동안 이어진 뒤 같은 화면으로 돌아오는 플래시는 컷이 아닙니다. 한 프레임짜리 플래시는 컷입니다.
- **컷을 놓칠 수 있습니다.** 휩 팬처럼 컷 직후 세 프레임 안에 두 번째 큰 변화가 이어질 때입니다.

## 크레딧
샷 컷은 프레임 저장 여부나 동영상 길이와 관계없이 실행당 고정 가격 하나입니다. 노드의 **실행** 버튼에 가격이 표시됩니다. 셀프 호스팅 Community Edition과 Business 에디션은 크레딧을 쓰지 않습니다.

다음 실행은 실패하며 크레딧이 환불됩니다.

- 읽을 수 있는 동영상이 아닌 파일.
- 약 10.7 GiB를 넘는 파일. 다운로드가 그 지점에서 멈춥니다.
- 30분보다 긴 동영상. 먼저 잘라 내세요.
- 프레임 저장을 켰을 때, 샷이 1,000개를 넘는 동영상. 시간만 얻으려면 프레임 저장을 끄거나 동영상을 잘라 내세요.

## 팁
- **샷 하나의 시간을 읽으세요.** **샷** 출력을 필드를 `shots`로, **출력 유형**을 **목록**으로 설정한 [필드 추출](https://nodaro.ai/docs/nodes/automate/extract-field)이나 목록 노드에 연결하세요. [목록과 일괄 처리](https://nodaro.ai/docs/concepts/lists-and-batching)를 참고하세요.
- **동영상을 샷 단위로 다시 만드세요.** 프레임 저장을 켜고, 각 샷의 첫 프레임을 새 클립의 시작 프레임으로 쓰세요.
- **샷마다 클립 하나로 자르세요.** **샷** 모드의 [구간 분할](https://nodaro.ai/docs/nodes/video/split-into-chunks)을 쓰세요.
- **프레임은 정확합니다.** 디코딩한 프레임 그대로 손실 없이 저장되며, 크기는 동영상 화면과 같습니다.

## 문제 해결
| 문제 | 해결 방법 |
| --- | --- |
| 긴 동영상에서 실행이 실패합니다 | 샷 컷은 최대 30분 길이의 동영상을 측정합니다. 먼저 [동영상 자르기](https://nodaro.ai/docs/nodes/video/trim-video)로 동영상을 잘라 내세요. |
| 프레임 저장을 켜면 실행이 실패합니다 | 동영상의 샷이 1,000개를 넘습니다. **첫 프레임과 마지막 프레임 저장**을 끄거나 동영상을 잘라 내세요. |
| 두 샷이 하나로 세어졌습니다 | 샷이 디졸브나 페이드로 이어져 있으며, 이는 컷이 아닙니다. 휩 팬 바로 앞의 하드 컷도 놓칠 수 있습니다. |
| 플래시가 새 샷을 시작했습니다 | 한 프레임짜리 플래시는 컷으로 셉니다. 노드 뒤의 단계에서 두 샷을 합치세요. |

## API에서 사용
`POST /v1/shot-cuts`에 `{ videoUrl, frames? }`를 보내면 작업이 대기열에 들어가고 그 `jobId`로 응답합니다. 형식이 잘못된 요청은 크레딧이 예약되기 전에 `400 validation_error`로 응답합니다. 완료된 작업의 `output_data.json`은 위의 **샷** 결과입니다. 프레임 저장을 켜면 `output_data.firstFrames`와 `output_data.lastFrames`가 프레임 이미지를 샷 순서대로 나열합니다.

SDK 메서드는 `client.media.shotCuts`이고, MCP 도구는 `shot_cuts`입니다. [단일 노드 실행](https://nodaro.ai/docs/developers/api/nodes), [SDK의 미디어 및 업로드](https://nodaro.ai/docs/developers/sdk/media-and-uploads), [MCP 도구 레퍼런스](https://nodaro.ai/docs/mcp/tools)를 참조하세요.

## 자주 묻는 질문

### 샷 컷은 무엇을 하나요?

샷 컷은 동영상을 읽고 각 샷이 어디서 시작하고, 어디서 끝나고, 얼마나 이어지는지 목록으로 만듭니다. 파일 자체를 측정하므로 시간이 동영상과 정확히 맞습니다.

### 샷 컷은 디졸브나 페이드를 컷으로 세나요?

아니요. 디졸브나 검은 화면으로의 페이드는 변화를 여러 프레임에 나누므로 앞뒤의 샷이 하나로 세어집니다. 새 샷을 시작하는 것은 하드 컷뿐입니다.

### 동영상은 얼마나 길 수 있나요?

샷 컷은 MP4, MOV, MKV, WebM 형식의 최대 30분 길이 동영상을 측정합니다. 더 긴 동영상은 먼저 잘라 내세요.

### 샷 컷으로 각 샷의 정지 이미지를 저장할 수 있나요?

네. 첫 프레임과 마지막 프레임 저장을 켜세요. 그러면 노드가 각 샷의 정확한 첫 프레임과 마지막 프레임도 PNG 이미지로 저장합니다. 샷이 최대 1,000개인 동영상이 대상이며, 가격은 같습니다.

### 샷 컷은 크레딧이 얼마나 드나요?

샷 컷은 프레임 저장 여부나 동영상 길이와 관계없이 실행당 고정 가격 하나입니다. 노드의 실행 버튼에 가격이 표시됩니다.
