

# IVS 广播 SDK：自定义图像源 \$1 低延迟直播功能
<a name="broadcast-custom-image-sources"></a>

本指南假设您已熟悉如何设置广播会话（[Android](broadcast-android.md)、[iOS](broadcast-ios.md)）以及如何[使用混合设备 API](broadcast-mixed-devices.md)。

自定义图像输入源允许应用程序向广播 SDK 提供自己的图像输入，而不仅限于预设相机或屏幕共享。自定义图像源可以是简单的半透明水印或静态“马上回来”等场景，也可以允许应用程序执行额外的自定义处理，例如向相机添加美颜滤镜。

您可以拥有多个自定义图像源，例如水印加上带美颜滤镜的相机。当您使用自定义图像输入源对摄像机进行自定义控制时（例如使用需要访问相机的美颜滤镜库）时，广播 SDK 不再负责管理相机。相反，应用程序负责正确处理相机的生命周期。请参阅官方平台文档，以了解应用程序应如何管理相机。

## 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 画布中绘制静态位图或颜色。但是，许多库（例如 beauty-filter 库）提供了一种方法，允许应用程序指定外部 `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 方法对设备相机进行自定义管理，这种方法使用了一个简单的 sepia 滤镜。此示例特别有用，因为它演示了如何管理相机以及将广播会话的自定义 `SurfaceSource` 传递到相机捕获请求。如果您使用其他外部库，请参阅其文档以了解如何配置库，以输出到由广播会话提供的 Android `Surface`。

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

创建广播会话后，请创建一个图像输入源：

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

此方法将返回一个 `IVSCustomImageSource`，这是一个允许应用程序手动提交 `CMSampleBuffers` 的图像源。有关支持的像素格式，请参阅 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` 中回环。
+ 在 `CustomSourcesViewController` 中添加了一个带有设备摄像头的 CiFilter 实现。这使应用程序能够独立于 Amazon IVS 广播开发工具包管理设备摄像头。它通过 `AVCaptureSession` 从设备摄像头捕获图像、使用 CiFilter 实现处理图像，然后将 `CMSampleBuffers` 提交到 `customSource` 来实现实时流。