

# 将 BytePlus 与 IVS 广播 SDK 结合使用
<a name="broadcast-3p-camera-filters-integrating-byteplus"></a>

本文档介绍如何将 BytePlus Effects SDK 与 IVS 广播 SDK 结合使用。

## Android
<a name="integrating-byteplus-android"></a>

### 安装和设置 BytePlus Effects SDK
<a name="integrating-byteplus-android-install-effects-sdk"></a>

有关如何安装、初始化和设置 BytePlus Effects SDK 的详细信息，请参阅 BytePlus [Android 访问指南](https://docs.byteplus.com/en/effects/docs/android-v4101-access-guide)。

### 设置自定义图像源
<a name="integrating-byteplus-android-setup-image-source"></a>

初始化 SDK 后，将经过处理并应用了滤镜效果的相机帧馈送到自定义图像输入源。为此，请创建 `DeviceDiscovery` 对象的实例并创建自定义图像源。请注意，当您使用自定义图像输入源对相机进行自定义控制时，广播 SDK 不再负责管理相机。相反，应用程序负责正确处理相机的生命周期。

#### Java
<a name="integrating-byteplus-android-setup-image-source-code"></a>

```
var deviceDiscovery = DeviceDiscovery(applicationContext)
var customSource = deviceDiscovery.createImageInputSource( BroadcastConfiguration.Vec2(
720F, 1280F
))
var surface: Surface = customSource.inputSurface
var filterStream = ImageLocalStageStream(customSource)
```

### 将输出转换为位图并馈送到自定义图像输入源
<a name="integrating-byteplus-android-convert-to-bitmap"></a>

为了使来自 BytePlus Effect SDK 的应用了滤镜效果的相机帧直接转发到 IVS 广播 SDK，请将纹理的 BytePlus Effects SDK 的输出转换为位图。处理图像时，SDK 会调用 `onDrawFrame()` 方法。`onDrawFrame()` 方法是 Android 的 [GLSurfaceView.Renderer](https://developer.android.com/reference/android/opengl/GLSurfaceView.Renderer) 界面中的一种公共方法。在 BytePlus 提供的 Android 示例应用程序中，在每个相机帧上都调用此方法；它输出纹理。同时，您可以使用逻辑来补充 `onDrawFrame()` 方法，将此纹理转换为位图并将其馈送到自定义图像输入源。如以下代码示例中所示，使用 BytePlus SDK 提供的 `transferTextureToBitmap` 方法进行此转换。此方法由来自 BytePlus Effects SDK 的 [com.bytedance.labcv.core.util.ImageUtil](https://docs.byteplus.com/en/effects/docs/android-v4101-access-guide#Appendix:%20convert%20input%20texture%20to%202D%20texture%20with%20upright%20face) 库提供，如以下代码示例中所示。然后，您可以将生成的位图写入 Surface 的画布以渲染到 `CustomImageSource` 的底层 Android `Surface`。多次连续调用 `onDrawFrame()` 会生成一系列位图，组合后会形成视频流。

#### Java
<a name="integrating-byteplus-android-convert-to-bitmap-code"></a>

```
import com.bytedance.labcv.core.util.ImageUtil;
...
protected ImageUtil imageUtility;
...


@Override
public void onDrawFrame(GL10 gl10) {
  ...	
  // Convert BytePlus output to a Bitmap
  Bitmap outputBt = imageUtility.transferTextureToBitmap(output.getTexture(),ByteEffect     
  Constants.TextureFormat.Texture2D,output.getWidth(), output.getHeight());

  canvas = surface.lockCanvas(null);
  canvas.drawBitmap(outputBt, 0f, 0f, null);
  surface.unlockCanvasAndPost(canvas);
```