

# IVS 廣播 SDK：自訂影像來源 \$1 低延遲串流
<a name="broadcast-custom-image-sources"></a>

本指南假設您已熟悉如何設置廣播工作階段 ([Android](broadcast-android.md)、[iOS](broadcast-ios.md))，以及如何[使用混合裝置 API](broadcast-mixed-devices.md)。

自訂圖像輸入來源讓應用程式能將自己的圖像輸入提供給廣播開發套件，而不是僅限於預設相機或螢幕共享。自訂圖像來源可以是簡單的半透明浮水印或靜態的「馬上回來」場景，也可以是允許應用程式執行額外的自訂處理，像是在相機上加上美顏濾鏡。

您可以擁有多個自訂影像來源，像是浮水印加上具有美顏濾鏡的相機。當您使用自訂圖像輸入來源對相機進行自訂控制時 (例如，使用需要相機存取權的美顏濾鏡程式庫)，就不再由廣播開發套件負責管理相機。而是由應用程式負責正確處理相機的生命週期。請參閱官方平台文件，以了解您的應用程式應該如何管理相機。

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

建立廣播工作階段後，建立圖像輸入來源：

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

此方法會傳回 `SurfaceSource`，這是一個由標準 Android [Surface](https://developer.android.com/reference/android/view/Surface) 支持的圖像來源。其會自動連接到廣播工作階段，因此之後不需要使用 `attachDevice(...)` 方法。但是，`SurfaceSource` 需要綁定到一個插槽，稍後會在下面加以說明。`SurfaceSource` 可以調整大小和旋轉。您還可以建立 `ImagePreviewView` 以顯示其內容的預覽。

若要檢索底層 `Surface`：

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

此 `Surface` 可以作為圖像製作工具 (像是 Camera2、OpenGL ES 和其他程式庫）的輸出緩衝。最簡單的使用案例是將靜態點陣圖或顏色直接繪製到 Surface 的 Canvas 中。但是，許多程式庫 (像是美顏濾鏡程式庫) 都有提供一種方法，讓應用程式能指定外部 `Surface` 進行渲染。你可以使用這樣的方法來將此 `Surface` 傳遞到濾鏡程式庫，這允許程式庫輸出處理過的影格，以便廣播工作階段進行串流。

最後，必須將 `SurfaceSource` 綁定到一個 `Mixer.Slot`，才能由廣播工作階段進行串流：

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

[Android 範本程式碼](https://github.com/aws-samples/amazon-ivs-broadcast-android-sample)有幾個以不同方式使用自訂圖像來源的範例：
+ 在 `MixerActivity` 中加上一個半透明浮水印。
+ 在 `MixerActivity` 中循環一個 MP4 檔案。
+ [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")
```

這個方法會傳回 `IVSCustomImageSource`，這是一個允許應用程式手動提交 `CMSampleBuffers` 的圖像來源。有關支援的像素格式，請參閱 iOS 廣播開發套件參考文件；最新版本的連結位於 [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` 中加上一個半透明浮水印。
+ 在 `MixerViewController` 中循環一個 MP4 檔案。
+ `CustomSourcesViewController` 中新增了帶有裝置攝影機的 CIFilter 實作。這允許應用程式獨立於 Amazon IVS 廣播開發套件管理裝置攝影機。它使用 `AVCaptureSession` 從裝置攝影機擷取圖片、使用 CIFilter 實作處理圖片，並將 `CMSampleBuffers` 提交到 `customSource` 以進行即時串流。