# ショットカット

> 動画のすべてのショットがどこで始まりどこで終わるかを、ファイルそのものから測定します。各ショットの最初と最後のフレームを画像として保存することもできます。

Source: https://nodaro.ai/ja/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` になることはありません。ショットが 1 つだけの動画は `cutsSec: []` で、動画全体を覆う 1 つのショットになります。 |
| `durationSec` | 動画の長さ。最後のショットはここで終わります。 |
| `startSec`、`endSec` | 動画の最初のフレームからの秒数で、ミリ秒まで示します。 |
| `firstFrameUrl`、`lastFrameUrl` | PNG 画像で、フレームの保存がオンの場合だけ入ります。最後のフレームは、次のカットの直前のフレーム、または動画の最終フレームです。1 フレームだけのショットでは、最初と最後のフレームは同じ画像です。 |

## 設定
| 設定 | 役割 |
| --- | --- |
| **最初と最後のフレームを保存** | デフォルトはオフです。オンにすると、すべてのショットの最初と最後のフレームも画像として保存します。料金は変わりません。フレームは、1,000 ショットまでの動画で保存されます。 |

### カットとして数えるもの
- **ハードカット**は新しいショットを始めます。1 つのフレームが前後のフレームと大きく異なる場合です。
- **緩やかな切り替えはカットではありません。**ディゾルブや黒へのフェードは変化を多くのフレームに分散させるので、前後のショットは 1 つとして数えられます。
- **フラッシュ。**2〜3 フレーム続いて元の映像に戻るフラッシュはカットではありません。1 フレームだけのフラッシュはカットです。
- **カットを見逃すことがあります。**ホイップパンのように、カットの直後 3 フレーム以内に 2 つ目の大きな変化が続く場合です。

## クレジット
ショットカットは、フレームの有無や動画の長さにかかわらず、1 回の実行につき一律の料金です。ノードの**実行**ボタンに料金が表示されます。セルフホスティングの Community エディションと Business エディションでは、クレジットを使いません。

次の実行は失敗し、クレジットは返還されます。

- 読み込める動画ではないファイル。
- 約 10.7 GiB を超えるファイル。ダウンロードはそこで止まります。
- 30 分より長い動画。先にトリミングしてください。
- フレームの保存がオンの場合、1,000 を超えるショットがある動画。時間だけを得るにはフレームの保存をオフにするか、動画をトリミングしてください。

## ヒント
- **1 つのショットの時間を読み取る。****ショット**出力を、フィールドを `shots`、**出力タイプ**を**リスト**にした[**フィールドを抽出**](https://nodaro.ai/docs/nodes/automate/extract-field)か、リストのノードに接続します。[リストとバッチ処理](https://nodaro.ai/docs/concepts/lists-and-batching)を参照してください。
- **動画をショットごとに作り直す。**フレームの保存をオンにし、各ショットの最初のフレームを新しいクリップの開始フレームに使います。
- **ショットごとに 1 本のクリップに分割する。****ショット**モードの[**チャンクに分割**](https://nodaro.ai/docs/nodes/video/split-into-chunks)を使います。
- **フレームは正確です。**デコードしたフレームそのものを劣化なしで保存し、サイズは動画の映像と同じです。

## トラブルシューティング
| 問題 | 対処 |
| --- | --- |
| 長い動画で実行が失敗する | ショットカットが測定できるのは最長 30 分の動画です。先に[**動画のトリミング**](https://nodaro.ai/docs/nodes/video/trim-video)で動画を短くしてください。 |
| フレームの保存をオンにすると実行が失敗する | 動画のショットが 1,000 を超えています。**最初と最後のフレームを保存**をオフにするか、動画をトリミングしてください。 |
| 2 つのショットが 1 つとして数えられた | ショットがディゾルブかフェードでつながっていて、これはカットではありません。ホイップパンの直前のハードカットも見逃されることがあります。 |
| フラッシュで新しいショットが始まった | 1 フレームだけのフラッシュはカットとして数えます。ノードのあとの工程で 2 つのショットをまとめてください。 |

## 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)を参照してください。

## よくある質問

### ショットカットは何をしますか？

ショットカットは動画を読み込み、各ショットがどこで始まり、どこで終わり、どれだけ続くかを一覧にします。ファイルそのものを測定するので、時間は動画と正確に一致します。

### ショットカットは、ディゾルブやフェードをカットとして数えますか？

いいえ。ディゾルブや黒へのフェードは変化を多くのフレームに分散させるので、前後のショットは 1 つとして数えられます。新しいショットを始めるのはハードカットだけです。

### 動画はどのくらいの長さまで使えますか？

ショットカットは、MP4、MOV、MKV、WebM の最長 30 分の動画を測定します。それより長い動画は、先にトリミングしてください。

### ショットカットで各ショットの静止画を保存できますか？

はい。最初と最後のフレームを保存をオンにします。ノードは、各ショットの正確な最初のフレームと最後のフレームも PNG 画像として保存します。対象は 1,000 ショットまでの動画で、料金は変わりません。

### ショットカットのクレジットはいくらですか？

ショットカットは、フレームの有無や動画の長さにかかわらず、1 回の実行につき一律の料金です。ノードの実行ボタンに料金が表示されます。
