

# IVS Broadcast SDK: カスタム画像ソース \$1 Low-Latency Streaming
<a name="broadcast-custom-image-sources"></a>

このガイドでは、ブロードキャストセッション ([Android](broadcast-android.md) や [iOS](broadcast-ios.md)) のセットアップ方法および[混合デバイス API の使用](broadcast-mixed-devices.md)方法について既に精通していることを前提としています。

カスタム画像入力ソースを使用することで、プリセットカメラやスクリーン共有に限定されるのではなく、アプリケーションが独自の画像入力を Broadcast SDK に提供できます。カスタム画像ソースは、半透明の透かしや静的な「be right back」(すぐに戻ります) シーンと同じくらいシンプルにすることも、アプリケーションがカメラにビューティーフィルターを追加するなど、追加のカスタム処理を実行できるようにすることもできます。

透かしやビューティーフィルターを備えたカメラなど、複数のカスタム画像ソースを使用できます。カメラのカスタムコントロールにカスタム画像入力ソースを使用する場合 (カメラアクセスを必要とするビューティーフィルターライブラリを使用するなど) 、Broadcast SDK はカメラの管理をしなくなります。代わりに、アプリケーションはカメラのライフサイクルを正しく処理する責任があります。アプリケーションがカメラをどのように管理すべきかについては、プラットフォームの公式ドキュメントを参照してください。

## Android
<a name="custom-image-sources-android"></a>

ブロードキャストセッションを作成したら、画像入力ソースを作成します。

```
SurfaceSource surfaceSource = broadcastSession.createImageInputSource();
```

このメソッドは、標準の Android [Surface](https://developer.android.com/reference/android/view/Surface) に基づく画像ソースである `SurfaceSource` を返します。ブロードキャストセッションに自動的にアタッチされるため、後で `attachDevice(...)` メソッドを使用する必要はありません。ただし、`SurfaceSource` はスロットにバインドする必要があります。これについては、後で説明します。`SurfaceSource` のサイズを変更したり、回転したりできます。`ImagePreviewView` を作成して、その内容のプレビューを表示することもできます。

基盤の `Surface` を取得します。

```
Surface surface = surfaceSource.getInputSurface();
```

この `Surface` は、Camera2、OpenGL ES、その他のライブラリなどの画像プロデューサーの出力バッファとして使用できます。最も簡単なユースケースは、静的なビットマップまたは色を Surface のキャンバスに直接描画することです。ただし、多くのライブラリ (加工フィルターライブラリなど) には、レンダリングする外部 `Surface` をアプリケーションで指定できるメソッドが用意されています。このようなメソッドを使用して、この `Surface` をフィルターライブラリに渡すことができます。これによりライブラリは、ストリーミングするブロードキャストセッションに、処理されたフレームを出力できます。

最後に、`SurfaceSource` は、ブロードキャストセッションによってストリーミングされるためには、`Mixer.Slot` にバインドされる必要があります。

```
broadcastSession.getMixer().bind(surfaceSource, "customSlot");
```

[Android サンプルコード](https://github.com/aws-samples/amazon-ivs-broadcast-android-sample)には、さまざまな方法でカスタム画像ソースを使用するいくつかの例があります。
+ 半透明の透かしが `MixerActivity` に追加されます。
+ MP4 ファイルは `MixerActivity` でループされます。
+ [CameraManager](https://github.com/aws-samples/amazon-ivs-broadcast-android-sample/blob/main/app/src/main/java/com/amazonaws/ivs/basicbroadcast/common/CameraManager.kt) ユーティリティクラスは、`CustomActivity` の Camera2 メソッドを使用してデバイスのカメラのカスタム管理を行います。これは、単純なセピアフィルターを適用します。この例は、カメラを管理し、ブロードキャストセッションのカスタム `SurfaceSource` をカメラキャプチャリクエストに渡す方法を示しているため、特に役立ちます。他の外部ライブラリを使用する場合は、ブロードキャストセッションによって提供される Android `Surface` に出力するようにライブラリを設定する方法に関するドキュメントに従ってください。

## iOS
<a name="custom-image-sources-ios"></a>

ブロードキャストセッションを作成したら、画像入力ソースを作成します。

```
let customSource = broadcastSession.createImageSource(withName: "customSourceName")
```

このメソッドは、アプリケーションが手動で `CMSampleBuffers` を送信できるようにする画像ソースである `IVSCustomImageSource` を返します。サポートされているピクセル形式については、「iOS ブロードキャスト SDK リファレンス」を参照してください。最新バージョンへのリンクは、最新のブロードキャスト SDK リリースの「[Amazon IVS リリースノート](release-notes.md)」にあります。ソースはブロードキャストセッションに自動的にアタッチされないため、ソースがストリーミングされる前に、画像ソースをセッションにアタッチし、スロットにバインドする必要があります。

```
broadcastSession.attach(customSource, toSlotWithName: "customSourceSlot", onComplete: nil)
```

カスタムソースがアタッチされてバインドされた後、アプリケーションはカスタムソースに直接 `CMSampleBuffers` を送信できます。`onComplete` コールバックを使用して開始することもできます。

カスタムソースに送信されたサンプルは、ブロードキャストセッションでストリーミングされます。

```
customSource.onSampleBuffer(sampleBuffer)
```

動画のストリーミングには、このメソッドをコールバックで使用します。例えば、カメラを使用している場合、`AVCaptureSession` から新しいサンプルバッファを受信するたびに、アプリケーションはサンプルバッファをカスタム画像ソースに転送できます。必要に応じて、カスタム画像ソースにサンプルを送信する前に、アプリケーションでさらなる処理 (加工フィルターなど) を適用できます。

静的画像については、カスタム画像ソースのスロットバインディングが変更された場合、またはソースがデタッチされてブロードキャストセッションに再アタッチされた場合、最初のサンプルの後、アプリケーションはサンプルを再送信する必要があります。例えば、スロットをミキサーから削除してから、そのミキサーにスロットを追加する場合は、サンプルを再送信する必要があります。

[iOS サンプルアプリケーション](https://github.com/aws-samples/amazon-ivs-broadcast-ios-sample)には、さまざまな方法でカスタム画像ソースを使用するいくつかの例があります。
+ 半透明の透かしが `MixerViewController` に追加されます。
+ MP4 ファイルは `MixerViewController` でループされます。
+ デバイスのカメラによる CIFilter 実装は、`CustomSourcesViewController` に追加されました。これにより、アプリケーションは Amazon IVS Broadcast SDK とは独立してデバイスのカメラを管理できます。`AVCaptureSession` を使用してデバイスのカメラから画像をキャプチャし、CIFilter 実装を使用して画像を処理し、ライブストリーミング用に `CMSampleBuffers` を `customSource` に送信します。