

# SDK de transmisión de IVS: orígenes de imágenes personalizadas \$1 Transmisión de baja latencia
<a name="broadcast-custom-image-sources"></a>

En esta guía se parte de la base de que está familiarizado con la configuración de una sesión de transmisión ([Android](broadcast-android.md), [iOS](broadcast-ios.md)) y cómo [utilizar la API de dispositivos mixtos](broadcast-mixed-devices.md).

Las fuentes de entrada de imagen personalizadas permiten que una aplicación proporcione su propia entrada de imagen al SDK de transmisión, en lugar de limitarse a las cámaras predeterminadas o compartir la pantalla. Una fuente de imagen personalizada puede ser tan simple como una marca de agua semitransparente o una escena estática de “vuelvo enseguida”, o puede permitir que la aplicación realice un procesamiento personalizado adicional, como agregar filtros de belleza a la cámara.

Puede tener varias fuentes de imágenes personalizadas, como una marca de agua y una cámara con filtros de belleza. Cuando utiliza una fuente de entrada de imagen personalizada para el control personalizado de la cámara (como el uso de bibliotecas de filtros de belleza que requieren acceso a la cámara), el SDK de transmisión ya no es responsable de administrar la cámara. En cambio, la aplicación es responsable de manejar correctamente el ciclo de vida de la cámara. Consulte la documentación oficial de la plataforma sobre cómo su aplicación debe administrar la cámara.

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

Después de crear una sesión de transmisión, cree una fuente de entrada de imagen: 

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

Este método devuelve un `SurfaceSource`, que es una fuente de imagen respaldada por una Android [Surface](https://developer.android.com/reference/android/view/Surface) (Superficie) estándar. Se adjunta automáticamente a la sesión de transmisión, por lo que no es necesario utilizar el método `attachDevice(...)` posteriormente. Sin embargo, el `SurfaceSource` necesita estar vinculado a una ranura; esto se trata más adelante. El `SurfaceSource` se puede cambiar de tamaño y rotar. También puede crear un `ImagePreviewView` para mostrar una vista previa de su contenido.

Para recuperar el subyacente `Surface`:

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

Este `Surface` se puede usar como búfer de salida para productores de imágenes como Camera2, OpenGL ES y otras bibliotecas. El caso de uso más simple es dibujar directamente un mapa de bits estático o un color en el lienzo de la superficie. Sin embargo, muchas bibliotecas (como las bibliotecas de filtros de belleza) proporcionan un método que permite que una aplicación especifique un `Surface` externo para la representación. Puede usar dicho método para pasar el `Surface` a la biblioteca de filtros, lo que permite que la biblioteca genere fotogramas procesados ​​para que la sesión de transmisión los transmita.

Por último, el `SurfaceSource` debe estar vinculado a un `Mixer.Slot` que se transmitirá por streaming en la sesión de transmisión:

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

El [código de muestra de Android](https://github.com/aws-samples/amazon-ivs-broadcast-android-sample) tiene varios ejemplos que utilizan una fuente de imagen personalizada de diferentes maneras:
+ Se añade una marca de agua semitransparente en el `MixerActivity`.
+ Un archivo MP4 aparece en bucle en el `MixerActivity`.
+ La clase de utilidad [CameraManager](https://github.com/aws-samples/amazon-ivs-broadcast-android-sample/blob/main/app/src/main/java/com/amazonaws/ivs/basicbroadcast/common/CameraManager.kt) realiza una administración personalizada de la cámara del dispositivo mediante el método Camera2 en el `CustomActivity`, que aplica un filtro sepia simple. Este ejemplo es especialmente útil, ya que muestra cómo administrar la cámara y pasar el `SurfaceSource` personalizado de la sesión de transmisión a la solicitud de captura de la cámara. Si usa otras bibliotecas externas, siga su documentación sobre cómo configurar la biblioteca para enviar al `Surface` de Android proporcionado por la sesión de transmisión.

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

Después de crear una sesión de transmisión, crea una fuente de entrada de imagen:

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

Este método devuelve un `IVSCustomImageSource`, que es una fuente de imagen que permite que la aplicación envíe `CMSampleBuffers` manualmente. Para conocer los formatos de píxeles admitidos, consulte la referencia del SDK de transmisión de iOS; un enlace a la versión más actual se encuentra en las [Notas de la versión de Amazon IVS](release-notes.md) para la última versión del SDK de transmisión. La fuente no se adjunta automáticamente a la sesión de transmisión, por lo que debe adjuntar la fuente de la imagen a la sesión y vincularla a una ranura antes de que la fuente se transmita:

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

Después de adjuntar y vincular la fuente personalizada, la aplicación puede enviar `CMSampleBuffers` directamente a la fuente personalizada. Puede elegir usar la devolución de llamada `onComplete` para comenzar a hacerlo.

Las muestras enviadas a la fuente personalizada se transmitirán en la sesión de transmisión:

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

Para transmitir video, utilice este método en una devolución de llamada. Por ejemplo, si está utilizando la cámara, cada vez que se recibe un nuevo búfer de muestra de un `AVCaptureSession`, la aplicación puede reenviar el búfer de muestra a la fuente de imagen personalizada. Si lo desea, la aplicación puede aplicar más procesamiento (como un filtro de belleza) antes de enviar la muestra a la fuente de imagen personalizada.

Para una imagen estática, después de la primera muestra, la aplicación debe volver a enviar la muestra si se cambia el enlace de la ranura de la fuente de la imagen personalizada o si la fuente se desconecta y se vuelve a conectar a la sesión de transmisión. Por ejemplo, si quita la ranura y luego la agrega al mezclador, debe volver a enviar la muestra.

La [aplicación de muestra para iOS](https://github.com/aws-samples/amazon-ivs-broadcast-ios-sample) tiene varios ejemplos que usan una fuente de imagen personalizada de diferentes maneras:
+ Se agrega una marca de agua semitransparente en `MixerViewController`.
+ Un archivo MP4 aparece en bucle en `MixerViewController`.
+ Se agrega una implementación de CIFilter con una cámara de dispositivo en `CustomSourcesViewController`. Esto permite que una aplicación administre la cámara de un dispositivo independientemente del SDK de Broadcast de Amazon IVS. Usa `AVCaptureSession` para capturar una imagen desde la cámara del dispositivo, procesa la imagen mediante una implementación de CIFilter y envía `CMSampleBuffers` a `customSource` para el streaming en directo.