

# IVS 广播 SDK：自定义图像源 \| 实时直播功能
<a name="broadcast-custom-image-sources"></a>

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

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

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

创建 `DeviceDiscovery` 会话后，请创建一个图像输入源：

```
CustomImageSource imageSource = deviceDiscovery.createImageInputSource(new BroadcastConfiguration.Vec2(1280, 720));
```

此方法将返回一个 `CustomImageSource`，这是标准的 Android [Surface](https://developer.android.com/reference/android/view/Surface) 支持的图像源。子类 `SurfaceSource` 支持大小调整和轮换。您还可以创建 `ImagePreviewView` 来显示其内容预览。

检索底层 `Surface`：

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

此 `Surface` 可以用作图像创建器（例如 Camera2、OpenGL ES 和其他库）的输出缓冲区。最简单的使用场景是直接在 Surface 画布中绘制静态位图或颜色。但是，许多库（例如 beauty-filter 库）提供了一种方法，允许应用程序指定外部 `Surface` 来进行渲染。您可以用这种方法将此 `Surface` 传递到滤镜库，从而让库输出处理后的帧以便广播会话进行流式传输。

此 `CustomImageSource` 可以包装在 `LocalStageStream` 中并由 `StageStrategy` 返回以发布到 `Stage`。

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

创建 `DeviceDiscovery` 会话后，请创建一个图像输入源：

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

此方法将返回一个 `IVSCustomImageSource`，这是一个允许应用程序手动提交 `CMSampleBuffers` 的图像源。有关支持的像素格式，请参阅 iOS 广播 SDK 参考；指向最新版本的链接详见最新广播 SDK 发行版的 [Amazon IVS 版本注释](release-notes.md)。

提交到自定义源的样本将流式传输到舞台：

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

对于串流视频，请在回调中使用此方法。例如，假设您使用的是相机，则每次从 `AVCaptureSession` 收到一个新的样本缓冲时，应用程序可以将样本缓冲转发到自定义图像源。如果需要，应用程序可以在将样本提交到自定义图像源之前执行进一步的处理（例如美颜滤镜）。

`IVSCustomImageSource` 可以包装在 `IVSLocalStageStream` 中并由 `IVSStageStrategy` 返回以发布到 `Stage`。