

# Kit SDK de diffusion IVS : sources d’images personnalisées \$1 Diffusion à faible latence
<a name="broadcast-custom-image-sources"></a>

Ce guide part du principe que vous savez déjà configurer une séance de diffusion ([Android](broadcast-android.md), [iOS](broadcast-ios.md)) et [utiliser l’API pour appareils mixtes](broadcast-mixed-devices.md).

Les sources d'entrée d'image personnalisées permettent à une application de fournir sa propre entrée d'image au kit SDK de diffusion, au lieu de se limiter aux caméras prédéfinies ou au partage d'écran. Une source d'image personnalisée peut être aussi simple qu'un filigrane semi-transparent ou une scène statique « Je reviens tout de suite », ou elle peut permettre à l'application d'effectuer un traitement personnalisé supplémentaire, comme l'ajout de filtres de beauté à la caméra.

Vous pouvez disposer de plusieurs sources d'images personnalisées, comme un filigrane et une caméra dotée de filtres de beauté. Lorsque vous utilisez une source d'entrée d'image personnalisée pour un contrôle personnalisé de la caméra (par exemple, l'utilisation de bibliothèques de filtres de beauté nécessitant un accès à la caméra), le kit SDK de diffusion n'est plus responsable de la gestion de la caméra. Au lieu de cela, l'application est chargée de gérer correctement le cycle de vie de la caméra. Consultez la documentation officielle de la plateforme sur la façon dont votre application doit gérer la caméra.

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

Après avoir créé une séance de diffusion, créez une source d'entrée d'image : 

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

Cette méthode renvoie un `SurfaceSource`, qui est une source basée sur un Android [Surface](https://developer.android.com/reference/android/view/Surface) standard. Il est automatiquement attaché à la séance de diffusion, vous n'avez donc pas à utiliser la méthode `attachDevice(...)` par la suite. Cependant, le `SurfaceSource` doit être lié à un emplacement. Ce sujet est abordé plus loin. Le `SurfaceSource` peut être redimensionné et pivoté. Vous pouvez également créer un `ImagePreviewView` pour afficher un aperçu de son contenu.

Pour récupérer la sous-jacente  `Surface`:

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

Cette `Surface` peut être utilisée comme tampon de sortie pour les producteurs d'images tels que Camera2, OpenGL ES et d'autres bibliothèques. Le cas d'utilisation le plus simple consiste à dessiner directement un bitmap statique ou une couleur dans le canevas de la surface. Cependant, de nombreuses bibliothèques (telles que les bibliothèques de filtres de beauté) fournissent une méthode qui permet à une application de spécifier une `Surface` externe pour le rendu. Vous pouvez utiliser une telle méthode pour transmettre cette `Surface` à la bibliothèque de filtres, ce qui permet à cette dernière de produire des images traitées pour la séance de diffusion.

Enfin, la `SurfaceSource` doit être lié à un `Mixer.Slot` pour être diffusé par la séance de diffusion :

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

L'[Exemple de code Android](https://github.com/aws-samples/amazon-ivs-broadcast-android-sample) contient plusieurs exemples qui utilisent une source d'image personnalisée de différentes manières :
+ Un filigrane semi-transparent est ajouté dans le `MixerActivity`.
+ Un fichier MP4 s'exécute en boucle dans le `MixerActivity`.
+ La classe d'utilisateur [CameraManager](https://github.com/aws-samples/amazon-ivs-broadcast-android-sample/blob/main/app/src/main/java/com/amazonaws/ivs/basicbroadcast/common/CameraManager.kt) assure la gestion personnalisée de la caméra de l'appareil à l'aide de la méthode Camera2 dans le `CustomActivity`, qui applique un filtre sépia simple. Cet exemple est particulièrement utile puisqu'il montre comment gérer la caméra et transmettre la `SurfaceSource` personnalisée de la séance de diffusion à la demande de capture de la caméra. Si vous utilisez d'autres bibliothèques externes, reportez-vous à leur documentation sur la façon de configurer la bibliothèque pour qu'elle sorte sur la `Surface` Android fournie par la séance de diffusion.

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

Après avoir créé la séance de diffusion, créez une source d'entrée d'image :

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

Cette méthode renvoie une `IVSCustomImageSource`, une source d'image qui permet à l'application de soumettre `CMSampleBuffers` manuellement. Pour connaître les formats de pixels pris en charge, consultez la référence du kit SDK de diffusion iOS. Un lien vers la version la plus récente se trouve dans les [notes de mise à jour Amazon IVS](release-notes.md) pour la dernière version du kit SDK de diffusion. La source n'est pas automatiquement attachée à la séance de diffusion. Vous devez donc attacher la source d'image à la séance et la lier à un emplacement avant que la source ne soit diffusée :

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

Une fois que la source personnalisée est attachée et liée, l'application peut soumettre `CMSampleBuffers` directement à la source personnalisée. Vous pouvez choisir d'utiliser le rappel `onComplete` pour débuter cette opération.

Les exemples soumis à la source personnalisée seront diffusés lors de la séance de diffusion :

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

Pour diffuser des vidéos en streaming, utilisez cette méthode dans un rappel. Par exemple, si vous utilisez la caméra, chaque fois qu'un nouvel exemple de tampon est reçu d'une `AVCaptureSession`, l'application peut transférer l'exemple de tampon vers la source d'image personnalisée. Si vous le souhaitez, l'application peut appliquer un traitement supplémentaire (comme un filtre de beauté) avant de soumettre l'exemple à la source d'image personnalisée.

Pour une image statique, après le premier exemple, l'application doit renvoyer l'exemple si la liaison de l'emplacement de la source d'image personnalisée est modifiée ou si la source est détachée et rattachée à la séance de diffusion. Par exemple, si vous supprimez l'emplacement puis que vous l'ajoutez au mixage, vous devez renvoyer l'exemple.

L'[Exemple d'application iOS](https://github.com/aws-samples/amazon-ivs-broadcast-ios-sample) contient plusieurs exemples qui utilisent une source d'image personnalisée de différentes manières :
+ Un filigrane semi-transparent est ajouté dans `MixerViewController`.
+ Un fichier MP4 s'exécute en boucle dans `MixerViewController`.
+ Une implémentation CIFilter avec une caméra de périphérique est ajoutée dans `CustomSourcesViewController`. Cela permet à une application de gérer une caméra d'appareil indépendamment du kit SDK de diffusion Amazon IVS. Elle utilise `AVCaptureSession` pour capturer une image à partir de la caméra de l'appareil, traite l'image à l'aide d'une implémentation CIFilter et soumet `CMSampleBuffers` pour `customSource` pour la diffusion en direct.