---
lang: ja
path: cookbook/ios-sdk/video-processor
labels: クックブック/iOS SDK/背景ぼかしとバーチャル背景
metaTitle: 背景ぼかし | バーチャル背景 | iOS SDK | クックブック | SkyWay（スカイウェイ）
---

# 背景ぼかしとバーチャル背景

SkyWay iOS SDKは、カメラ映像の背景にぼかしをかける**背景ぼかし**、および背景を任意の画像に差し替える**バーチャル背景**の機能を提供しています。

> **注意** この機能は iOS 15.0 以降 でのみ利用可能です。iOS 14 以下のサポートが必要な場合は、`#available(iOS 15.0, *)` による可用性チェックを行ってください。


| クラス | 機能名 | 効果 |
|--------|--------|------|
| `BlurProcessor` | 背景ぼかし | 背景にぼかし（ブラー）をかける |
| `VirtualBackgroundProcessor` | バーチャル背景 | 背景を任意の画像に置き換える |

---

## 背景ぼかし（BlurProcessor）

### BlurProcessor の初期化および適用
```swift
import SkyWayRoom

// 1. 背景ぼかしプロセッサを作成
let blurProcessor = BlurProcessor(blurRadius: 20, inferenceInterval: 2)

// 2. CameraVideoSource に背景ぼかしプロセッサを追加
let videoSource = CameraVideoSource.shared()
videoSource.add(blurProcessor)
```
`BlurProcessor` を `CameraVideoSource` に追加すると、背景ぼかしが有効になります。
映像の送信については、[カメラの選択](https://skyway.ntt.com/ja/docs/cookbook/ios-sdk/select-devices/) を参照してください。

### BlurProcessor API の呼び出し
```swift
// 3. 背景ぼかし実行中に半径を変更
blurProcessor.blurRadius = 50

// 4. 背景ぼかし機能を一時停止
blurProcessor.isActive = false

// 5. 背景ぼかし機能を完全に停止する
videoSource.remove(blurProcessor)
```

## バーチャル背景（VirtualBackgroundProcessor）

### VirtualBackgroundProcessor の初期化および適用
```swift
import SkyWayRoom
import UIKit

// 1. 背景画像付きで初期化
let bgImage = UIImage(named: "virtual_background")
let vbProcessor = VirtualBackgroundProcessor(
    backgroundImage: bgImage,
    inferenceInterval: 2
)

// 2. CameraVideoSource にプロセッサを追加
let videoSource = CameraVideoSource.shared()
videoSource.add(vbProcessor)
```
`VirtualBackgroundProcessor` を `CameraVideoSource` に追加すると、バーチャル背景が有効になります。
映像の送信については、[カメラの選択](https://skyway.ntt.com/ja/docs/cookbook/ios-sdk/select-devices/) を参照してください。

### VirtualBackgroundProcessor API の呼び出し
```swift
// 3. 実行中に背景画像を変更
vbProcessor.backgroundImage = UIImage(named: "beach_background")

// 4. 背景なし（元映像）に戻す
vbProcessor.backgroundImage = nil

// 5. プロセッサ削除
videoSource.remove(vbProcessor)
```

## ベストプラクティス

### `inferenceInterval` はフレームレートに合わせて調整する

```swift
// 30fps の映像で Vision を約 10fps で実行したい場合
blurProcessor.inferenceInterval = 3   // 30 / 3 = 10fps

// 60fps の映像でも同じ Vision 負荷を維持したい場合
blurProcessor.inferenceInterval = 6   // 60 / 6 = 10fps
```

### `qualityLevel` はデバイス性能に応じて選択する

`qualityLevel = .accurate` は処理が重く、30fps の維持が困難になる場合があります。特に古い端末では `inferenceInterval` を大きくするか `.balanced` に落とすことを検討してください。

```swift
// 起動時に処理コア数によって切り替える例
if ProcessInfo.processInfo.processorCount >= 8 {
    processor.qualityLevel = .accurate
} else {
    processor.qualityLevel = .balanced
}
```

### バーチャル背景の背景画像は事前にロードする

```swift
// 画像を事前ロードし、切り替え時はプロパティ代入のみ
let backgrounds: [UIImage] = ["bg1", "bg2", "bg3"].compactMap { UIImage(named: $0) }
vbProcessor.backgroundImage = backgrounds[selectedIndex]


```
- `vbProcessor.backgroundImage = UIImage(named: "bg\(selectedIndex)")` のように切り替えのたびに `UIImage(named:)` を呼ぶと、毎回画像のデコード処理が発生するため避けてください。

### `isActive` と `add` / `remove` の使い分け

| 手法 | プロセッサインスタンスの維持 | Vision マスクのキャッシュ | 推奨タイミング |
|------|-----------------|--------------|---------------|
| `isActive = false` | 維持される（プロセッサオブジェクトはメモリに残る） | 維持される（前回のマスク画像をそのまま保持） | 頻繁な ON/OFF |
| `videoSource.remove()` | 呼び出し元で参照を保持していれば維持される | リセットされる（次回 `add` 時にマスクが初期化） | 完全に無効化したい場合 |

頻繁に ON/OFF する場合は `isActive` の切り替えを推奨します。毎回 `add` / `remove` を呼ぶと Vision の初期化コストが再発生します。


## サンプルコード
- [背景ぼかし/バーチャル背景を利用したカメラ映像を配信するサンプル](https://github.com/skyway/ios-sdk/tree/main/Examples/Sources/VideoProcessorExample)
