

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Transférer vers Kinesis Video Streams
<a name="producer-sdk"></a>

Les bibliothèques de production Amazon Kinesis Video Streams sont un ensemble de bibliothèques du SDK de production Kinesis Video Streams. Le client utilise les bibliothèques et le SDK pour créer l'application intégrée à l'appareil afin de se connecter en toute sécurité à Kinesis Video Streams et de diffuser des données multimédia à visualiser sur la console ou dans les applications clientes en temps réel. 

Les données média peuvent être diffusées en continu des manières suivantes :
+ En temps réel
+ Après l'avoir mis en mémoire tampon pendant quelques secondes
+ Après le téléchargement des médias

Après avoir créé un flux Kinesis Video Streams, vous pouvez commencer à y envoyer des données. Vous pouvez utiliser le SDK pour créer un code d'application qui extrait les données vidéo, appelées images, de la source multimédia et les télécharge sur Kinesis Video Streams. Ces applications sont également désignées comme applications *producteur*.

Les bibliothèques du producteur contiennent les composants suivants :
+ [Client producteur Kinesis Video Streams](#producer-sdk-client)
+ [Bibliothèque destinée aux producteurs de Kinesis Video Streams](#producer-sdk-library)

## Client producteur Kinesis Video Streams
<a name="producer-sdk-client"></a>

Le client Kinesis Video Streams Producer inclut une `KinesisVideoClient` seule classe. Cette classe gère les sources multimédia, reçoit les données des sources et gère le cycle de vie des flux lorsque les données circulent d'une source multimédia vers Kinesis Video Streams. Il fournit également une `MediaSource` interface permettant de définir l'interaction entre Kinesis Video Streams et votre matériel et logiciels propriétaires.

Une source média peut être constituée de presque tout élément. Par exemple, vous pouvez utiliser une source média sous la forme d'une caméra ou d'un microphone. Les sources média ne se limitent pas aux sources audio et vidéo. Par exemple, les journaux de données peuvent être des fichiers texte mais ils peuvent tout de même être envoyés comme flux de données. Vous pourriez également avoir plusieurs appareils photo sur votre téléphone diffusant les données simultanément.

Pour obtenir des données à partir de l'une de ces sources, vous pouvez implémenter l'interface `MediaSource`. Cette interface permet d'autres scénarios pour lesquels nous ne proposons aucune prise en charge intégrée. Par exemple, vous pouvez choisir d'envoyer ce qui suit à Kinesis Video Streams :
+ Un flux de données de diagnostic (par exemple, des journaux d'application et des événements)
+ Données provenant de caméras infrarouges ou de caméras de profondeur RADARs

Kinesis Video Streams ne fournit pas d'implémentations intégrées pour les appareils de production multimédia tels que les caméras. Pour extraire les données de ces appareils, vous devez mettre en place le code, créant ainsi votre propre implémentation de source média personnalisée. Vous pouvez ensuite enregistrer explicitement vos sources multimédia personnalisées auprès de laquelle `KinesisVideoClient` les données sont transférées vers Kinesis Video Streams.

Le client Kinesis Video Streams Producer est disponible pour les applications Java et Android. Pour plus d’informations, consultez [Utiliser la bibliothèque Java Producer](producer-sdk-javaapi.md) et [Utiliser la bibliothèque du producteur Android](producer-sdk-android.md).

## Bibliothèque destinée aux producteurs de Kinesis Video Streams
<a name="producer-sdk-library"></a>

La bibliothèque de production Kinesis Video Streams est contenue dans le client de production Kinesis Video Streams. La bibliothèque peut également être utilisée directement par ceux qui souhaitent une intégration plus poussée avec Kinesis Video Streams. Il permet l'intégration à partir d'appareils avec des systèmes d'exploitation brevetés, des piles de réseau ou des ressources limitées sur l'appareil.

La bibliothèque de production Kinesis Video Streams implémente la machine à états pour le streaming vers Kinesis Video Streams. Elle fournit des hooks de rappel, qui nécessitent que vous fournissez votre propre implémentation de transport et que vous traitiez explicitement entrant et sortant du service.

Vous pouvez choisir d'utiliser directement la bibliothèque de production Kinesis Video Streams pour les raisons suivantes : 
+ Le périphérique sur lequel vous souhaitez exécuter l'application ne dispose d'aucune machine virtuelle Java.
+ Vous souhaitez écrire le code d'application dans d'autres langages que celle de Java.
+ Vous souhaitez réduire la surcharge de votre code et la limiter au strict minimum d'abstraction, en raison de limitations telles que la mémoire et la puissance de traitement. 

Actuellement, la bibliothèque de production Kinesis Video Streams est disponible pour les applications Android, C, C\$1\$1 et Java. Pour plus d'informations, consultez les langues prises en charge dans les *rubriques connexes* suivantes.

## Découvrez ce que sont les bibliothèques destinées aux producteurs
<a name="producer-sdk-related-topics"></a>

 [Utiliser la bibliothèque Java Producer](producer-sdk-javaapi.md) 

 [Utiliser la bibliothèque du producteur Android](producer-sdk-android.md) 

 [Utiliser la bibliothèque de production C\$1\$1](producer-sdk-cpp.md) 

 [Utiliser la bibliothèque C Producer](producer-sdk-c-api.md) 

 [Utiliser le SDK du producteur C\$1\$1 sur le Raspberry Pi](producersdk-cpp-rpi.md) 

# Utiliser la bibliothèque Java Producer
<a name="producer-sdk-javaapi"></a>

Vous pouvez utiliser la bibliothèque de production Java fournie par Amazon Kinesis Video Streams pour écrire du code d'application avec une configuration minimale, afin d'envoyer des données multimédia d'un appareil vers un flux vidéo Kinesis. 

Procédez comme suit pour intégrer votre code à Kinesis Video Streams afin que votre application puisse commencer à diffuser des données vers votre flux vidéo Kinesis :

1. Créez une instance de l'objet `KinesisVideoClient`.

1. Créez un objet `MediaSource` en fournissant les informations de la source média. Par exemple, lors de la création d'une caméra en tant que source média, vous fournissez des informations permettant d'identifier la caméra et de spécifier le codage utilisé par la caméra.

   Lorsque vous souhaitez commencer le streaming, vous devez créer une source média personnalisée. 

1. Inscrivez la source média avec `KinesisVideoClient`. 

   Après avoir inscrit la source média avec `KinesisVideoClient`, chaque fois que les données deviennent disponibles avec la source média, il invoque `KinesisVideoClient` avec les données.

## Procédure : utiliser le SDK Java Producer
<a name="producer-sdk-java-using"></a>

Cette procédure explique comment utiliser le client Kinesis Video Streams Java Producer dans votre application Java pour envoyer des données à votre flux vidéo Kinesis. 

Ces étapes n'exigent pas que vous disposez d'une source média telle qu'une caméra ou un microphone. Par ailleurs, à des fins de test, le code génère des exemples d'images qui comprennent une série d'octets. Vous pouvez utiliser le même modèle de codage lorsque vous envoyez des données média provenant de sources réelles, par exemple des appareils photos ou des microphones. 

La procédure comprend les étapes suivantes :
+ [Téléchargez et configurez le code](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producersdk-javaapi-downloadcode.html)
+ [Écrire et examiner le code](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producersdk-javaapi-writecode.html)
+ [Exécutez et vérifiez le code](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producersdk-javaapi-reviewcode.html)

# Conditions préalables
<a name="producersdk-javaapi-prerequisites"></a>

Avant de configurer le SDK Java Producer, assurez-vous de remplir les conditions préalables suivantes : 
+ Dans l'exemple de code, vous fournissez des informations d'identification en spécifiant un profil que vous avez configuré dans votre fichier de profil AWS d'informations d'identification. Si vous n'y avez pas encore procédé, commencez par définir votre profil à informations d'identification. Pour plus d'informations, voir [Configurer les AWS informations d'identification et la région pour le développement](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html) dans le *AWS SDK pour Java*.
**Note**  
L'exemple Java utilise un `SystemPropertiesCredentialsProvider` objet pour obtenir vos informations d'identification. Le fournisseur extrait ces informations d'identification à partir des propriétés système Java `aws.accessKeyId` et `aws.secretKey`. Vous définissez ces propriétés système dans votre environnement de développement Java. Pour plus d'informations sur la manière de définir les propriétés du système Java, consultez la documentation relative à votre environnement de développement intégré (IDE).
+ Vous `NativeLibraryPath` devez contenir votre `KinesisVideoProducerJNI` fichier, disponible à l'adresse [https://github.com/awslabs/amazon-kinesis-video-streams- producer-sdk-cpp](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp). L'extension du nom de fichier de ce fichier dépend de votre système d'exploitation : 
  + **KinesisVideoProducerJni.so** pour Linux
  + **KinesisVideoProducerJNI.dylib** pour macOS
  + **KinesisVideoProducerJNI.dll** pour Windows
**Note**  
Les bibliothèques prédéfinies pour macOS, Ubuntu, Windows et Raspbian sont disponibles `src/main/resources/lib` à l'adresse [https://github.com/awslabs/amazon-kinesis-video-streams- producer-sdk-java](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java) .git. Pour les autres environnements, compilez le [C\$1\$1](producer-sdk-cpp.md).

# Téléchargez et configurez le code de la bibliothèque Java Producer
<a name="producersdk-javaapi-downloadcode"></a>

Dans cette section de la procédure de bibliothèque Java Producer, vous allez télécharger l'exemple de code Java, importer le projet dans votre IDE Java et configurer les emplacements des bibliothèques. 

Pour les prérequis et d'autres informations sur cet exemple, consultez la section [Utilisation de la bibliothèque Java Producer](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-javaapi.html).



1. Créez un répertoire, puis clonez l'exemple de code source à partir du GitHub référentiel. 

   ```
   git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java
   ```

1. Ouvrez l'environnement de développement intégré (IDE) Java que vous utilisez (par exemple, [Eclipse](https://www.eclipse.org/) ou [JetBrains IntelliJ IDEA](https://www.jetbrains.com/idea/)) et importez le projet Apache Maven que vous avez téléchargé : 
   + **Dans IntelliJ IDEA : ** Choisissez **Importer**. Naviguez vers le fichier `pom.xml` dans la racine du package téléchargé.
   + **Dans Eclipse :** Choisissez **Fichier**, **Importer**, **Maven**, **Projets Maven existants**. Puis, accédez au répertoire `kinesis-video-java-demo`.

   Pour plus d'informations, consultez la documentation relative à votre IDE.

1. L'exemple de code Java utilise les AWS informations d'identification actuelles. Pour utiliser un autre profil à informations d'identification, recherchez le code suivant dabs `DemoAppMain.java` :

   ```
   final KinesisVideoClient kinesisVideoClient = KinesisVideoJavaClientFactory
       .createKinesisVideoClient(
           Regions.US_WEST_2,
           AuthHelper.getSystemPropertiesCredentialsProvider());
   ```

   Modifiez le code comme suit :

   ```
   final KinesisVideoClient kinesisVideoClient = KinesisVideoJavaClientFactory
       .createKinesisVideoClient(
           Regions.US_WEST_2,
           new ProfileCredentialsProvider("credentials-profile-name"));
   ```

   Pour plus d'informations, voir [ProfileCredentialsProvider](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/profile/ProfileCredentialsProvider.html) dans la référence *AWS SDK pour Java*.

# Écrire et examiner le code
<a name="producersdk-javaapi-writecode"></a>

Dans cette section de la [procédure de la bibliothèque Java Producer](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-javaapi.html), vous allez écrire et examiner l'exemple de code Java que vous avez téléchargé dans la section précédente. 

L'application de test Java ([https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java/blob/master/src/main/demo/com/amazonaws/kinesisvideo/demoapp/DemoAppMain.java](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java/blob/master/src/main/demo/com/amazonaws/kinesisvideo/demoapp/DemoAppMain.java)) présente le modèle de codage suivant :
+ Créez une instance de `KinesisVideoClient`.
+ Créez une instance de `MediaSource`.
+ Inscrivez la `MediaSource` avec le client.
+ Démarrez le streaming. Démarrez le `MediaSource` et il commence à envoyer des données au client.

Consultez les sections suivantes pour obtenir des détails.



## Créez une instance de KinesisVideoClient
<a name="producersdk-javaapi-review-code-create-client"></a>

Vous créez l'objet `KinesisVideoClient` en appelant l'opération `createKinesisVideoClient`.

```
final KinesisVideoClient kinesisVideoClient = KinesisVideoJavaClientFactory
    .createKinesisVideoClient(
        Regions.US_WEST_2,
        AuthHelper.getSystemPropertiesCredentialsProvider());
```

Pour que `KinesisVideoClient` passe des appels au réseau, il a besoin des informations d'identification. Vous transmettez une instance de `SystemPropertiesCredentialsProvider`, qui lit `AWSCredentials` pour le profil par défaut dans le fichier d'informations d'identification :

```
[default]
aws_access_key_id = ABCDEFGHIJKLMOPQRSTU
aws_secret_access_key = AbCd1234EfGh5678IjKl9012MnOp3456QrSt7890
```





## Créez une instance de MediaSource
<a name="producersdk-javaapi-review-code-create-mediasource"></a>

Pour envoyer des octets à votre flux vidéo Kinesis, vous devez produire les données. Amazon Kinesis Video Streams fournit `MediaSource` l'interface, qui représente la source de données.

Par exemple, la bibliothèque Java Kinesis Video Streams fournit `ImageFileMediaSource` l'implémentation de `MediaSource` l'interface. Cette classe lit uniquement les données d'une série de fichiers multimédia plutôt que d'un flux vidéo Kinesis, mais vous pouvez l'utiliser pour tester le code.

```
final MediaSource bytesMediaSource = createImageFileMediaSource();
```

## Enregistrez le MediaSource auprès du client
<a name="producersdk-javaapi-review-code-register-mediasource"></a>

Inscrivez la source média que vous avez créée avec le `KinesisVideoClient` afin qu'elle prenne connaissance du client (et puisse ensuite envoyer des données au client).

```
kinesisVideoClient.registerMediaSource(mediaSource);
```



## Démarrez la source multimédia
<a name="producersdk-javaapi-review-code-start-mediasource"></a>

Démarrez la source multimédia afin qu'elle puisse commencer à générer des données et à les envoyer au client.

```
bytesMediaSource.start();
```



# nettoyer des ressources ;
<a name="producersdk-javaapi-cleanup"></a>

Pour éviter les fuites de mémoire, procédez comme suit pour annuler l'enregistrement d'une source multimédia auprès du client et libérer le client.

```
try {
    kinesisVideoClient.unregisterMediaSource(mediaSource);
    kinesisVideoClient.free();
} catch (final KinesisVideoException e) {
    throw new RuntimeException(e);
}
```

Si vous avez ajouté des éléments au cache en utilisant [https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java/blob/master/src/main/java/com/amazonaws/kinesisvideo/java/service/CachedInfoMultiAuthServiceCallbacksImpl.java](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java/blob/master/src/main/java/com/amazonaws/kinesisvideo/java/service/CachedInfoMultiAuthServiceCallbacksImpl.java), par exemple :

```
serviceCallbacks.addStreamInfoToCache(streamName, streamInfo);
serviceCallbacks.addStreamingEndpointToCache(streamName, dataEndpoint);
```

Videz le cache lorsque vous avez terminé :

```
serviceCallbacks.removeStreamFromCache(streamName);
```

# Exécutez et vérifiez le code
<a name="producersdk-javaapi-reviewcode"></a>

Pour exécuter le harnais de test Java pour la [bibliothèque Java Producer](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-javaapi.html), procédez comme suit.

1. Sélectionnez **DemoAppMain**.

1. Choisissez **Exécuter**, **Exécuter « DemoAppMain »**.

1. Ajoutez vos informations d'identification aux arguments JVM pour l'application :
   + **Pour les informations d' AWS identification non temporaires :** `"-Daws.accessKeyId={YourAwsAccessKey} -Daws.secretKey={YourAwsSecretKey} -Djava.library.path={NativeLibraryPath}"` 
   + **Pour les AWS informations d'identification temporaires :** `"-Daws.accessKeyId={YourAwsAccessKey} -Daws.secretKey={YourAwsSecretKey} -Daws.sessionToken={YourAwsSessionToken} -Djava.library.path={NativeLibraryPath}" ` 

1. Connectez-vous à la console [Kinesis Video Streams AWS Management Console](https://console.aws.amazon.com//kinesisvideo/home/) et ouvrez-la. 

   Sur la page **Gérer les flux**, choisissez votre flux.

1. L'échantillon vidéo sera lu dans le lecteur intégré. Vous devrez peut-être patienter un court instant (jusqu'à dix secondes dans des conditions de processeur et de bande passante classiques) pendant que les images s'accumulent avant l'affichage de la vidéo.

L'exemple de code crée un flux. Lorsque l'élément `MediaSource` du code démarre, il commence à envoyer des échantillons d'images à `KinesisVideoClient`. Le client envoie ensuite les données vers votre flux vidéo Kinesis. 

# Utiliser la bibliothèque du producteur Android
<a name="producer-sdk-android"></a>

Vous pouvez utiliser la bibliothèque de production Android fournie par Amazon Kinesis Video Streams pour écrire du code d'application, avec une configuration minimale, afin d'envoyer des données multimédia d'un appareil Android vers un flux vidéo Kinesis. 

Procédez comme suit pour intégrer votre code à Kinesis Video Streams afin que votre application puisse commencer à diffuser des données vers votre flux vidéo Kinesis :

1. Créez une instance de l'objet `KinesisVideoClient`. 

1. Créez un objet `MediaSource` en fournissant les informations de la source média. Par exemple, lors de la création d'une caméra en tant que source média, vous fournissez des informations permettant d'identifier la caméra et de spécifier le codage utilisé par la caméra.

   Lorsque vous souhaitez commencer le streaming, vous devez créer une source média personnalisée. 

## Procédure : utilisez le SDK Android Producer
<a name="producer-sdk-android-using"></a>

Cette procédure explique comment utiliser le client Kinesis Video Streams Android Producer dans votre application Android pour envoyer des données vers votre flux vidéo Kinesis. 

La procédure comprend les étapes suivantes :
+ [Conditions préalables](producersdk-android-prerequisites.md)
+ [Téléchargez et configurez le code de la bibliothèque du producteur Android](producersdk-android-downloadcode.md)
+ [Examinez le code](producersdk-android-writecode.md)
+ [Exécutez et vérifiez le code](producersdk-android-reviewcode.md)

# Conditions préalables
<a name="producersdk-android-prerequisites"></a>

Nous vous recommandons [Android Studio](https://developer.android.com/studio/index.html) pour la vérification, la modification et l'exécution du code de l'application. Nous vous recommandons d'utiliser la dernière version stable.

Dans l'exemple de code, vous fournissez les informations d'identification Amazon Cognito.

**Topics**
+ [Configuration d'un groupe d'utilisateurs](#set-up-user-pool)
+ [Configuration d'un pool d'identités](#set-up-identity-pool)

## Configuration d'un groupe d'utilisateurs
<a name="set-up-user-pool"></a>

**Pour configurer un groupe d'utilisateurs**

1. Connectez-vous à la [console Amazon Cognito](https://console.aws.amazon.com/cognito/home) et vérifiez que la région est correcte.

1. Dans le menu de navigation de gauche, choisissez **Groupes d'utilisateurs**.

1. Dans la section **Groupes d'utilisateurs**, choisissez **Créer un groupe d'utilisateurs**.

1. Complétez les sections suivantes :

   1. **Étape 1 : Configuration de l'expérience de connexion** - Dans la section des options de **connexion au groupe d'utilisateurs de Cognito**, sélectionnez les options appropriées.

      Sélectionnez **Suivant**.

   1. **Étape 2 : Configuration des exigences de sécurité** - Sélectionnez les options appropriées.

      Sélectionnez **Suivant**.

   1. **Étape 3 : Configuration de l'expérience d'inscription** - Sélectionnez les options appropriées.

      Sélectionnez **Suivant**.

   1. **Étape 4 : Configuration de la livraison des messages** - Sélectionnez les options appropriées.

      Dans le champ de **sélection du rôle IAM**, sélectionnez un rôle existant ou créez-en un nouveau.

      Sélectionnez **Suivant**.

   1. **Étape 5 : Intégrez votre application** - Sélectionnez les options appropriées.

      Dans le champ **Client initial de l'application**, sélectionnez **Client confidentiel**.

      Sélectionnez **Suivant**.

   1. **Étape 6 : révision et création** : passez en revue les sélections des sections précédentes, puis choisissez **Créer un groupe d'utilisateurs**.

1. Sur la page **Groupes d'utilisateurs**, sélectionnez le pool que vous venez de créer.

   Copiez l'**ID du groupe d'utilisateurs** et notez-le pour plus tard. Dans le `awsconfiguration.json` dossier, c'est`CognitoUserPool.Default.PoolId`.

1. Sélectionnez l'onglet **Intégration des applications** et rendez-vous au bas de la page.

1. Dans la section **Liste des clients de l'application**, choisissez le **nom du client de l'application** que vous venez de créer.

   Copiez l'**ID client** et notez-le pour plus tard. Dans le `awsconfiguration.json` dossier, c'est`CognitoUserPool.Default.AppClientId`.

1. Affichez le **secret du client** et notez-le pour plus tard. Dans le `awsconfiguration.json` dossier, c'est`CognitoUserPool.Default.AppClientSecret`.

## Configuration d'un pool d'identités
<a name="set-up-identity-pool"></a>

**Pour configurer un pool d'identités**

1. Connectez-vous à la [console Amazon Cognito](https://console.aws.amazon.com/cognito/home) et vérifiez que la région est correcte.

1. Dans le menu de navigation de gauche, choisissez **Identity pools**.

1. Choisissez **Créer un groupe d'identités**.

1. Configurez le pool d'identités.

   1. **Étape 1 : Configurer la confiance du pool d'identités** - Complétez les sections suivantes :
      + **Accès utilisateur** : sélectionnez Accès **authentifié**
      + **Sources d'identité authentifiées** : sélectionnez le groupe d'**utilisateurs Amazon Cognito**

      Sélectionnez **Suivant**.

   1. **Étape 2 : Configuration des autorisations** - Dans la section **Rôle authentifié**, renseignez les champs suivants :
      + **Rôle IAM** - Sélectionnez **Créer un nouveau rôle IAM**
      + **Nom du rôle IAM** : entrez un nom et notez-le pour une étape ultérieure.

      Sélectionnez **Suivant**.

   1. **Étape 3 : Connecter les fournisseurs d'identité** - Dans la section **Détails du groupe d'utilisateurs**, complétez les champs suivants : 
      + **ID du groupe d'utilisateurs** : sélectionnez le groupe d'utilisateurs que vous avez créé précédemment.
      + **ID du client de l'application** : sélectionnez l'ID du client de l'application que vous avez créé précédemment.

      Sélectionnez **Suivant**.

   1. **Étape 4 : Configuration des propriétés** - Entrez un nom dans le champ **Nom du pool d'identités**.

      Sélectionnez **Suivant**.

   1. **Étape 5 : révision et création** : passez en revue vos sélections dans chacune des sections, puis sélectionnez **Créer un pool d'identités**.

1. Sur la page **Groupes d'identités**, sélectionnez votre nouveau pool d'identités.

   Copiez l'**ID du pool d'identités** et notez-le pour plus tard. Dans le `awsconfiguration.json` dossier, c'est`CredentialsProvider.CognitoIdentity.Default.PoolId`.

1. Mettez à jour les autorisations pour le rôle IAM.

   1. Connectez-vous à la console IAM AWS Management Console et ouvrez-la à [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)l'adresse.

   1. Dans le menu de navigation de gauche, sélectionnez **Rôles**.

   1. Recherchez et sélectionnez le rôle que vous avez créé ci-dessus.
**Note**  
Utilisez la barre de recherche, si nécessaire.

   1. Sélectionnez la politique d'autorisation jointe.

      Tâche de sélection **Modifier**.

   1. Sélectionnez l'onglet **JSON** et remplacez la politique par la suivante :

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "cognito-identity:*",
                      "kinesisvideo:*"
                  ],
                  "Resource": [
                      "*"
                  ]
              }
          ]
      }
      ```

------

      Sélectionnez **Suivant**.

   1. Cochez la case à côté de **Définir cette nouvelle version comme version par défaut** si elle n'est pas déjà sélectionnée.

      Cliquez sur **Enregistrer les modifications**.

# Téléchargez et configurez le code de la bibliothèque du producteur Android
<a name="producersdk-android-downloadcode"></a>

Dans cette section de la procédure de la bibliothèque Android Producer, vous allez télécharger l'exemple de code Android et ouvrir le projet dans Android Studio. 

Pour les prérequis et d'autres informations concernant cet exemple, consultez la section [Utilisation de la bibliothèque du producteur Android](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html).



1. Créez un répertoire, puis clonez-le AWS Mobile SDK pour Android à partir du GitHub référentiel. 

   ```
   git clone https://github.com/awslabs/aws-sdk-android-samples
   ```

1. Ouvrez [Android Studio](https://developer.android.com/studio/index.html).

1. Dans l'écran qui s'affiche, choisissez **Open an existing Android Studio project**.

1. Accédez au répertoire `aws-sdk-android-samples/AmazonKinesisVideoDemoApp` et choisissez **OK**.

1. Ouvrez le fichier `AmazonKinesisVideoDemoApp/src/main/res/raw/awsconfiguration.json`.

   Dans le `CredentialsProvider` nœud, indiquez l'ID du pool d'identités indiqué dans la procédure **Pour configurer un pool d'identités** de la section [Conditions préalables](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html#producersdk-android-prerequisites), ainsi que le vôtre Région AWS (par exemple,**us-west-2**).

   Dans le `CognitoUserPool` nœud, indiquez le secret du client de l'application, l'identifiant du client de l'application et l'identifiant du pool indiqués dans la procédure **Pour configurer un groupe d'utilisateurs** de la section [Conditions préalables](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html#producersdk-android-prerequisites), et indiquez le vôtre Région AWS (par exemple,**us-west-2**).

1. Votre fichier `awsconfiguration.json` est alors similaire à ce qui suit :

   ```
   {
     "Version": "1.0",
     "CredentialsProvider": {
       "CognitoIdentity": {
         "Default": {
           "PoolId": "us-west-2:01234567-89ab-cdef-0123-456789abcdef",
           "Region": "us-west-2"
         }
       }
     },
     "IdentityManager": {
       "Default": {}
     },
     "CognitoUserPool": {
       "Default": {
         "AppClientSecret": "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmno",
         "AppClientId": "0123456789abcdefghijklmnop",
         "PoolId": "us-west-2_qRsTuVwXy",
         "Region": "us-west-2"
       }
     }
   }
   ```

1. Mettez-la à jour `AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/KinesisVideoDemoApp.java` avec votre région (dans l'exemple suivant, elle est définie sur **US\$1WEST\$12**) : 

   ```
   public class KinesisVideoDemoApp extends Application {
       public static final String TAG = KinesisVideoDemoApp.class.getSimpleName();
       public static Regions KINESIS_VIDEO_REGION = Regions.US_WEST_2;
   ```

   Pour plus d'informations sur les Région AWS constantes, reportez-vous à la section [Régions](https://aws-amplify.github.io/aws-sdk-android/docs/reference/com/amazonaws/regions/Regions.html).

# Examinez le code
<a name="producersdk-android-writecode"></a>

Dans cette section de la [procédure de la bibliothèque Android Producer](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html), vous allez examiner l'exemple de code. 

L'application de test Android (`AmazonKinesisVideoDemoApp`) présente le modèle de codage suivant :
+ Créez une instance de `KinesisVideoClient`.
+ Créez une instance de `MediaSource`.
+ Démarrez le streaming. Démarrez le`MediaSource`, et il commence à envoyer des données au client.

Consultez les sections suivantes pour obtenir des détails.



## Créez une instance de KinesisVideoClient
<a name="producersdk-android-review-code-create-client"></a>

Vous créez l'objet `[KinesisVideoClient](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/kinesisvideo/client/KinesisVideoClient.java)` en appelant l'opération `[createKinesisVideoClient](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/mobileconnectors/kinesisvideo/client/KinesisVideoAndroidClientFactory.java)`.

```
mKinesisVideoClient = KinesisVideoAndroidClientFactory.createKinesisVideoClient(
                    getActivity(),
                    KinesisVideoDemoApp.KINESIS_VIDEO_REGION,
                    KinesisVideoDemoApp.getCredentialsProvider());
```

Pour que `KinesisVideoClient` passe des appels au réseau, il a besoin des informations d'identification. Vous transmettez une instance de`AWSCredentialsProvider`, qui lit vos informations d'identification Amazon Cognito dans le `awsconfiguration.json` fichier que vous avez modifié dans la section précédente.

## Créez une instance de MediaSource
<a name="producersdk-android-review-code-create-mediasource"></a>

Pour envoyer des octets à votre flux vidéo Kinesis, vous devez produire les données. Amazon Kinesis Video Streams fournit `[MediaSource](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/kinesisvideo/internal/client/mediasource/MediaSource.java)` l'interface, qui représente la source de données.

Par exemple, la bibliothèque Android Kinesis Video Streams fournit `[AndroidCameraMediaSource](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/mobileconnectors/kinesisvideo/mediasource/android/AndroidCameraMediaSource.java)` l'implémentation de `MediaSource` l'interface. Cette classe lit des données à partir de l'une des caméras de l'appareil.

Dans l'exemple de code suivant (provenant du fichier `[fragment/StreamConfigurationFragment.java](https://github.com/awslabs/aws-sdk-android-samples/blob/main/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamConfigurationFragment.java)`), la configuration de la source multimédia est créée :

```
private AndroidCameraMediaSourceConfiguration getCurrentConfiguration() {
return new AndroidCameraMediaSourceConfiguration(
        AndroidCameraMediaSourceConfiguration.builder()
                .withCameraId(mCamerasDropdown.getSelectedItem().getCameraId())
                .withEncodingMimeType(mMimeTypeDropdown.getSelectedItem().getMimeType())
                .withHorizontalResolution(mResolutionDropdown.getSelectedItem().getWidth())
                .withVerticalResolution(mResolutionDropdown.getSelectedItem().getHeight())
                .withCameraFacing(mCamerasDropdown.getSelectedItem().getCameraFacing())
                .withIsEncoderHardwareAccelerated(
                        mCamerasDropdown.getSelectedItem().isEndcoderHardwareAccelerated())
                .withFrameRate(FRAMERATE_20)
                .withRetentionPeriodInHours(RETENTION_PERIOD_48_HOURS)
                .withEncodingBitRate(BITRATE_384_KBPS)
                .withCameraOrientation(-mCamerasDropdown.getSelectedItem().getCameraOrientation())
                .withNalAdaptationFlags(StreamInfo.NalAdaptationFlags.NAL_ADAPTATION_ANNEXB_CPD_AND_FRAME_NALS)
                .withIsAbsoluteTimecode(false));
}
```

Dans l'exemple de code suivant (provenant du fichier `[fragment/StreamingFragment.java](https://github.com/awslabs/aws-sdk-android-samples/blob/main/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamingFragment.java)`), la source multimédia est créée :

```
mCameraMediaSource = (AndroidCameraMediaSource) mKinesisVideoClient
    .createMediaSource(mStreamName, mConfiguration);
```

## Démarrez la source multimédia
<a name="producersdk-android-review-code-start-mediasource"></a>

Démarrez la source média afin qu'elle puisse commencer à générer des données et les envoyer au client. L'exemple de code suivant provient du fichier `[fragment/StreamingFragment.java](https://github.com/awslabs/aws-sdk-android-samples/blob/main/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamingFragment.java)` :

```
mCameraMediaSource.start();
```



# Exécutez et vérifiez le code
<a name="producersdk-android-reviewcode"></a>

Pour exécuter l'exemple d'application Android pour la [bibliothèque du producteur Android](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html), procédez comme suit.

1. Connectez-vous à un appareil Android.

1. Choisissez **Run**, **Run...**, puis **Edit configurations ...**.

1. Choisissez l'icône plus (**\$1**), **application Android**. Dans le champ **Nom**, saisissez **AmazonKinesisVideoDemoApp**. Dans le **menu déroulant Module**, choisissez. **AmazonKinesisVideoDemoApp** Choisissez **OK**.

1. Choisissez **Run**, **Run**.

1. Dans l'écran**Select Deployment Target**, sélectionnez votre appareil connecté, puis choisissez **OK**.

1. Dans l'**AWSKinesisVideoDemoApp**application de l'appareil, choisissez **Créer un nouveau compte**.

1. Entrez les valeurs de **USERNAME**, **Password**, **Given name**, **Email address** et **Phone number**, puis choisissez **Sign up**.
**Note**  
Ces valeurs sont soumises aux contraintes suivantes :  
**Password :** Doit contenir des lettres en majuscules et minuscules, des nombres et des caractères spéciaux. Vous pouvez modifier ces contraintes sur la page de votre groupe d'utilisateurs sur la console [Amazon Cognito](https://console.aws.amazon.com/cognito/home). 
**Email address :** Doit être une adresse valide afin que vous puissiez recevoir un code de confirmation.
**Numéro de téléphone :** Doit être au format suivant : **\$1*<Country code>**<Number>***, par exemple, **\$112065551212**.

1. Entrez le code que vous recevez par e-mail, puis cliquez sur **Confirmer**. Choisissez **OK**.

1. Sur la page suivante, conservez les valeurs par défaut et choisissez **Stream**.

1. Connectez-vous à la console [Kinesis Video Streams AWS Management Console](https://console.aws.amazon.com//kinesisvideo/home/) et ouvrez-la dans la région USA Ouest (Oregon). 

   Dans la page **Manage Streams**, choisissez **demo-stream**. 

1. La vidéo en streaming est lue dans le lecteur intégré. Vous devrez peut-être patienter un court instant (jusqu'à dix secondes dans des conditions de processeur et de bande passante classiques) pendant que les images s'accumulent avant l'affichage de la vidéo.
**Note**  
Si l'écran de l'appareil effectue une rotation (par exemple, de portrait à paysage), l'application cesse la diffusion en continu de la vidéo.

L'exemple de code crée un flux. Lorsque l'élément `MediaSource` démarre dans le code, il commence à envoyer des images de la caméra vers le `KinesisVideoClient`. **Le client envoie ensuite les données vers un flux vidéo Kinesis nommé demo-stream.** 

# Utiliser la bibliothèque de production C\$1\$1
<a name="producer-sdk-cpp"></a>

Vous pouvez utiliser la bibliothèque de production C\$1\$1 fournie par Amazon Kinesis Video Streams pour écrire du code d'application afin d'envoyer des données multimédia d'un appareil vers un flux vidéo Kinesis. 

## Modèle d'objet
<a name="producer-sdk-cpp-objectmodel"></a>

La bibliothèque C\$1\$1 fournit les objets suivants pour gérer l'envoi de données vers un flux vidéo Kinesis :
+ **KinesisVideoProducer:** contient des informations sur votre source multimédia et vos AWS informations d'identification, et gère des rappels pour signaler les événements liés à Kinesis Video Streams.
+ **KinesisVideoStream:** représente le flux vidéo Kinesis. Contient des informations sur les paramètres du flux vidéo, tels que le nom, la durée de conservation des données et le type de contenu multimédia.

## Insérez du contenu multimédia dans le stream
<a name="producer-sdk-cpp-putframe"></a>

Vous pouvez utiliser les méthodes fournies par la bibliothèque C\$1\$1 (par exemple,`PutFrame`) pour insérer des données dans l'`KinesisVideoStream`objet. La bibliothèque gère ensuite l'état interne des données, ce qui peut inclure les tâches suivantes : 
+ Réalisation de l'authentification.
+ Supervision de la latence du réseau. Si la latence est trop élevée, la bibliothèque peut choisir d'abandonner des images.
+ Suivi de l'état du streaming en cours.

## Interfaces de rappel
<a name="producer-sdk-cpp-callbacks"></a>

Cette couche propose un ensemble d'interfaces de rappel, ce qui lui permet de consulter la couche d'application. Parmi ces interfaces de rappel, on trouve :


+ **Interface de rappel de service (`CallbackProvider`) :** la bibliothèque invoque les événements obtenus via cette interface lorsqu'elle crée un flux, obtient une description de flux et supprime un flux.
+ **État prêt pour le client ou interface d'événements à faible capacité de stockage (`ClientCallbackProvider`) :** la bibliothèque invoque des événements sur cette interface lorsque le client est prêt ou lorsqu'elle détecte qu'il n'y a peut-être plus de stockage ou de mémoire disponible.
+ **Interface de rappel des événements de flux (`StreamCallbackProvider`) :** la bibliothèque invoque des événements sur cette interface lorsque des événements de flux se produisent, tels que l'entrée du flux dans l'état prêt, la perte d'images ou des erreurs de flux.

Kinesis Video Streams fournit des implémentations par défaut pour ces interfaces. Vous pouvez également fournir votre propre implémentation personnalisée, par exemple, si vous avez besoin d'une logique réseau personnalisée ou si vous souhaitez exposer l'interface utilisateur à un faible niveau de stockage.

Pour plus d'informations sur les rappels dans les bibliothèques du producteur, consultez[Rappels du SDK pour les producteurs](producer-reference-callbacks.md).

## Procédure : Utiliser le SDK du producteur C\$1\$1
<a name="producer-sdk-cpp-using"></a>

Cette procédure explique comment utiliser le client Kinesis Video Streams et les sources multimédia dans une application C\$1\$1 pour envoyer des données à votre flux vidéo Kinesis.

La procédure comprend les étapes suivantes :

**Topics**

# Conditions préalables
<a name="producer-sdk-cpp-prerequisites"></a>

Avant de configurer le SDK C\$1\$1 Producer, assurez-vous de remplir les conditions préalables suivantes : 
+ **Informations d'identification :** dans l'exemple de code, vous fournissez des informations d'identification en spécifiant un profil que vous avez configuré dans votre fichier de profil AWS d'informations d'identification. Si vous n'y avez pas encore procédé, commencez par définir votre profil à informations d'identification. 

  Pour plus d'informations, voir [Configurer les AWS informations d'identification et la région pour le développement](https://docs.aws.amazon.com//sdk-for-java/v1/developer-guide/setup-credentials.html).
+ **Intégration du magasin de certificats :** la bibliothèque du producteur Kinesis Video Streams doit établir un lien de confiance avec le service qu'elle appelle. Cela se fait en validant les autorités de certification (CAs) dans le magasin de certificats public. Sur les modèles basés sur Linux, ce magasin est localisé dans le répertoire `/etc/ssl`/. 

  Télécharger le certificat depuis l'emplacement suivant vers votre magasin de certificats :

  [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem)
+ Installez les dépendances de build suivantes pour macOS :
  + [Autoconf 2.69](http://www.gnu.org/software/autoconf/autoconf.html) (Licence GPLv3 \$1/Autoconf : GNU GPL version 3 ou ultérieure) 
  + [CMake 3.7 ou 3.8](https://cmake.org/)
  + [Pkg-Config](https://www.freedesktop.org/wiki/Software/pkg-config/)
  + xCode (macOS) / clang / gcc (xcode-select version 2347)
  + Kit de développement Java (JDK) (pour compilation Java JNI)
  + [Lib-Pkg](https://github.com/freebsd/pkg/tree/master/libpkg)
+ Installez les dépendances de build suivantes pour Ubuntu :
  + Git : `sudo apt install git`
  + [CMake](http://kitware.com/cmake): `sudo apt install cmake`
  + G \$1\$1 : `sudo apt install g++`
  + configuration du fichier : `sudo apt install pkg-config`
  + OpenJDK : `sudo apt install openjdk-8-jdk`
**Note**  
Cela n'est nécessaire que si vous créez une interface native Java (JNI).
  + Définissez la variable d'environnement :`JAVA_HOME` `export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/`

# Téléchargez et configurez le code de la bibliothèque C\$1\$1 Producer
<a name="producersdk-cpp-download"></a>

Pour plus d'informations sur le téléchargement et la configuration de la bibliothèque de production C\$1\$1, consultez [Amazon Kinesis Video Streams CPP Producer GStreamer , Plugin](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp) and JNI.

Pour les prérequis et plus d'informations sur cet exemple, consultez[Utiliser la bibliothèque de production C\$1\$1](producer-sdk-cpp.md).

## CMake arguments
<a name="cmake-arguments"></a>

Vous trouverez ci-dessous un tableau de référence pour les arguments spécifiques au SDK CMake C\$1\$1 Producer. Vous pouvez également transmettre les [ CMake options CMake standard](https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html) à.

**Important**  
Elles sont toutes facultatives.

**Drapeaux indiquant l'inclusion ou l'exclusion de certaines fonctionnalités**


| CMake argument | Type | Par défaut | Explication | 
| --- | --- | --- | --- | 
| `BUILD_DEPENDENCIES` |  Booléen  |  ON  | Créez des dépendances à partir de la source. Dans le cas contraire, utilisez les dépendances déjà installées sur le système. Si l'une des dépendances requises est introuvable, une erreur sera renvoyée. | 
| `BUILD_GSTREAMER_PLUGIN` | Booléen |  OFF  | Construit le kvssink GStreamer plugin. | 
|  `BUILD_JNI`  | Booléen |  OFF  | Construit l'interface native Java (JNI) pour pouvoir appeler ce code depuis un environnement d'exécution Java. | 
|  `ALIGNED_MEMORY_MODEL`  | Booléen |  OFF  | Si les allocations de mémoire doivent être alignées sur des limites de 8 octets. Certaines architectures n'autorisent pas l'accès à la mémoire non aligné. | 
| `CONSTRAINED_DEVICE` | Booléen |  OFF  | Uniquement pour les appareils autres que Windows. Lorsque cette option est activée, définit la taille de la pile de threads sur0.5 MiB. Nécessaire pour les versions d'[Alpine Linux](https://wiki.alpinelinux.org/wiki/Main_Page). Dans le cas contraire, c'est le système d'exploitation par défaut qui est utilisé. | 
|  `BUILD_STATIC`  | Booléen |  OFF  | Créez des bibliothèques et des exécutables [partagés](https://en.wikipedia.org/wiki/Shared_library) (OFF) ou [statiques](https://en.wikipedia.org/wiki/Static_library) (ON). | 
|  `ADD_MUCLIBC`  | Booléen |  OFF  | Lien vers [UClibc](https://en.wikipedia.org/wiki/UClibc) au lieu de la bibliothèque C standard, qui est une bibliothèque standard C plus petite conçue pour les systèmes embarqués. | 
|  `OPEN_SRC_INSTALL_PREFIX`  |  String  | .. /open-source/local | Emplacement où installer les dépendances open source, si vous créez à partir des sources. | 

**Drapeaux pour la compilation croisée**

**Important**  
Définissez ces paramètres si les architectures de processeur de votre machine cible et de votre machine hôte sont différentes.


| CMake argument | Type | Par défaut | Explication | 
| --- | --- | --- | --- | 
| `BUILD_LOG4CPLUS_HOST` |  String  |  ""  | Créez la log4cplus dépendance pour l'architecture de processeur spécifiée. S'il n'est pas défini, log4cplus il détectera automatiquement et utilisera l'architecture du processeur de la machine hôte. | 
| `BUILD_OPENSSL_PLATFORM`  |  String  |  ""  | Créez la OpenSSL dépendance pour l'architecture de processeur spécifiée. S'il n'est pas défini, OpenSSL il détectera automatiquement et utilisera l'architecture du processeur de la machine hôte. | 

**Drapeaux liés aux tests**


| CMake argument | Type | Par défaut | Explication | 
| --- | --- | --- | --- | 
| `BUILD_TEST` |  Booléen  |  OFF  | Créez les tests unitaires et d'intégration. Pour exécuter tous les tests, exécutez-les ./tst/producerTest depuis le répertoire de construction. AWS Des informations d'identification sont nécessaires pour exécuter les tests. | 
| `CODE_COVERAGE` | Booléen | OFF | Disponible uniquement pour les GNU/Clang compilateurs. Activez la collecte de la couverture du code avec [gcov et la génération](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html) de rapports. | 
| `COMPILER_WARNINGS` | Booléen | OFF | Disponible uniquement pour les GNU/Clang compilateurs. Activez tous les avertissements du compilateur. | 
| `ADDRESS_SANITIZER` | Booléen | OFF | Disponible uniquement pour les GNU/Clang compilateurs. Construisez avec [AddressSanitizer](https://compiler-rt.llvm.org/). | 
| `MEMORY_SANITIZER` | Booléen | OFF | Disponible uniquement pour les GNU/Clang compilateurs. Construisez avec [MemorySanitizer](https://compiler-rt.llvm.org/). | 
| `THREAD_SANITIZER` | Booléen | OFF | Disponible uniquement pour les GNU/Clang compilateurs. Construisez avec [ThreadSanitizer](https://compiler-rt.llvm.org/). | 
| `UNDEFINED_BEHAVIOR_SANITIZER` | Booléen | OFF | Disponible uniquement pour les GNU/Clang compilateurs. Construisez avec [UndefinedBehaviorSanitizer](https://compiler-rt.llvm.org/). | 

Pour utiliser ces CMake arguments, transmettez-les sous forme de liste de `-Dkey=value` paires séparées par des espaces après la `cmake ..` commande. Par exemple :

```
cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=OFF -DALIGNED_MEMORY_MODEL=ON 
```

CMake recherchera la chaîne d'outils du compilateur en suivant la `$PATH` variable. Avant l'exécution CMake, définissez les variables d'`CXX`environnement `CC` et pour définir explicitement la chaîne d'outils à utiliser pour la compilation croisée.

# Rédiger et examiner le code
<a name="producersdk-cpp-write"></a>

Dans cette section du[Utiliser la bibliothèque de production C\$1\$1](producer-sdk-cpp.md), vous examinez le code du harnais de test C\$1\$1 (`tst/ProducerTestFixture.h`et d'autres fichiers). Vous avez téléchargé ce code dans la section précédente.

L'exemple de **Plateforme indépendante** C\$1\$1 suivant illustre le modèle de codage suivant :
+ Créez une instance de `KinesisVideoProducer` pour accéder à Kinesis Video Streams.
+ Créez une instance de `KinesisVideoStream`. Cela crée un flux vidéo Kinesis dans votre Compte AWS si aucun flux du même nom n'existe déjà.
+ Appelez `putFrame` sur le `KinesisVideoStream` pour chaque image de données à mesure de sa disponibilité, pour l'envoyer au flux.

Les sections suivantes fournissent plus d'informations sur ce modèle de codage.



## Créez une instance de KinesisVideoProducer
<a name="producersdk-cpp-write-create-producer"></a>

Vous créez l'objet `KinesisVideoProducer` en appelant la méthode `KinesisVideoProducer::createSync`. L'exemple suivant crée l'`KinesisVideoProducer` dans le fichier `ProducerTestFixture.h` :

```
kinesis_video_producer_ = KinesisVideoProducer::createSync(move(device_provider_),
    move(client_callback_provider_),
    move(stream_callback_provider_),
    move(credential_provider_),
    defaultRegion_);
```

La méthode `createSync` prend les paramètres suivants :
+ Un objet `DeviceInfoProvider` qui renvoie un objet `DeviceInfo` contenant des informations relatives à la configuration de l'appareil ou du stockage.
**Note**  
Vous configurez la taille de votre magasin de contenu à l'aide du paramètre `deviceInfo.storageInfo.storageSize`. Vos flux de contenu partagent le magasin de contenu. Pour déterminer les exigences en termes de taille de stockage, multipliez la taille d'image moyenne par le nombre d'images stockées pendant la durée maximale pour tous les flux. Ensuite, multipliez le résultat par 1,2 pour prendre en compte la défragmentation. Par exemple, supposez que votre application a la configuration suivante :  
Trois flux
3 minutes de durée maximale
Chaque flux comprend 30 images par seconde (FPS)
Chaque image a une taille de 10 000 Ko
L'exigence de stockage de contenu pour cette application est de **3 (flux) \$1 3 (minutes) \$1 60 (secondes par minute) \$1 10000 (ko) \$1 1,2 (tolérance de défragmentation) = 194,4 Mo \$1 200 Mo**.
+ Un objet `ClientCallbackProvider` objet qui renvoie les pointeurs de fonction rapportant les événements spécifiques au client.
+ Un objet `StreamCallbackProvider` qui renvoie les pointeurs de fonction qui sont appelés lors d'événements spécifiques au flux.
+ Un `CredentialProvider` objet qui donne accès aux variables d'environnement AWS d'identification.
+ Le Région AWS (« us-west-2 »). Le point de terminaison de service est déterminé selon la région.

## Créez une instance de KinesisVideoStream
<a name="producersdk-cpp-write-create-stream"></a>

Vous créez l'objet `KinesisVideoStream` en appelant la méthode `KinesisVideoProducer::CreateStream` avec un paramètre `StreamDefinition`. L'exemple crée le flux `KinesisVideoStream` dans le fichier `ProducerTestFixture.h` avec le type de piste vidéo et l'ID de piste 1 :

```
auto stream_definition = make_unique<StreamDefinition>(stream_name,
                                               hours(2),
                                               tags,
                                               "",
                                               STREAMING_TYPE_REALTIME,
                                               "video/h264",
                                               milliseconds::zero(),
                                               seconds(2),
                                               milliseconds(1),
                                               true,
                                               true,
                                               true);
return kinesis_video_producer_->createStream(move(stream_definition));
```

L'objet `StreamDefinition` comporte les champs suivants :
+ Nom du flux.
+ Durée de conservation.
+ Balises pour le flux. Ces balises peuvent être utilisées par des applications de consommateurs pour trouver le bon flux ou pour obtenir plus d'informations sur le flux. Les balises peuvent également être affichés dans la AWS Management Console.
+ AWS KMS clé de chiffrement pour le flux. Pour de plus amples informations, veuillez consulter [Protection des données dans Kinesis Video Streams](how-kms.md).
+ Type de streaming. Actuellement, la seule valeur valide est `STREAMING_TYPE_REALTIME`.
+ Type de contenu média.
+ Latence de média. Cette valeur n'est pas utilisée actuellement et doit être définie sur 0.
+ Durée de lecture de chaque fragment.
+ Mise à l'échelle du timecode média.
+ Si le média utilise la fragmentation des images de la clé.
+ Si le média utilise des timecodes.
+ Si le média utilise des fragments absolus.

## Ajouter une piste audio au flux vidéo Kinesis
<a name="producersdk-cpp-write-add-audiotrack-to-stream"></a>

Vous pouvez ajouter les détails d'une piste audio à la définition d'un flux de piste vidéo en utilisant la `addTrack` méthode suivante `StreamDefinition` :

```
stream_definition->addTrack(DEFAULT_AUDIO_TRACKID, DEFAULT_AUDIO_TRACK_NAME, DEFAULT_AUDIO_CODEC_ID, MKV_TRACK_INFO_TYPE_AUDIO);
```

La `addTrack` méthode nécessite les paramètres suivants :
+ Identifiant de piste (identique à celui de l'audio). Il doit s'agir d'une valeur unique différente de zéro.
+ Nom de piste défini par l'utilisateur (par exemple, « audio » pour la piste audio). 
+ Identifiant du codec pour cette piste (par exemple, pour la piste audio « A\$1AAC »).
+ Type de piste (par exemple, utilisez la valeur enum de MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO pour l'audio). 

Si vous avez des données privées codec pour la piste audio, vous pouvez les transmettre lors de l'appel de la fonction addTrack. Vous pouvez également envoyer les données privées du codec après avoir créé l' KinesisVideoStream objet lors de l'appel de la méthode start in KinesisVideoStream.

## Insérer une image dans le flux vidéo Kinesis
<a name="producersdk-cpp-write-putframe"></a>

Vous insérez du contenu multimédia dans le flux vidéo Kinesis en utilisant`KinesisVideoStream::putFrame`, en transmettant un `Frame` objet contenant l'en-tête et les données multimédia. L'exemple appelle `putFrame` dans le fichier `ProducerApiTest.cpp` :

```
frame.duration = FRAME_DURATION_IN_MICROS * HUNDREDS_OF_NANOS_IN_A_MICROSECOND;
    frame.size = SIZEOF(frameBuffer_);
    frame.frameData = frameBuffer_;
    MEMSET(frame.frameData, 0x55, frame.size);

    while (!stop_producer_) {
        // Produce frames
        timestamp = std::chrono::duration_cast<std::chrono::nanoseconds>(
                std::chrono::system_clock::now().time_since_epoch()).count() / DEFAULT_TIME_UNIT_IN_NANOS;
        frame.index = index++;
        frame.decodingTs = timestamp;
        frame.presentationTs = timestamp;

        // Key frame every 50th
        frame.flags = (frame.index % 50 == 0) ? FRAME_FLAG_KEY_FRAME : FRAME_FLAG_NONE;
    ...

    EXPECT_TRUE(kinesis_video_stream->putFrame(frame));
```

**Note**  
L'exemple de producteur C\$1\$1 précédent envoie une mémoire tampon de données de test. Dans une application réelle, vous devez obtenir le tampon et la taille de l'image depuis les données de l'image à partir d'une source média (par exemple, une caméra).

L'objet `Frame` comporte les champs suivants :
+ Index d'image. Ce doit être une valeur croissante de manière monotone.
+ Indicateurs associés à l'image. Par exemple, si l'encodeur a été configuré pour produire un image de clé, cette image sera attribuée à l'indicateur `FRAME_FLAG_KEY_FRAME`.
+ Horodatage de décodage.
+ Horodatage de la présentation.
+ Durée de l'image (jusqu'à 100 unités ns).
+ Taille de l'image, en octets.
+ Données de l'image.

Pour plus d'informations sur le format du cadre, consultez [Modèle de données Kinesis Video Streams](how-data.md).

## Placer un KinesisVideoFrame dans une piste spécifique de KinesisVideoStream
<a name="producersdk-cpp-write-putframeintospecifictrack"></a>

Vous pouvez utiliser la `PutFrameHelper` classe pour placer des données de trame dans une piste spécifique. Tout d'abord, appelez le `getFrameDataBuffer` pour obtenir un pointeur vers l'un des tampons préalloués afin de renseigner les `KinesisVideoFrame` données. Ensuite, vous pouvez appeler le `putFrameMultiTrack` pour envoyer le `KinesisVideoFrame` avec la valeur booléenne pour indiquer le type de données de trame. Utilisez la valeur true s'il s'agit de données vidéo ou false si la trame contient des données audio. La `putFrameMultiTrack` méthode utilise un mécanisme de mise en file d'attente pour garantir que les fragments MKV conservent des horodatages d'image qui augmentent de façon monotone et que deux fragments ne se chevauchent pas. Par exemple, l'horodatage MKV de la première image d'un fragment doit toujours être supérieur à l'horodatage MKV de la dernière image du fragment précédent. 

`PutFrameHelper`comporte les champs suivants :
+ Nombre maximal d'images audio dans la file d'attente. 
+ Nombre maximum d'images vidéo dans la file d'attente.
+ Taille à allouer pour une seule image audio.
+ Taille à allouer pour une seule image vidéo.

## Métriques d'accès et journalisation des métriques
<a name="producersdk-cpp-write-metrics"></a>

Le SDK C\$1\$1 Producer inclut des fonctionnalités pour les métriques et la journalisation des métriques. 

Vous pouvez utiliser les opérations `getKinesisVideoMetrics` et `getKinesisVideoStreamMetrics` API pour récupérer des informations sur Kinesis Video Streams et vos flux actifs.

Le code suivant provient du fichier `kinesis-video-pic/src/client/include/com/amazonaws/kinesis/video/client/Include.h`.

```
/**
* Gets information about the storage availability.
*
* @param 1 CLIENT_HANDLE - the client object handle.
* @param 2 PKinesisVideoMetrics - OUT - Kinesis Video metrics to be filled.
*
* @return Status of the function call.
*/
PUBLIC_API STATUS getKinesisVideoMetrics(CLIENT_HANDLE, PKinesisVideoMetrics);

/**
* Gets information about the stream content view.
*
* @param 1 STREAM_HANDLE - the stream object handle.
* @param 2 PStreamMetrics - Stream metrics to fill.
*
* @return Status of the function call.
*/
PUBLIC_API STATUS getKinesisVideoStreamMetrics(STREAM_HANDLE, PStreamMetrics);
```

L'objet `PClientMetrics` rempli par `getKinesisVideoMetrics` contient les informations suivantes :
+ **contentStoreSize:** taille globale en octets du magasin de contenu (mémoire utilisée pour stocker les données de streaming).
+ **contentStoreAvailableTaille :** mémoire disponible dans le magasin de contenu, en octets.
+ **contentStoreAllocatedTaille :** mémoire allouée dans le magasin de contenu.
+ **totalContentViewsTaille :** mémoire totale utilisée pour l'affichage du contenu. L'affichage du contenu est une série d'indices d'informations dans le magasin de contenu.
+ **totalFrameRate:** le nombre total d'images par seconde pour tous les flux actifs.
+ **totalTransferRate:** le nombre total de bits par seconde (bps) envoyés dans tous les flux.

L'objet `PStreamMetrics` rempli par `getKinesisVideoStreamMetrics` contient les informations suivantes :
+ **currentViewDuration:** différence en unités de 100 ns entre la tête de la vue du contenu (lorsque les images sont codées) et la position actuelle (lorsque les données d'image sont envoyées à Kinesis Video Streams).
+ **overallViewDuration:** différence en unités de 100 ns entre la tête de la vue du contenu (lorsque les images sont codées) et la fin (lorsque les images sont vidées de la mémoire, soit parce que l'espace total alloué à l'affichage du contenu est dépassé, soit parce qu'un `PersistedAck` message est reçu de Kinesis Video Streams et que les images connues pour être persistantes sont vidées).
+ **currentViewSize:** taille en octets du contenu affiché entre la tête (lorsque les images sont codées) et la position actuelle (lorsque les images sont envoyées à Kinesis Video Streams).
+ **overallViewSize:** taille totale en octets de l'affichage du contenu.
+ **currentFrameRate:** dernière fréquence mesurée du flux, en images par seconde.
+ **currentTransferRate:** dernier débit mesuré du flux, en octets par seconde.

## Démontage
<a name="producersdk-cpp-write-teardown"></a>

Si vous souhaitez envoyer les octets restants dans un tampon et attendre le `ACK`, vous pouvez utiliser `stopSync` :

```
kinesis_video_stream->stopSync();            
```

Vous pouvez également appeler `stop` pour mettre fin au streaming : 

```
kinesis_video_stream->stop();            
```

Après avoir arrêté le flux, vous pouvez le libérer en appelant l'API suivante :

```
kinesis_video_producer_->freeStream(kinesis_video_stream);            
```

# Exécutez et vérifiez le code
<a name="producersdk-cpp-test"></a>

Pour exécuter et vérifier le code du[Utiliser la bibliothèque de production C\$1\$1](producer-sdk-cpp.md), consultez les instructions spécifiques au système d'exploitation suivantes :
+ [Linux](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/linux.md)
+ [macOS](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/macos.md)
+ [Windows](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/windows.md)
+ [OS Raspberry Pi](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/raspberry-pi.md)

Vous pouvez surveiller le trafic sur votre stream en observant les métriques associées à votre stream dans la CloudWatch console Amazon, telles que`PutMedia.IncomingBytes`.

# Utiliser le SDK C\$1\$1 Producer en tant que plugin GStreamer
<a name="producer-sdk-cpp-gstreamer"></a>

[GStreamer](https://gstreamer.freedesktop.org/)est un framework multimédia populaire utilisé par plusieurs caméras et sources vidéo pour créer des pipelines multimédias personnalisés en combinant des plugins modulaires. Le plugin Kinesis Video GStreamer Streams rationalise l'intégration de votre pipeline multimédia GStreamer existant à Kinesis Video Streams. 

Pour plus d'informations sur l'utilisation du SDK C\$1\$1 Producer en tant que GStreamer plug-in, consultez[Exemple : plugin GStreamer SDK Kinesis Video Streams Producer - kvssink](examples-gstreamer-plugin.md).

# Utiliser le SDK C\$1\$1 Producer en tant que GStreamer plugin dans un conteneur Docker
<a name="producer-sdk-cpp-gstreamer-docker"></a>

[GStreamer](https://gstreamer.freedesktop.org/)est un framework multimédia populaire utilisé par plusieurs caméras et sources vidéo pour créer des pipelines multimédias personnalisés en combinant des plugins modulaires. Le plugin Kinesis Video GStreamer Streams rationalise l'intégration de votre pipeline multimédia GStreamer existant à Kinesis Video Streams. 

En outre, l'utilisation de [Docker]() pour créer le GStreamer pipeline normalise l'environnement d'exploitation de Kinesis Video Streams, ce qui rationalise la création et l'exécution de l'application.

Pour plus d'informations sur l'utilisation du SDK C\$1\$1 Producer en tant que GStreamer plug-in dans un conteneur Docker, consultez. [Exécuter l' GStreamer élément dans un conteneur Docker](examples-gstreamer-plugin.md#examples-gstreamer-plugin-docker)

# Utiliser la journalisation avec le SDK C\$1\$1 Producer
<a name="producer-sdk-cpp-logging"></a>

Vous configurez la journalisation pour les applications du SDK C\$1\$1 Producer dans le `kvs_log_configuration` fichier du `kinesis-video-native-build` dossier.

L'exemple suivant montre la première ligne du fichier de configuration par défaut, qui configure l'application pour écrire les entrées de journal de niveau `DEBUG` dans la AWS Management Console:

```
log4cplus.rootLogger=DEBUG, KvsConsoleAppender
```

Vous pouvez définir le niveau de journalisation sur `INFO` pour une journalisation avec moins de commentaires.

Pour configurer l'application afin qu'elle écrive des entrées de journal dans un fichier journal, mettez à jour la première ligne du fichier comme suit :

```
log4cplus.rootLogger=DEBUG, KvsConsoleAppender, KvsFileAppender
```

Cela configure l'application pour écrire les entrées de journal dans `kvs.log`, dans le dossier `kinesis-video-native-build/log`.

Pour modifier l'emplacement du fichier journal, mettez à jour la ligne suivante avec le nouveau chemin d'accès :

```
log4cplus.appender.KvsFileAppender.File=./log/kvs.log
```

**Note**  
Si la journalisation de niveau `DEBUG` s'effectue dans un fichier, le fichier journal peut rapidement utiliser tout l'espace de stockage disponible sur l'appareil.

# Utiliser la bibliothèque C Producer
<a name="producer-sdk-c-api"></a>

Vous pouvez utiliser la bibliothèque C Producer fournie par Amazon Kinesis Video Streams pour écrire le code d'application permettant d'envoyer des données multimédia d'un appareil vers un flux vidéo Kinesis. 

## Modèle d'objet
<a name="producer-sdk-c-objectmodel"></a>

[La bibliothèque de production Kinesis Video Streams C est basée sur un composant commun appelé Platform Independent Codebase (PIC), disponible GitHub sur https://github.com/awslabs/ amazon-kinesis-video-streams -pic/.](https://github.com/awslabs/amazon-kinesis-video-streams-pic/) Le PIC contient une logique métier indépendante de la plate-forme pour les composants de base. La bibliothèque de production Kinesis Video Streams C intègre à PIC une couche supplémentaire d'API qui permet des rappels et des événements spécifiques au scénario et à la plate-forme. La bibliothèque de production Kinesis Video Streams C comprend les composants suivants basés sur PIC :
+ **Fournisseurs d'informations sur les appareils** : expose la `DeviceInfo` structure qui peut être directement fournie à l'API PIC. Vous pouvez configurer un ensemble de fournisseurs, y compris un fournisseur optimisé pour les scénarios d'application qui peut optimiser le magasin de contenu en fonction du nombre et des types de flux gérés par votre application et de la quantité de mémoire tampon requise configurée en fonction de la quantité de RAM disponible.
+ **Fournisseur d'informations de flux** — Expose la `StreamInfo` structure qui peut être directement fournie à l'API PIC. Il existe un ensemble de fournisseurs spécifiques aux types d'applications et aux types courants de scénarios de streaming. Il s'agit notamment de fournisseurs tels que la vidéo, l'audio et le multipiste audio et vidéo. Chacun de ces scénarios comporte des paramètres par défaut que vous pouvez personnaliser en fonction des exigences de votre application. 
+ **Fournisseur de rappel** — Expose la `ClientCallbacks` structure qui peut être directement fournie à l'API PIC. Cela inclut un ensemble de fournisseurs de rappels pour la mise en réseau (rappels d'API basés sur CURL), l'autorisation (API d'AWS identification) et le rappel des tentatives de streaming en cas d'erreur. L'API Callback Provider utilise un certain nombre d'arguments pour être configurée, tels que les informations d'autorisation Région AWS et. Cela se fait en utilisant des certificats IoT ou en utilisant AWS AccessKeyId SecretKey, ou SessionToken. Vous pouvez améliorer le fournisseur de rappel avec des rappels personnalisés si votre application a besoin du traitement ultérieur d’un rappel particulier pour répondre à une logique spécifique à une application.
+ **FrameOrderCoordinator**— Permet de gérer la synchronisation audio et vidéo pour les scénarios multipistes. Il possède un comportement par défaut, que vous pouvez personnaliser pour gérer la logique spécifique de votre application. Il rationalise également l'empaquetage des métadonnées de trame dans la structure PIC Frame avant de le soumettre à l'API PIC de couche inférieure. Pour les scénarios non multipistes, ce composant est une passerelle vers l’API putFrame PIC.

La bibliothèque C fournit les objets suivants pour gérer l'envoi de données vers un flux vidéo Kinesis :
+ **KinesisVideoClient**— Contient des informations sur votre appareil et gère des rappels pour signaler les événements liés à Kinesis Video Streams.
+ **KinesisVideoStream**— Représente des informations sur les paramètres du flux vidéo, tels que le nom, la durée de conservation des données et le type de contenu multimédia.

## Insérez du contenu multimédia dans le stream
<a name="producer-sdk-c-putframe"></a>

Vous pouvez utiliser les méthodes fournies par la bibliothèque C (par exemple,`PutKinesisVideoFrame`) pour insérer des données dans l'`KinesisVideoStream`objet. La bibliothèque gère ensuite l'état interne des données, ce qui peut inclure les tâches suivantes : 
+ Réalisation de l'authentification.
+ Supervision de la latence du réseau. Si la latence est trop élevée, la bibliothèque peut choisir d'abandonner des images.
+ Suivi de l'état du streaming en cours.

## Procédure : utiliser le SDK du producteur C
<a name="producer-sdk-c-using"></a>

Cette procédure explique comment utiliser le client Kinesis Video Streams et les sources multimédia dans une application C pour envoyer des images vidéo codées en H.264 vers votre flux vidéo Kinesis.

La procédure comprend les étapes suivantes :
+ [Téléchargez le code de la bibliothèque C Producer](producersdk-c-download.md)
+ [Rédiger et examiner le code](producersdk-c-write.md)
+ [Exécutez et vérifiez le code](producersdk-c-test.md)

# Conditions préalables
<a name="producer-sdk-c-prerequisites"></a>

Avant de configurer le SDK C Producer, assurez-vous de remplir les conditions préalables suivantes : 
+ **Informations d'identification** — Dans l'exemple de code, vous fournissez des informations d'identification en spécifiant un profil que vous avez configuré dans votre fichier de profil AWS d'informations d'identification. Si vous n'y avez pas encore procédé, commencez par définir votre profil à informations d'identification. 

  Pour plus d'informations, voir [Configurer les AWS informations d'identification et la région pour le développement](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html).
+ **Intégration du magasin de certificats** — La bibliothèque du producteur Kinesis Video Streams doit établir un lien de confiance avec le service qu'elle appelle. Cela se fait en validant les autorités de certification (CAs) dans le magasin de certificats public. Sur les modèles basés sur Linux, ce magasin est localisé dans le répertoire `/etc/ssl`/. 

  Télécharger le certificat depuis l'emplacement suivant vers votre magasin de certificats :

  [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem)
+ Installez les dépendances de build suivantes pour macOS :
  + [Autoconf 2.69](http://www.gnu.org/software/autoconf/autoconf.html) (Licence GPLv3 \$1/Autoconf : GNU GPL version 3 ou ultérieure) 
  + [CMake 3.7 ou 3.8](https://cmake.org/)
  + [Pkg-Config](https://www.freedesktop.org/wiki/Software/pkg-config/)
  + xCode (macOS) / clang / gcc (xcode-select version 2347)
  + Kit de développement Java (JDK) (pour compilation Java JNI)
  + [Lib-Pkg](https://github.com/freebsd/pkg/tree/master/libpkg)
+ Installez les dépendances de build suivantes pour Ubuntu :
  + Git : `sudo apt install git`
  + [CMake](http://kitware.com/cmake): `sudo apt install cmake`
  + G \$1\$1 : `sudo apt install g++`
  + configuration du fichier : `sudo apt install pkg-config`
  + OpenJDK : `sudo apt install openjdk-8-jdk`
  + Définissez la variable d'environnement :`JAVA_HOME` `export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/`

# Téléchargez le code de la bibliothèque C Producer
<a name="producersdk-c-download"></a>

Dans cette section, vous téléchargez les bibliothèques de bas niveau. Pour les conditions préalables et autres informations concernant cet exemple, consultez [Utiliser la bibliothèque de production C\$1\$1](producer-sdk-cpp.md).





1. Créez un répertoire, puis clonez l'exemple de code source à partir du GitHub référentiel. 

   ```
   git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git
   ```
**Note**  
Si vous n'exécutez pas la commande git clone avec `--recursive`, exécutez `git submodule update --init` dans le répertoire `amazon-kinesis-video-streams-producer-c/open-source`. Vous devez également installer pkg-config et un CMake environnement de construction.  
Pour plus d'informations, consultez le fichier `README.md` in [https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git).

1. Ouvrez le code dans l'environnement de développement intégré (IDE) de votre choix (par exemple, [Eclipse](https://www.eclipse.org/)).

# Rédiger et examiner le code
<a name="producersdk-c-write"></a>

Dans cette section, vous allez examiner le code de l'exemple d'application `KvsVideoOnlyStreamingSample.c` dans le `samples` dossier du dépôt [https://github.com/awslabs/amazon-kinesis-video-streams-producer-c](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c) on. GitHub Vous avez téléchargé ce code lors de l’étape précédente. Cet exemple montre comment utiliser la bibliothèque C Producer pour envoyer des images vidéo codées H.264 à l'intérieur du dossier vers `samples/h264SampleFrames` votre flux vidéo Kinesis.

Cet exemple d'application contient trois sections :
+ Initialisation et configuration :
  + Initialisation et configuration du pipeline de médias spécifique à la pateforme.
  + Initialisation et configuration KinesisVideoClient et KinesisVideoStream pour le pipeline, définition des rappels, intégration de l'authentification spécifique au scénario, extraction et soumission des données privées du codec et mise du flux à l'état READY.
+ Boucle principale :
  + Obtention de l’image de la part du pipeline multimédias avec les horodatages et les balises.
  + Soumission du cadre au KinesisVideoStream.
+ Démontage :
  + Arrêt (synchronisation) KinesisVideoStream, libération KinesisVideoStream, libération KinesisVideoClient.

Cet exemple d'application exécute les tâches suivantes :
+ Appelez l'API `createDefaultDeviceInfo` pour créer l'objet `deviceInfo` qui contient des informations sur le périphérique ou la configuration du stockage.

  ```
  // default storage size is 128MB. Use setDeviceInfoStorageSize after create to change storage size.
  CHK_STATUS(createDefaultDeviceInfo(&pDeviceInfo));
  // adjust members of pDeviceInfo here if needed
      pDeviceInfo->clientInfo.loggerLogLevel = LOG_LEVEL_DEBUG;
  ```
+ Appelez l'API `createRealtimeVideoStreamInfoProvider` pour créer l'objet `StreamInfo`.

  ```
  CHK_STATUS(createRealtimeVideoStreamInfoProvider(streamName, DEFAULT_RETENTION_PERIOD, DEFAULT_BUFFER_DURATION, &pStreamInfo));
  // adjust members of pStreamInfo here if needed
  ```
+ Appelez l'`createDefaultCallbacksProviderWithAwsCredentials`API pour créer le fournisseur de rappels par défaut sur la base d' AWS informations d'identification statiques.

  ```
  CHK_STATUS(createDefaultCallbacksProviderWithAwsCredentials(accessKey,
                                                                  secretKey,
                                                                  sessionToken,
                                                                  MAX_UINT64,
                                                                  region,
                                                                  cacertPath,
                                                                  NULL,
                                                                  NULL,
                                                                  FALSE,
                                                                  &pClientCallbacks));
  ```
+ Appelez l'`createKinesisVideoClient`API pour créer l'`KinesisVideoClient`objet qui contient des informations sur le stockage de votre appareil et gère les rappels pour signaler les événements Kinesis Video Streams.

  ```
  CHK_STATUS(createKinesisVideoClient(pDeviceInfo, pClientCallbacks, &clientHandle));                
  ```
+ Appelez l'API `createKinesisVideoStreamSync` pour créer l'objet `KinesisVideoStream`.

  ```
  CHK_STATUS(createKinesisVideoStreamSync(clientHandle, pStreamInfo, &streamHandle));                
  ```
+ Configurez un exemple d’image et appelez l’API `PutKinesisVideoFrame` pour envoyer cette image à l’objet `KinesisVideoStream`.

  ```
   // setup sample frame
      MEMSET(frameBuffer, 0x00, frameSize);
      frame.frameData = frameBuffer;
      frame.version = FRAME_CURRENT_VERSION;
      frame.trackId = DEFAULT_VIDEO_TRACK_ID;
      frame.duration = HUNDREDS_OF_NANOS_IN_A_SECOND / DEFAULT_FPS_VALUE;
      frame.decodingTs = defaultGetTime(); // current time
      frame.presentationTs = frame.decodingTs;
  
      while(defaultGetTime() > streamStopTime) {
          frame.index = frameIndex;
          frame.flags = fileIndex % DEFAULT_KEY_FRAME_INTERVAL == 0 ? FRAME_FLAG_KEY_FRAME : FRAME_FLAG_NONE;
          frame.size = SIZEOF(frameBuffer);
  
          CHK_STATUS(readFrameData(&frame, frameFilePath));
  
          CHK_STATUS(putKinesisVideoFrame(streamHandle, &frame));
          defaultThreadSleep(frame.duration);
  
          frame.decodingTs += frame.duration;
          frame.presentationTs = frame.decodingTs;
          frameIndex++;
          fileIndex++;
          fileIndex = fileIndex % NUMBER_OF_FRAME_FILES;
      }
  ```
+ Démontage :

  ```
  CHK_STATUS(stopKinesisVideoStreamSync(streamHandle));
  CHK_STATUS(freeKinesisVideoStream(&streamHandle));
  CHK_STATUS(freeKinesisVideoClient(&clientHandle));
  ```

# Exécutez et vérifiez le code
<a name="producersdk-c-test"></a>



Pour exécuter et vérifier le code du[Utiliser la bibliothèque de production C\$1\$1](producer-sdk-cpp.md), procédez comme suit :

1. Exécutez les commandes suivantes pour créer un `build` répertoire dans le [SDK C que vous avez téléchargé](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git), puis `cmake` lancez-le :

   ```
   mkdir -p amazon-kinesis-video-streams-producer-c/build; 
   cd amazon-kinesis-video-streams-producer-c/build; 
   cmake ..
   ```

   Vous pouvez transmettre les options suivantes à `cmake ..`
   + `-DBUILD_DEPENDENCIES`- s'il faut construire des bibliothèques dépendantes à partir des sources.
   + `-DBUILD_TEST=TRUE`- construire des tests unitaires et d'intégration. Cela peut être utile pour confirmer que votre appareil est compatible. 

     `./tst/webrtc_client_test`
   + `-DCODE_COVERAGE`- activer les rapports de couverture.
   + `-DCOMPILER_WARNINGS`- active tous les avertissements du compilateur.
   + `-DADDRESS_SANITIZER`- construire avec AddressSanitizer.
   + `-DMEMORY_SANITIZER`- construire avec MemorySanitizer.
   + `-DTHREAD_SANITIZER`- construire avec ThreadSanitizer.
   + `-DUNDEFINED_BEHAVIOR_SANITIZER`- construire avec UndefinedBehaviorSanitizer.
   + `-DALIGNED_MEMORY_MODEL` - créer pour les appareils avec modèle de mémoire alignés uniquement. La valeur par défaut est `OFF`.

1. Accédez au `build` répertoire que vous venez de créer à l'étape précédente et lancez-le `make` pour créer le SDK WebRTC C et les exemples fournis. 

   ```
   make                
   ```

1. L'exemple d'application `kinesis_video_cproducer_video_only_sample` envoie à Kinesis Video Streams des images vidéo codées en H.264 contenues dans `samples/h264SampleFrames` le dossier. La commande suivante envoie les images vidéo en boucle pendant dix secondes à Kinesis Video Streams :

   ```
   ./kinesis_video_cproducer_video_only_sample YourStreamName 10
   ```

   Si vous souhaitez envoyer des images codées en H.264 depuis un autre dossier (par exemple,`MyH264FramesFolder`), exécutez l'exemple avec les arguments suivants :

   ```
   ./kinesis_video_cproducer_video_only_sample YourStreamName 10 MyH264FramesFolder
   ```

1. Pour activer les journaux commentés, définissez les C-define `HEAP_DEBUG` et `LOG_STREAMING` en supprimant les commentaires des lignes appropriées dans `CMakeList.txt`.

Vous pouvez surveiller la progression de la gamme de test dans la sortie de débogage dans votre IDE. Vous pouvez également surveiller le trafic sur votre stream en regardant les métriques associées à votre stream dans la CloudWatch console Amazon, telles que`PutMedia.IncomingBytes`.

**Note**  
La console n'affiche pas les données sous forme de flux vidéo, dans la mesure où le harnais de test envoie uniquement des images vides en octets

# Utiliser le SDK du producteur C\$1\$1 sur le Raspberry Pi
<a name="producersdk-cpp-rpi"></a>

Le Raspberry Pi est un petit ordinateur peu onéreux qui peut être utilisé pour enseigner et apprendre des compétences élémentaires de programmation d'ordinateur. Ce didacticiel explique comment configurer et utiliser le SDK de production Amazon Kinesis Video Streams C\$1\$1 sur un appareil Raspberry Pi. Les étapes incluent également comment vérifier l'installation à l'aide de l'application de GStreamer démonstration.

**Topics**
+ [Conditions préalables](producersdk-cpp-rpi-prerequisites.md)
+ [Création d'un utilisateur IAM autorisé à écrire sur Kinesis Video Streams](producersdk-cpp-rpi-iam.md)
+ [Connectez votre Raspberry Pi à votre réseau Wi-Fi](producersdk-cpp-rpi-wifi.md)
+ [Connectez-vous à distance à votre Raspberry Pi](producersdk-cpp-rpi-connect.md)
+ [Configuration de la caméra Raspberry Pi](producersdk-cpp-rpi-camera.md)
+ [Installation des prérequis logiciels](producersdk-cpp-rpi-software.md)
+ [Téléchargez et créez le SDK Kinesis Video Streams C\$1\$1 pour le producteur](producersdk-cpp-rpi-download.md)
+ [Diffusez de la vidéo sur votre flux vidéo Kinesis](producersdk-cpp-rpi-run.md)
+ [Lire le contenu multimédia de votre flux vidéo Kinesis](producersdk-cpp-rpi-playback.md)
+ [Résolution des problèmes de compilation sur le SDK C\$1\$1 Producer pour Raspberry Pi](troubleshoot-rpi.md)

# Conditions préalables
<a name="producersdk-cpp-rpi-prerequisites"></a>

Avant de configurer le SDK du producteur C\$1\$1 sur votre Raspberry Pi, assurez-vous de remplir les conditions préalables suivantes : 
+ Un appareil Raspberry Pi doté de la configuration suivante :
  + Version de carte : Modèle 3 B ou version ultérieure.
  + Un [module de caméra](https://www.raspberrypi.com/documentation/accessories/camera.html) connecté ou une caméra USB connectée (webcam).
  + Une carte SD d'une capacité d'au moins 8 Go.
  + Le système d'exploitation Raspbian (version de noyau 4.9 ou ultérieure) installé. Vous pouvez télécharger la dernière image du système d'exploitation Raspberry Pi (précédemment appelé Raspbian) sur le [site Web du Raspberry Pi](https://www.raspberrypi.com/software/). Suivez les instructions de Raspberry Pi pour [installer l'image téléchargée sur une carte SD](https://www.raspberrypi.com/documentation/computers/getting-started.html#install-an-operating-system). 
+ Et Compte AWS avec un flux vidéo Kinesis. Pour plus d'informations, consultez [Démarrez avec Flux vidéo Kinesis](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/getting-started.html).

# Création d'un utilisateur IAM autorisé à écrire sur Kinesis Video Streams
<a name="producersdk-cpp-rpi-iam"></a>

Si ce n'est pas déjà fait, configurez un utilisateur Gestion des identités et des accès AWS (IAM) autorisé à écrire sur un flux vidéo Kinesis.

Ces procédures ont pour but de vous aider à commencer rapidement à utiliser une paire de clés d' AWS accès. Les appareils peuvent utiliser des certificats X.509 pour se connecter à AWS IoT. Consultez [Contrôle de l'accès aux ressources Kinesis Video Streams à l'aide de AWS IoT](how-iot.md) pour plus d'informations sur la configuration de votre appareil pour utiliser l'authentification basée sur des certificats.

1. Connectez-vous à la console IAM AWS Management Console et ouvrez-la à [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)l'adresse.

1. Dans le menu de navigation de gauche, choisissez **Utilisateurs**.

1. Pour créer un nouvel utilisateur, choisissez **Add user** (Ajouter un utilisateur).

1. Choisissez un **nom d'utilisateur** descriptif pour l'utilisateur, par exemple **kinesis-video-raspberry-pi-producer**.

1. Sous **Access type** (Type d'accès), choisissez **Programmatic access** (Accès par programme).

1. Choisissez **Suivant : Autorisations**.

1. Sous **Définir les autorisations pour kinesis-video-raspberry-pi -producer**, choisissez **Joindre directement les politiques existantes**.

1. Choisissez **Create Policy** (Créer une politique). La page **Create policy** (Créer la stratégie) s'ouvre dans un nouvel onglet du navigateur web.

1. Choisissez l’onglet **JSON**.

1. Copiez la stratégie JSON suivante et collez-la dans la zone de texte. Cette politique autorise votre utilisateur à créer et à écrire des données dans les flux vidéo Kinesis.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
         "Action": [
         "kinesisvideo:DescribeStream",
         "kinesisvideo:CreateStream",
         "kinesisvideo:GetDataEndpoint",
         "kinesisvideo:PutMedia"
       ],
       "Resource": [
         "*"
       ]
     }]
   }
   ```

------

1. Choisissez **Examiner une politique**.

1. Attribuez un **nom** à votre stratégie, par exemple **kinesis-video-stream-write-policy**.

1. Choisissez **Create Policy** (Créer une politique).

1. Revenez à l'onglet **Add user** (Ajouter un utilisateur) dans votre navigateur, puis choisissez **Refresh** (Actualiser).

1. Dans la zone de recherche, saisissez le nom de la stratégie que vous avez créée.

1. Cochez la case en regard de la nouvelle stratégie dans la liste.

1. Choisissez **Next: Review (Suivant : Vérification)**.

1. Choisissez **Create user**.

1. La console affiche l'**ID de clé d'accès** pour votre nouvel utilisateur. Choisissez **Afficher** pour afficher la **clé d'accès secrète**. Enregistrez ces valeurs ; elles sont nécessaires lorsque vous configurez l'application.

# Connectez votre Raspberry Pi à votre réseau Wi-Fi
<a name="producersdk-cpp-rpi-wifi"></a>

Si vous utilisez un clavier et un moniteur connectés, passez à [Configuration de la caméra Raspberry Pi](producersdk-cpp-rpi-camera.md). 

Ces instructions sont écrites pour vous aider à configurer votre Raspberry Pi lorsqu'il est exécuté en mode *headless*, c'est-à-dire sans clavier, moniteur ou câble réseau connecté. Suivez les instructions ci-dessous pour configurer votre Raspberry Pi afin qu'il tente automatiquement de se connecter au réseau spécifié, permettant ainsi à votre machine hôte de s'y connecter par SSH.

1. Sur votre ordinateur, créez un dossier nommé `wpa_supplicant.conf`.

1. Copiez le texte suivant et collez-le dans le `wpa_supplicant.conf` fichier :

   ```
   country=US
   ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
   update_config=1
   
   network={
   ssid="Your Wi-Fi SSID"
   scan_ssid=1
   key_mgmt=WPA-PSK
   psk="Your Wi-Fi Password"
   }
   ```

   Remplacez les valeurs `ssid` et `psk` par les informations relatives à votre réseau Wi-Fi.

1. Copiez le fichier `wpa_supplicant.conf` dans la carte SD. Il doit être copié à la racine du volume `boot`.

1. Insérez la carte SD dans l'appareil Raspberry Pi et allumez ce dernier. Il accède à votre réseau Wi-Fi et la fonctionnalité SSH est activée.

# Connectez-vous à distance à votre Raspberry Pi
<a name="producersdk-cpp-rpi-connect"></a>

Si vous utilisez un clavier et un moniteur connectés, passez à [Configuration de la caméra Raspberry Pi](producersdk-cpp-rpi-camera.md). 

Ces instructions sont écrites pour vous aider à configurer votre Raspberry Pi lorsqu'il est exécuté en mode *headless*, c'est-à-dire sans clavier, moniteur ou câble réseau connecté. Suivez les instructions ci-dessous pour localiser votre Raspberry Pi sur votre réseau et y accéder par SSH depuis votre machine hôte.

1. Avant de vous connecter à distance à votre appareil Raspberry Pi, effectuez l'une des actions suivantes pour déterminer son adresse IP :
   + Si vous avez accès au routeur Wi-Fi de votre réseau, regardez les appareils Wi-Fi connectés. Recherchez l'appareil nommé `Raspberry Pi` pour trouver l'adresse IP de votre appareil.
   + Si vous n'avez pas accès au routeur Wi-Fi de votre réseau, vous pouvez utiliser d'autres logiciels pour trouver les appareils sur votre réseau. [Fing](https://www.fing.com/) est une application populaire disponible à la fois pour les appareils Android et iOS. Vous pouvez utiliser la version gratuite de cette application pour trouver les adresses IP des appareils figurant sur votre réseau.

1. Lorsque vous connaissez l'adresse IP de l'appareil Raspberry Pi, vous pouvez utiliser n'importe quelle application de terminal pour vous connecter.
   + Sur macOS ou Linux, utilisez `ssh` :

     ```
     ssh pi@<IP address>
     ```
   + Sur Windows, utilisez [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html), un client SSH gratuit pour Windows.

   Pour une nouvelle installation de Raspbian, le nom d'utilisateur est **pi** et le mot de passe est **raspberry**. Nous vous recommandons de [changer le mot de passe par défaut](https://www.raspberrypi.com/documentation/computers/configuration.html#change-user-password-nonint).

# Configuration de la caméra Raspberry Pi
<a name="producersdk-cpp-rpi-camera"></a>

Procédez comme suit pour configurer le [module de caméra Raspberry Pi](https://www.raspberrypi.com/documentation/accessories/camera.html) afin qu'il envoie de la vidéo depuis l'appareil vers un flux vidéo Kinesis. 

**Note**  
Si vous utilisez une webcam USB, passez directement à[Installation des prérequis logiciels](producersdk-cpp-rpi-software.md).

------
#### [ Camera module 1 ]

Suivez ces instructions pour mettre à jour le fichier des modules, activer l'interface de la caméra et vérifier le fonctionnement de votre caméra. La mise à jour du fichier de modules indique au Raspberry Pi quels modules du noyau charger au moment du démarrage. Le pilote de caméra n'est pas chargé par défaut afin de préserver les ressources du système sur les appareils Raspberry Pi qui n'utilisent pas de caméra.

1.  Ouvrez un éditeur pour apporter des modifications au fichier des modules. Ouvrez le terminal et utilisez la commande suivante pour modifier le fichier à l'aide de l'`nano`éditeur :

   ```
   sudo nano /etc/modules
   ```

1. Ajoutez la ligne suivante à la fin du fichier, si ce n'est pas déjà fait :

   ```
   bcm2835-v4l2
   ```

1. Enregistrez le fichier et quittez l'éditeur. Pour enregistrer et quitter à l'aide de l'`nano`éditeur, utilisez Ctrl\$1X.

1. Redémarrez l'appareil Raspberry Pi :

   ```
   sudo reboot
   ```

1. Lorsque l'appareil redémarre, connectez-vous y à nouveau par le biais de votre application de terminal si vous vous connectez à distance.

1. Ouvrir `raspi-config`:

   ```
   sudo raspi-config
   ```

1. Choisissez **Options d'interfaçage**, **Legacy Camera**. **Dans les anciennes versions du système d'exploitation Raspbian, cette option de menu peut se trouver sous **Options d'interfaçage, Caméra**.**

   Activez la caméra si elle n'est pas déjà activée, et redémarrez si vous y êtes invité.

1. Vérifiez que la caméra fonctionne en tapant la commande suivante :

   ```
   raspistill -v -o test.jpg
   ```

   Si votre appareil photo est correctement configuré, cette commande capture une image depuis l'appareil photo, l'enregistre dans un fichier nommé `test.jpg` et affiche des messages d'information.

------
#### [ Camera module 2 or 3 ]

Si vous utilisez un module de caméra 2, vous utilisez soit `bcm2835-v4l2` (ancien) soit `libcamera` (moderne). Cependant, la `libcamera` pile est recommandée pour un meilleur support et de meilleures fonctionnalités. Suivez les étapes ci-dessous pour vérifier que cela `libcamera` se trouve up-to-date sur votre système.

1. [libcamera](https://www.raspberrypi.com/documentation/computers/camera_software.html#libcamera) devrait être préinstallé sur votre Raspberry Pi. Vérifiez les mises à jour et mettez à jour la dernière version pour les corrections de bogues et les mises à jour de sécurité. Ouvrez le terminal et saisissez les commandes suivantes :

   ```
   sudo apt-get update
   sudo apt-get upgrade
   ```

1. Redémarrez votre système pour que les mises à jour prennent effet.

   ```
   sudo reboot
   ```

1. Testez votre appareil photo. Cette application lance un flux d'aperçu de la caméra et l'affiche à l'écran.

   ```
   libcamera-hello
   ```

   Si vous rencontrez des problèmes avec votre module de caméra, consultez la [documentation du Raspberry Pi](https://raspberrypi.com/documentation/computers/camera_software.html#troubleshooting) pour le dépannage.

------

# Installation des prérequis logiciels
<a name="producersdk-cpp-rpi-software"></a>

Le SDK C\$1\$1 Producer nécessite que vous installiez les prérequis logiciels suivants sur le Raspberry Pi.

1. Mettez à jour la liste des packages et installez les bibliothèques nécessaires à la création du SDK. Ouvrez le terminal et saisissez les commandes suivantes :

   ```
   sudo apt-get update
   sudo apt-get install -y \
     automake \
     build-essential \
     cmake \
     git \
     gstreamer1.0-plugins-base-apps \
     gstreamer1.0-plugins-bad \
     gstreamer1.0-plugins-good \
     gstreamer1.0-plugins-ugly \
     gstreamer1.0-tools \
     gstreamer1.0-omx-generic \
     libcurl4-openssl-dev \
     libgstreamer1.0-dev \
     libgstreamer-plugins-base1.0-dev \
     liblog4cplus-dev \
     libssl-dev \
     pkg-config
   ```

1. Si vous utilisez la `libcamera` pile, installez également le `libcamerasrc` GStreamer plugin. Ce GStreamer plugin n'est pas installé par défaut.

   ```
   sudo apt-get install gstreamer1.0-libcamera
   ```

1. Copiez le fichier PEM suivant dans `/etc/ssl/cert.pem`:

   ```
   sudo curl https://www.amazontrust.com/repository/AmazonRootCA1.pem -o /etc/ssl/AmazonRootCA1.pem
   sudo chmod 644 /etc/ssl/AmazonRootCA1.pem
   ```

# Téléchargez et créez le SDK Kinesis Video Streams C\$1\$1 pour le producteur
<a name="producersdk-cpp-rpi-download"></a>

Suivez les procédures ci-dessous pour télécharger et créer le SDK [Kinesis Video Streams C\$1\$1 Producer](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp). Assurez-vous d'avoir installé les prérequis logiciels ; consultez [Installation des prérequis logiciels](producersdk-cpp-rpi-software.md) ces étapes.

1. Accédez au répertoire de téléchargement. Ouvrez un terminal et accédez à votre répertoire de téléchargement préféré. 

   Par exemple :

   ```
   cd ~/Downloads
   ```

1. Clonez le référentiel du SDK. Utilisez la `git clone` commande pour télécharger le SDK depuis le GitHub référentiel. Type :

   ```
   git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git --single-branch -b master kvs-producer-sdk-cpp
   ```

   Cette commande ne clone qu'une seule branche (la `master` branche), réduisant ainsi la taille et la durée du téléchargement. Il place également le contenu téléchargé dans un dossier appelé `kvs-producer-sdk-cpp` dans le répertoire actuel.

1. Vérifiez le téléchargement. Une fois le processus de clonage terminé, listez le contenu du `kvs-producer-sdk-cpp` dossier pour vérifier que le SDK a été téléchargé.

   ```
   ls kvs-producer-sdk-cpp
   ```

1. Préparez un répertoire de compilation. Type :

   ```
   mkdir -p kvs-producer-sdk-cpp/build
   cd kvs-producer-sdk-cpp/build
   ```

1. Configurez le build. Exécutez la `cmake` commande suivante pour configurer l'environnement de génération avec des options spécifiques :

   ```
   cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=OFF -DALIGNED_MEMORY_MODEL=ON
   ```

   [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html)utilise les options suivantes pour générer le fichier approprié `Makefiles` :
   + Utiliser le dossier du projet (`..`) comme répertoire source.
   + Utilisation du répertoire actuel (`.`) (`build/`) pour la sortie de compilation.
   + `-DBUILD_GSTREAMER_PLUGIN=ON`permet de créer le GStreamer plugin kvssink.
   + `-DBUILD_DEPENDENCIES=OFF`désactive la création de dépendances externes à partir de la source. Le projet trouvera et utilisera les dépendances externes installées lors d'une étape précédente.
   + `-DALIGNED_MEMORY_MODEL=ON`désactive le modèle de mémoire non aligné. L'accès à la mémoire non aligné n'est pas pris en charge par certains appareils Raspberry Pi.
**Note**  
Pour une liste complète des CMake arguments, voir[Téléchargez et configurez le code de la bibliothèque C\$1\$1 Producer](producersdk-cpp-download.md).

1. Générez le projet. Après avoir configuré le build, utilisez la `make` commande pour compiler à l'aide de la commande `Makefile` générée par`cmake`.

   ```
   make -j$(nproc)
   ```

   L'`-j`argument to `make` lui permet d'exécuter plusieurs tâches de compilation en parallèle. Pour réduire les temps de construction, utilisez la `nproc` commande pour calculer dynamiquement le nombre de cœurs de processeur de votre Raspberry Pi.

1. Confirmez que c'`libgstkvssink.so`est bien le cas. 

   Répertoriez les fichiers du répertoire en cours.

   **Prompt :**

   ```
   ls
   ```

   **Réponse :**

   ```
   CMakeCache.txt       dependency                          kvs_gstreamer_sample
   CMakeFiles           kvs_gstreamer_audio_video_sample    kvssink_gstreamer_sample
   Makefile             kvs_gstreamer_file_uploader_sample  libKinesisVideoProducer.so
   cmake_install.cmake  kvs_gstreamer_multistream_sample    libgstkvssink.so
   ```

1. Confirmez que cela GStreamer peut se charger`kvssink`. 

   Définissez la variable d'`GST_PLUGIN_PATH`environnement sur le répertoire contenant`libgstkvssink.so`.

   ```
   export GST_PLUGIN_PATH=`pwd`
   ```

   Avoir une GStreamer charge `kvssink` :

   ```
   gst-inspect-1.0 kvssink
   ```

   Vous devriez voir de la documentation sur`kvssink`. Utilisez les touches fléchées pour naviguer et appuyez `q` pour quitter. 

1. (**Facultatif**) Mettez à jour le script de démarrage de votre shell pour inclure la définition de la variable d'`GST_PLUGIN_PATH`environnement. Cela garantit `GST_PLUGIN_PATH` un réglage correct lors d'une nouvelle session de terminal. Sur les appareils Raspberry Pi, le script de démarrage du shell est`~/.bashrc`. 

   Exécutez la commande suivante pour ajouter la commande à la fin du script de démarrage du shell.

   ```
   echo "export GST_PLUGIN_PATH=~/Downloads/kvs-producer-sdk-cpp/build" >> ~/.bashrc
   ```

   Tapez ce qui suit pour exécuter le script de démarrage du shell ou fermer le shell actuel et en ouvrir un nouveau.

   ```
   source ~/.bashrc
   ```

   Confirmez que le `GST_PLUGIN_PATH` paramètre est réglé et que vous pouvez charger`kvssink`.

   ```
   echo $GST_PLUGIN_PATH
   ```

   ```
   gst-inspect-1.0 kvssink
   ```

# Diffusez de la vidéo sur votre flux vidéo Kinesis
<a name="producersdk-cpp-rpi-run"></a>

Pour exécuter cet exemple d'application, vous avez besoin des informations suivantes :
+ Le nom du flux que vous avez créé dans la section [Conditions préalables](producersdk-cpp-rpi-prerequisites.md).
+ Les informations d'identification de compte (ID de clé d'accès et clé d'accès secrète) que vous avez créées dans [Création d'un utilisateur IAM autorisé à écrire sur Kinesis Video Streams](producersdk-cpp-rpi-iam.md).
+ GStreamer est capable de localiser le `kvssink` plugin. Pour plus d’informations, consultez [Téléchargez et créez le SDK Kinesis Video Streams C\$1\$1 pour le producteur](producersdk-cpp-rpi-download.md).

1. Définissez les informations d'identification et la région.

   ```
   export AWS_ACCESS_KEY_ID=YourAccessKey
   export AWS_SECRET_ACCESS_KEY=YourSecretKey
   export AWS_DEFAULT_REGION=us-west-2
   ```

   Pour les autres méthodes d'authentification, consultez[Fournissez des informations d'identification à `kvssink`](examples-gstreamer-plugin-parameters.md#credentials-to-kvssink).
**Note**  
Le SDK C\$1\$1 Producer utilise par défaut la région USA Ouest (Oregon`us-west-2`) (). Pour utiliser la valeur par défaut, Région AWS créez votre flux vidéo Kinesis dans la région USA Ouest (Oregon).   
Pour utiliser une autre région pour votre flux vidéo Kinesis, définissez la variable d'environnement suivante sur votre région (par exemple,*us-east-1*) :  

   ```
   export AWS_DEFAULT_REGION=us-east-1 
   ```

1. En fonction de votre support d'entrée, choisissez l'une des options suivantes :

------
#### [ Sample GStreamer video ]

   Ce GStreamer pipeline génère un flux vidéo de test en direct avec un modèle de test standard qui s'exécute à 10 images par seconde avec une résolution de 640 x 480 pixels. Une superposition est ajoutée pour afficher l'heure et la date actuelles du système. La vidéo est ensuite encodée au format H.264 et des images-clés sont générées au maximum toutes les 10 images, ce qui se traduit par une durée de fragment (également appelée taille d'un groupe d'images (GoP)) de 1 seconde. kvssink prend le flux vidéo encodé en H.264, le conditionne dans le format conteneur Matroska (MKV) et le télécharge sur votre flux vidéo Kinesis.

   Exécutez la commande suivante :

   ```
   gst-launch-1.0 -v videotestsrc is-live=true \
     ! video/x-raw,framerate=10/1,width=640,height=480 \
     ! clockoverlay time-format="%a %B %d, %Y %I:%M:%S %p" \
     ! x264enc bframes=0 key-int-max=10 \
     ! h264parse \
     ! kvssink stream-name="YourStreamName"
   ```

   Pour arrêter le GStreamer pipeline, sélectionnez la fenêtre du terminal et appuyez sur **CTRL\$1C**.

   L'exemple de GStreamer pipeline vidéo ressemble à ceci :

![\[Image du modèle de test standard avec horodatage superposé.\]](http://docs.aws.amazon.com/fr_fr/kinesisvideostreams/latest/dg/images/sample-video.png)


------
#### [ USB web cam ]

   Exécutez la commande suivante pour GStreamer détecter automatiquement votre caméra USB :

   ```
   gst-launch-1.0 autovideosrc \
     ! videoconvert \
     ! video/x-raw,format=I420,width=640,height=480 \
     ! x264enc bframes=0 key-int-max=45 tune=zerolatency byte-stream=true speed-preset=ultrafast \
     ! h264parse \
     ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \
     ! kvssink stream-name="YourStreamname"
   ```

   Pour arrêter le GStreamer pipeline, sélectionnez la fenêtre du terminal et appuyez sur **CTRL\$1C**.

   Plutôt que de laisser la GStreamer détection automatique, vous pouvez utiliser `v4l2src` un identifiant d'appareil spécifique. Exécutez la commande suivante :

   ```
   gst-device-monitor-1.0
   ```

   Dans le résultat, vous verrez certains appareils et le début d'un GStreamer pipeline expliquant comment utiliser l'appareil :

   ```
   Device found:
   
       name  : H264 USB Camera: USB Camera
       class : Video/Source
       caps  : video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string){ 2:4:7:1 }, framerate=(fraction){ 30/1, 25/1, 15/1 };
               ...
       properties:
           device.path = /dev/video4
           udev-probed = false
           device.api = v4l2
           v4l2.device.driver = uvcvideo
           v4l2.device.card = "H264\ USB\ Camera:\ USB\ Camera"
           v4l2.device.bus_info = usb-3f980000.usb-1.3
           v4l2.device.version = 265767 (0x00040e27)
           v4l2.device.capabilities = 2216689665 (0x84200001)
           v4l2.device.device_caps = 69206017 (0x04200001)
       gst-launch-1.0 v4l2src device=/dev/video4 ! ...
   ```

   Pour arrêter le GStreamer pipeline, sélectionnez la fenêtre du terminal et appuyez sur **CTRL\$1C**.

------
#### [ Raspberry Pi camera module 1 ]

   Si vous utilisez le module de caméra Pi 1 ou le module de caméra Pi 2 avec`bcm2835-v4l2`, utilisez ce qui suit :

   ```
   gst-launch-1.0 v4l2src device=/dev/video0 \
     ! videoconvert \
     ! video/x-raw,format=I420,width=640,height=480 \
     ! x264enc bframes=0 key-int-max=45 bitrate=500 tune=zerolatency \
     ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \
     ! kvssink stream-name="YourStreamname"
   ```

   Pour arrêter le GStreamer pipeline, sélectionnez la fenêtre du terminal et appuyez sur **CTRL\$1C**.

------
#### [ Raspberry Pi camera module 2 or 3 ]

   Si vous utilisez la `libcamera` pile moderne, utilisez le GStreamer pipeline suivant :

   ```
   gst-launch-1.0 libcamerasrc \
     ! video/x-raw,width=640,height=480,framerate=30/1,format=I420 \
     ! videoconvert \
     ! x264enc speed-preset=ultrafast tune=zerolatency byte-stream=true key-int-max=75 \
     ! video/x-h264,level='(string)4' \
     ! h264parse \
     ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1 \
     ! kvssink stream-name="YourStreamname"
   ```

   Pour arrêter le GStreamer pipeline, sélectionnez la fenêtre du terminal et appuyez sur **CTRL\$1C**.

------
#### [ Sample RTSP camera ]

   Dans cet exemple, nous hébergeons Gst-Rtsp-Server localement un flux de caméra RTSP de démonstration. Nous construisons ensuite un GStreamer pipeline pour télécharger ce flux de caméra RTSP vers le flux vidéo Kinesis spécifié.

   **À configurer Gst-Rtsp-Server sur votre Raspberry Pi**

   1. Installez les bibliothèques de dépendances nécessaires pour créer le Gst-Rtsp-Server projet. Assurez-vous que les prérequis logiciels sont également installés. Tapez ce qui suit dans votre terminal :

      ```
      sudo apt-get update
      sudo apt-get install libgstrtspserver-1.0
      ```

   1. Téléchargez la version 1.22 de GStreamer sur votre Raspberry Pi.

      ```
      git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git --single-branch -b 1.22
      ```

   1. Remplacez les répertoires par le répertoire des exemples dans le gst-rtsp-server.

      ```
      cd gstreamer
      cd subprojects
      cd gst-rtsp-server
      cd examples
      ```

   1. Compilez le fichier test-launch.c dans un exécutable appelé test-launch en utilisant gcc.

      ```
      gcc -o test-launch test-launch.c `pkg-config --cflags --libs gstreamer-rtsp-server-1.0`
      ```

   1. Exécutez le fichier exécutable avec les arguments suivants. Remarque : le premier chargement GStreamer peut prendre un certain temps.

      ```
      ./test-launch "videotestsrc is-live=true ! video/x-raw,height=480,width=640,framerate=10/1 ! videoconvert ! x264enc tune=zerolatency bitrate=512 key-int-max=25 bframes=0 ! h264parse ! rtph264pay ! name=pay0 pt=96"
      ```

      Vous devriez voir la sortie suivante :

      ```
      stream ready at rtsp://127.0.0.1:8554/test
      ```

   1. Vérifiez le flux vidéo RTSP. Vous pouvez utiliser n'importe quel visualiseur RTSP. Par exemple, le lecteur multimédia VLC. Pour utiliser le lecteur multimédia VLC pour visionner votre diffusion en direct, ouvrez un nouveau terminal et tapez :

      ```
      sudo apt-get install vlc
      ```

      pour installer le lecteur multimédia VLC. Tapez ensuite :

      ```
      vlc rtsp://127.0.0.1:8554/test
      ```

      Une fenêtre VLC devrait apparaître avec le flux en direct. Si ce n'est pas le cas, vérifiez que le fichier exécutable de lancement du test est toujours en cours d'exécution et vérifiez la sortie pour détecter d'éventuelles erreurs.

      Un autre moyen de vérifier le flux RTSP consiste à utiliser l'utilitaire gst-discoverer-1.0. Type :

      ```
      gst-discoverer-1.0 "rtsp://127.0.0.1:8554/test"
      ```

      Le résultat attendu ressemble à ceci :

      ```
      Analyzing rtsp://127.0.0.1:8554/test
      Done discovering rtsp://127.0.0.1:8554/test
      
      Properties:
        Duration: 99:99:99.999999999
        Seekable: no
        Live: yes
        unknown #0: application/x-rtp
          video #1: H.264 (Constrained Baseline Profile)
            Stream ID: 359314d7d4bba383223927d7e57d4244d0800e629c626be81c505055c62170e2/video:0:0:RTP:AVP:96
            Width: 640
            Height: 480
            Depth: 24
            Frame rate: 10/1
            Pixel aspect ratio: 1/1
            Interlaced: false
            Bitrate: 0
            Max bitrate: 0
      ```

   **Pour envoyer le flux RTSP vers votre flux vidéo Kinesis à l'aide de kvssink**

   Ce GStreamer pipeline est utilisé `rtspsrc` pour se connecter au serveur RTSP afin de récupérer le flux vidéo RTP. Il transmet les images au`rtph264depay`, qui extrait les images vidéo codées H.264 des paquets RTP. `h264parse`regroupe les images vidéo dans le format que je `kvssink` peux comprendre. `kvssink`prend le flux vidéo encodé H.264, l'empaquette dans le format conteneur Matroska (MKV) et le télécharge sur votre flux vidéo Kinesis.

   Exécutez la commande suivante :

   ```
   gst-launch-1.0 -v rtspsrc location="rtsp://127.0.0.1:8554/test" short-header=true \
     ! rtph264depay \
     ! h264parse \
     ! video/x-h264,format=avc,alignment=au \
     ! kvssink stream-name="YourStreamName"
   ```

   Pour arrêter le GStreamer pipeline, sélectionnez la fenêtre du terminal et appuyez sur **CTRL\$1C**.

------

## Utiliser du matériel
<a name="producersdk-cpp-rpi-utilize"></a>

Certains modèles de Raspberry Pi sont équipés d'encodeurs H.264 accélérés par matériel. Vous pouvez les utiliser à la place `x264enc` d'un encodeur logiciel.

1. Assurez-vous que les GStreamer plugins sont installés :

   ```
   sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-bad
   ```

1. Type :

   ```
   gst-inspect-1.0 | grep h264
   ```

   Déterminez si les éléments suivants sont disponibles :
   + omxh264enc
   + v4l2h264enc

   S'ils sont disponibles, vous pouvez les utiliser. Voici quelques exemples de pipelines utilisant ces éléments :

   **`omxh264enc`:**

   ```
   gst-launch-1.0 v4l2src device=/dev/video0 \
     ! videoconvert \
     ! video/x-raw,format=I420,width=640,height=480 \
     ! omxh264enc control-rate=2 target-bitrate=512000 periodicity-idr=45 inline-header=FALSE \
     ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \
     ! kvssink stream-name="raspberry"
   ```

   **`v4l2h264enc`et `v4l2convert` :**

   ```
   gst-launch-1.0 libcamerasrc \
     ! video/x-raw,width=640,height=480,framerate=30/1,format=I420 \
     ! v4l2convert \
     ! v4l2h264enc extra-controls="controls,repeat_sequence_header=1" \
     ! video/x-h264,level='(string)4' \
     ! h264parse \
     ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1 \
     ! kvssink stream-name="test-stream"
   ```

## Problèmes d'exécution
<a name="rpi-troubleshoot-runtime"></a>

Vous trouverez ci-dessous certains problèmes d'exécution fréquemment rencontrés et la manière de les résoudre.

### Aucun élément de ce type « xxxxxxxxx »
<a name="rpi-troubleshoot-missing-plugin"></a>

Si vous recevez un message d'erreur comme celui-ci, cela signifie qu'il vous manque un GStreamer plugin :

```
WARNING: erroneous pipeline: no element "videoconvert"
```

**Résolution :**

En fonction de l'élément manquant, déterminez l'action appropriée :
+ `kvssink`: Voir[Téléchargez et créez le SDK Kinesis Video Streams C\$1\$1 pour le producteur](producersdk-cpp-rpi-download.md).
+ `libcamerasrc`: Voir [Erreur « Échec de l'activation du pool de mémoire tampon »](#rpi-troubleshoot-buffer) pour installer l'`libcamerasrc` GStreamer élément.
+ `omxh264enc`ou `v4l2h264enc` : 

  Suivez [Installation des prérequis logiciels](producersdk-cpp-rpi-software.md) pour installer toutes les GStreamer bibliothèques. Si vous les avez tous installés et que ces éléments n'apparaissent pas, cela signifie que votre Raspberry Pi n'a pas le matériel nécessaire. Utilisez `x264enc` plutôt l'encodeur logiciel.
+ Autre : suivez [Installation des prérequis logiciels](producersdk-cpp-rpi-software.md) pour installer toutes les GStreamer bibliothèques. Différents GStreamer éléments se trouvent dans les différents groupes de GStreamer plugins (bons, mauvais, moches), alors assurez-vous de tous les installer.

### Erreur « Échec de l'activation du pool de mémoire tampon »
<a name="rpi-troubleshoot-buffer"></a>

Si vous recevez une erreur comme celle-ci, cela signifie que le pipeline utilisé est en cours d'utilisation`v4l2src`, mais qu'il devrait l'utiliser à la `libcamerasrc` place.

```
ERROR bufferpool gstbufferpool.c:572:gst_buffer_pool_set_active:source:pool0:src start failed
WARN v4l2src gstv4l2src.c:976:gst_v4l2src_decide_allocation: error: Failed to allocate required memory.
WARN v4l2src gstv4l2src.c:976:gst_v4l2src_decide_allocation: error: Buffer pool activation failed
WARN basesrc gstbasesrc.c:3352:gst_base_src_prepare_allocation: Subclass failed to decide allocation
Error received from element source: Failed to allocate required memory.
WARN basesrc gstbasesrc.c:3132:gst_base_src_loop: error: Internal data stream error.
Debugging information: ../sys/v4l2/gstv4l2src.c(976): gst_v4l2src_decide_allocation (): /GstPipeline:live-kinesis-pipeline/GstV4l2Src:source:
Buffer pool activation failed
WARN basesrc gstbasesrc.c:3132:gst_base_src_loop: error: streaming stopped, reason not-negotiated (-4)
```

Par exemple, si vous utilisez le pipeline suivant alors que le module de caméra 2 n' GStreamer est pas `libcamerasrc` installé, vous risquez de rencontrer cette erreur lorsque vous essayez de détecter automatiquement les éléments à utiliser.

```
gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink
```

**Résolution :**

Assurez-vous qu'il `libcamerasrc` est installé et utilisez-le comme élément source, plutôt que`v4l2src`. Tapez ce qui suit pour installer l'`libcamerasrc` GStreamer élément :

```
sudo apt-get update
sudo apt-get install gstreamer1.0-libcamera
```

Une fois `libcamerasrc` installé, si vous utilisez l'`autovideosrc`élément, vous GStreamer devriez automatiquement passer à la bonne source `libcamerasrc` au lieu de`v4l2src`. 

### Erreur de bus
<a name="rpi-troubleshoot-bus"></a>

Si vous recevez une erreur de bus peu après le démarrage `kvssink` (généralement, au moment de la `PutMedia` fin de l'appel HTTP), cela signifie que votre Raspberry Pi ne prend pas en charge l'accès à la mémoire non aligné. Les journaux ressembleront à ce qui suit :

```
INFO Camera camera.cpp:1197 configuring streams: (0) 640x480-YUV420
INFO RPI pisp.cpp:1450 Sensor: /base/axi/pcie@120000/rp1/i2c@88000/imx708@1a - Selected sensor format: 1536x864-SBGGR10_1X10 - Selected CFE format: 1536x864-PC1B
[INFO ] kinesisVideoStreamFormatChanged(): Stream format changed.
[DEBUG] setRequestHeader(): Appending header to request: user-agent -> AWS-SDK-KVS-CPP-CLIENT/3.4.2/1.5.3 GCC/12.2.0 Linux/6.6.51+rpt-rpi-v8 aarch64 CPPSDK
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-stream-name -> demo-stream
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-producer-start-timestamp -> 1732012345.678
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-fragment-acknowledgment-required -> 1
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-fragment-timecode-type -> ABSOLUTE
[DEBUG] setRequestHeader(): Appending header to request: transfer-encoding -> chunked
[DEBUG] setRequestHeader(): Appending header to request: connection -> keep-alive
[INFO ] putStreamResultEvent(): Put stream result event. New upload handle 0
[WARN ] notifyDataAvailable(): [demo-stream] Failed to un-pause curl with error: 43. Curl object 0xe2f6f418
Bus error
```

Kinesis Video Streams PIC utilise un accès mémoire non aligné pour optimiser l'utilisation de la mémoire, ce qui n'est pas pris en charge par tous les appareils.

**Résolution :**

Pour utiliser le SDK en mode d'accès à la mémoire aligné, vous devez définir explicitement l'`ALIGNED_MEMORY_MODEL` CMake indicateur sur `ON` lors de la compilation`kvssink`, car il est défini par défaut sur. `OFF` Voir [Téléchargez et créez le SDK Kinesis Video Streams C\$1\$1 pour le producteur](producersdk-cpp-rpi-download.md) pour des instructions plus détaillées.

### L'horodatage se bloque et le pipeline s'arrête
<a name="rpi-troubleshoot-pipeline"></a>

Lors de l'utilisation `x264enc` dans un GStreamer pipeline, vous pouvez rencontrer des situations où la chronologie du pipeline ralentit considérablement ou s'arrête complètement en quelques secondes.

Cela se produit parce que les paramètres `x264enc` par défaut peuvent introduire une latence de codage élevée, qui dépasse la capacité de la mémoire tampon d'entrée par défaut. Par conséquent, la mémoire tampon d'entrée se remplit, ce qui provoque le blocage des éléments en amont et le blocage du pipeline.

Pour plus d’informations, consultez la [documentation GStreamer ](https://gstreamer.freedesktop.org/documentation/x264/index.html?gi-language=c).

**Résolution :**

Configurez `x264enc` à l'aide de l'option de `zerolatency` réglage. Cela réduit considérablement la latence d'encodage en optimisant les scénarios en temps réel, garantissant ainsi un traitement et une sortie plus rapides des images.

Exemple de configuration :

```
... ! x264enc tune=zerolatency byte-stream=true speed-preset=ultrafast bframes=0 key-int-max=60 ! ...
```

**Note**  
Bien que cette solution empêche efficacement le blocage du pipeline, elle peut avoir un impact sur l'efficacité et la qualité de l'encodage. Pour les scénarios nécessitant à la fois une faible latence et une haute qualité, envisagez d'autres approches, telles que l'utilisation d'optimisations matérielles ou la recherche d'une webcam produisant directement du H.264, en sautant cette étape de codage.  
Pour de plus amples informations, veuillez consulter [Utiliser du matériel](#producersdk-cpp-rpi-utilize).

### Impossible d'exécuter plusieurs pipelines à partir du même `v4l2` appareil en même temps
<a name="rpi-troubleshoot-multiple-pipelines"></a>

De tels appareils ne sont `/dev/video0` accessibles que par un seul processus à la fois. Si plusieurs processus tentent d'y accéder en même temps, le second attend que le premier soit terminé.

**Résolution :**

Créez un dispositif de bouclage permettant à plusieurs processus d'utiliser l'interface de bouclage en même temps. Pour plus d'informations, consultez [Stack Exchange](https://raspberrypi.stackexchange.com/questions/19630/take-picam-image-while-motion-is-running/19897#19897).

### Erreur de flux de données interne
<a name="rpi-troubleshoot-internal-error"></a>

Lorsque vous créez un GStreamer pipeline, vous connectez des éléments en reliant le bloc source d'un élément au bloc récepteur d'un autre élément. Ce processus de liaison permet le flux de données de l'élément source vers l'élément récepteur, formant ainsi un pipeline de données.

Le message d'erreur « La connexion au pad a échoué » dans le journal indique qu'un problème GStreamer a été rencontré lors de la tentative d'établissement d'une connexion (lien) entre les pads de deux éléments de votre pipeline.

```
Pad link failed
Error received from element udpsrc0: Internal data stream error.
```

**Résolution :**

Déterminez quels éléments ne sont pas liés les uns aux autres. Pour réduire la portée du pipeline, supprimez des éléments du pipeline. Remplacez l'élément le plus à droite par `fakesink` des éléments et supprimez-les un par un.

Vous devrez peut-être ajuster les éléments [capsfilter](https://gstreamer.freedesktop.org/documentation/coreelements/capsfilter.html?gi-language=c), and/or modifier les éléments utilisés par votre pipeline.

Les cas courants demandent un `framerate` ou `resolution` que l'appareil photo ne prend pas en charge. `gst-device-monitor-1.0`À utiliser dans le terminal pour obtenir les valeurs prises en charge `framerates``resolutions`, et`formats`. Vous pouvez utiliser l' GStreamer élément [Videoscale](https://gstreamer.freedesktop.org/documentation/videoconvertscale/videoscale.html?gi-language=c) pour régler la résolution vidéo et [Videorate pour ajuster la fréquence](https://gstreamer.freedesktop.org/documentation/videorate/?gi-language=c) d'images vidéo.

Pour vérifier les formats pris en charge pour un GStreamer élément individuel, saisissez `gst-inspect-1.0 element-name` le terminal.

# Lire le contenu multimédia de votre flux vidéo Kinesis
<a name="producersdk-cpp-rpi-playback"></a>

Ouvrez la console [Kinesis Video Streams](https://console.aws.amazon.com//kinesisvideo/home/) et sélectionnez **le nom du flux** que vous avez créé.

Le flux vidéo qui est envoyé à partir de l'appareil Raspberry Pi apparaît dans la console.

**Note**  
Quelques secondes peuvent s'écouler avant que la vidéo n'apparaisse dans la console.

Une fois le stream diffusé, vous pouvez tester les fonctionnalités suivantes dans la console :
+ Dans la section **Video preview** (Aperçu vidéo), utilisez les contrôles de navigation pour revenir en arrière et avancer rapidement dans le flux. 
+ Dans la section **Informations sur le flux**, passez en revue le codec, la résolution et le débit du flux. Les valeurs de résolution et de débit sont délibérément définies à un niveau bas sur le Raspberry Pi afin de minimiser l'utilisation de la bande passante pour ce didacticiel. 

  Pour consulter les CloudWatch métriques Amazon créées pour votre stream, sélectionnez **Afficher les métriques du stream dans CloudWatch**. 
+ Sous **Durée de conservation**, notez que le flux vidéo est conservé une journée. Vous pouvez modifier cette valeur en spécifiant **No data retention** (Pas de rétention des données) ou une valeur pouvant aller d'une journée jusqu'à plusieurs années. 
+ Dans la section **Chiffrement côté serveur**, notez que vos données sont chiffrées au repos à l'aide d'une clé gérée par le AWS Key Management Service ()AWS KMS. 

## Problèmes de lecture
<a name="rpi-troubleshoot-playback"></a>

Vous trouverez ci-dessous certains problèmes de lecture fréquemment rencontrés et la procédure à suivre pour les résoudre.

### Aucun média, mais il y a des Acks persistants dans les journaux
<a name="rpi-troubleshoot-no-media"></a>

Si vous voyez PERSISTED Acks dans les journaux, cela signifie que Kinesis Video Streams a correctement ingéré et stocké le contenu multimédia chargé par. `kvssink` Les acks reçus de Kinesis Video Streams ressemblent à ceci. Dans le JSON, examinez la valeur de la `"EventType"` clé.

```
{"EventType":"RECEIVED","FragmentTimecode":252200,"FragmentNumber":"12345678901234567890123456724587702494771079511"}
{"EventType":"BUFFERING","FragmentTimecode":252467,"FragmentNumber":"12345678901234567890123456781729223736853277017"}
{"EventType":"RECEIVED","FragmentTimecode":252467,"FragmentNumber":"12345678901234567890123456781729223736853277017"}
{"EventType":"BUFFERING","FragmentTimecode":253000,"FragmentNumber":"12345678901234567890123456738870744847093249408"}
{"EventType":"PERSISTED","FragmentTimecode":252200,"FragmentNumber":"12345678901234567890123456724587702494771079511"}
{"EventType":"PERSISTED","FragmentTimecode":252467,"FragmentNumber":"1234567890123456789012345671729223736853277017"}
```

**Résolution :**

Patientez une minute ou deux dans la console Kinesis Video Streams, puis utilisez la double flèche droite. Si aucun média n'apparaît, vérifiez que votre stream est envoyé vers la bonne région et vérifiez l'orthographe du nom du stream. Vous pouvez trouver ces informations dans les journaux.

Consultez [Indiquez une région pour `kvssink`](examples-gstreamer-plugin-parameters.md#kvssink-region) pour plus d'informations sur la façon dont kvssink détermine la région à utiliser.

### Le contenu multimédia met beaucoup de temps à se charger dans le AWS Management Console
<a name="rpi-troubleshoot-load-time"></a>

**Important**  
L'expérience de lecture sur console est différente de l'expérience de lecture HLS et DASH. Utilisez également l'exemple de [page Web hébergée par](https://aws-samples.github.io/amazon-kinesis-video-streams-media-viewer/) le lecteur multimédia GitHub pour tester la lecture. Le code source de la page Web se trouve [ici](https://github.com/aws-samples/amazon-kinesis-video-streams-media-viewer).

Le contenu multimédia peut se charger lentement dans la console en raison d'une faible bande passante réseau ou d'un périphérique restreint, mais cela peut également être dû à l'encodage vidéo et à la fragmentation. 

**Principes de base de l'encodage vidéo :**
+ Les codeurs H.264 et H.265 utilisent des images clés (images I) et des images prédites (images P) pour une compression efficace.
+ Les images-clés contiennent des données d'image complètes, tandis que les images P contiennent uniquement les modifications par rapport aux images précédentes.
+ L' « intervalle entre images clés » détermine la fréquence à laquelle les images-clés apparaissent dans le flux vidéo.

**Fragmentation dans le streaming :**
+ Dans Kinesis Video Streams, les nouveaux fragments commencent par chaque image-clé. Pour de plus amples informations, veuillez consulter [Modèle de données Kinesis Video Streams](how-data.md).
+ *La longueur du fragment (en secondes) peut être estimée comme suit : *intervalle entre images clé ÷ fréquence* d'images*

  **Exemple :**

  Pour un flux avec un intervalle d'images clé de 30 et une fréquence d'images de 15 images par seconde : 

  Longueur du fragment = 30 ÷ 15 = 2 secondes

En raison de l'allongement des intervalles entre les images-clés, les fragments plus longs augmentent la latence dans le streaming multimédia.

**Résolution :**

Pour améliorer les temps de chargement, pensez à réduire l'intervalle entre les images-clés. Cela créera des fragments plus courts, diminuera la latence, mais augmentera également la taille du fichier vidéo.

Pour l'`x264enc` GStreamer élément, vous pouvez définir explicitement l'intervalle entre les images-clés via la `key-int-max` propriété :

```
x264enc bframes=0 key-int-max=60
```

Lorsque vous examinez les résultats du journal, notez la fréquence à laquelle le client de téléchargement reçoit des messages ACKs de Kinesis Video Streams. Plus le nombre d'images-clés générées est élevé, plus le nombre d'images ACKs renvoyées est élevé.

### Le média est déformé ou contient des artefacts
<a name="rpi-troubleshoot-distortion"></a>

Pour résoudre ce problème, assurez-vous que tous les câbles sont bien connectés. Vérifiez la sortie `libcamera-hello` (ou `raspistill` pour les anciennes caméras Pi) des modules de caméra.

Dans votre GStreamer pipeline, remplacez `kvssink` par `autovideosink` ou `matroskamux` et`filesink`. Par exemple :

```
... x264enc tune=zerolatency speed-preset=ultrafast bframes=0 key-int-max=60 byte-stream=true ! h264parse ! matroskamux ! filesink location=output.mkv 
```

Passez en revue le fichier de sortie `filesink` ou le lecteur multimédia qui s'ouvre lors `autovideosink` de l'utilisation pour voir si les artefacts sont également présents.

Passez également en revue le résultat du pipeline suivant :

```
gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink
```

L'ajout d'éléments à votre pipeline, tels que le [dewarp](https://gstreamer.freedesktop.org/documentation/opencv/dewarp.html?gi-language=c), peut corriger les résultats des caméras Fish Eye.

Vérifiez les codecs de sortie pris en charge par votre caméra et ajustez les éléments selon vos besoins. 

Par exemple, si votre caméra USB ne prend en charge que la sortie JPEG, vous devrez utiliser les `jpegdec` éléments `jpegparse` et pour transformer le support avant de l'encoder en H.264 à l'aide `x264enc` de. Recherchez de l'aide sur les GStreamer forums pour d'autres utilisateurs utilisant des pipelines et/ou des configurations de webcam similaires.

# Résolution des problèmes de compilation sur le SDK C\$1\$1 Producer pour Raspberry Pi
<a name="troubleshoot-rpi"></a>

Si vous rencontrez un problème de compilation et que vous souhaitez essayer différents CMake arguments, veillez à effectuer une nouvelle génération. Supprimez les `build` dossiers `open-source``dependency`, et avant de réessayer.

## Problèmes de création avec OpenSSL
<a name="troubleshoot-rpi-build"></a>

Si vous recevez un résultat similaire à ce qui suit, cela indique qu'OpenSSL a mal détecté l'architecture de votre système.

```
crypto/md5/md5-aarch64.S: Assembler messages:
crypto/md5/md5-aarch64.S:3: Error: unrecognized symbol type ""
crypto/md5/md5-aarch64.S:6: Error: bad instruction `stp x19,x20,[sp,#-80]!'
crypto/md5/md5-aarch64.S:7: Error: bad instruction `stp x21,x22,[sp,#16]'
crypto/md5/md5-aarch64.S:8: Error: bad instruction `stp x23,x24,[sp,#32]'
crypto/md5/md5-aarch64.S:9: Error: bad instruction `stp x25,x26,[sp,#48]'
```

Dans cet exemple, il tente de créer une version 64 bits (`linux-aarch64`) alors que ce Raspberry Pi est en réalité 32 bits. Certains appareils Raspberry Pi ont un noyau 64 bits, mais un espace utilisateur 32 bits.

Déterminez l'architecture pour laquelle OpenSSL essaie de créer. Vous pouvez trouver la ligne de journal lors de l'`configure`étape pour OpenSSL :

```
[ 33%] Performing update step for 'project_libopenssl'
-- Already at requested tag: OpenSSL_1_1_1t
[ 44%] No patch step for 'project_libopenssl'
[ 55%] Performing configure step for 'project_libopenssl'
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 1.1.1t (0x1010114fL) for linux-x86_64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile
```

Vérifiez l'architecture de votre système :
+ Vérifiez le nombre de bits du noyau : exécutez `uname -m`
+ Vérifiez le nombre de bits de l'espace utilisateur : exécuter `getconf LONG_BIT`

Vous pouvez également consulter les informations relatives à votre processeur à l'aide des `lscpu` commandes `cat /proc/cpuinfo` ou. 

**Résolution :**

Pour résoudre ce problème, ajoutez l' CMake argument suivant lors de la création, afin de vous assurer qu'OpenSSL se construit correctement pour l'architecture ARM 32 bits :

```
-DBUILD_OPENSSL_PLATFORM=linux-armv4 
```

## Résoudre les problèmes `kvssink` de chargement dans GStreamer
<a name="troubleshoot-rpi-kvssink"></a>

Confirmer `GST_PLUGIN_PATH`

Assurez-vous que la variable d'`GST_PLUGIN_PATH`environnement de votre session shell en cours pointe vers le répertoire contenant`kvssink`. Les variables d'environnement étant spécifiques à une session, vous devez les définir pour chaque nouvelle session. Pour rendre cette modification permanente, consultez « Mettre à jour le script de démarrage de votre shell pour inclure la définition de la variable d'environnement GST\$1PLUGIN\$1PATH ». 

**Erreur : Impossible d'ouvrir le fichier objet partagé : aucun fichier ou répertoire de ce type**

Si le message d'erreur s'affiche`Cannot open shared object file: No such file or directory`, exécutez la commande suivante :

```
gst-inspect-1.0 /path/to/libgstkvssink.so
```

Si vous recevez le résultat suivant, cela indique que l'éditeur de liens dynamiques ne parvient pas à localiser les bibliothèques requises pour`kvssink`. Cela se produit généralement pour les raisons suivantes :
+ Déménagement `kvssink` vers un endroit différent de celui où il a été construit.
+ Compilation croisée pour une architecture de processeur incorrecte.
+ Une dépendance requise est manquante.

**Sortie** :

```
WARNING: erroneous pipeline: no element "kvssink"
error while loading shared libraries: libcproducer.so: cannot open shared object file: No such file or directory
```

**Résolution :**

Pour les **bibliothèques déplacées**, ajoutez le répertoire contenant les bibliothèques manquantes à`LD_LIBRARY_PATH`.

À partir du répertoire racine du dépôt d'origine, vous pouvez localiser la bibliothèque manquante à l'aide de l'`find`utilitaire. Dans le terminal, tapez : 

```
find . -name "*libcproducer*" 
```

**Sortie** :

```
./build/dependency/libkvscproducer/kvscproducer-src/libcproducer.so
```

Le séparateur de chemin de fichier sur les appareils Linux est`:`. La commande ci-dessous ajoute un nouveau chemin de dossier à la variable d'`LD_LIBRARY_PATH`environnement existante, en préservant les valeurs précédentes. 

Dans votre terminal, saisissez :

```
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/build/dependency/libkvscproducer/kvscproducer-src
```

**Important**  
Les variables d'environnement sont spécifiques à la session. Pour conserver les modifications d'une session à l'autre, modifiez le script de démarrage de votre shell.

Vous devrez peut-être également ajouter le `open-source/local/lib` à votre`$LD_LIBRARY_PATH`.

**Erreur :. /path/to/libcproducer.so.1 : en-tête ELF non valide**

Si vous recevez cette erreur lors du chargement des **bibliothèques partagées**, cela peut être dû à des liens symboliques rompus (`symlinks`). Les liens symboliques peuvent être interrompus si le système d'exploitation de la machine hôte ne correspond pas à celui de la machine cible. Par exemple, la compilation croisée sur un MacBook pour un Raspberry Pi.

Une autre cause possible est que les fichiers binaires créés étaient destinés à la mauvaise architecture. Par exemple, si les fichiers binaires ont été conçus pour x86 (le Raspberry Pi utilise ARM CPUs).

Accédez à l'emplacement de bibliothèque spécifié dans l'erreur et tapez : `ls -la` pour inspecter la bibliothèque`symlinks`.

**Réponse :**

```
drwxr-xr-x  16 me  staff      512 Sep 10 17:16 .
drwxr-xr-x   7 me  staff      224 Jan  6 23:46 ..
drwxr-xr-x   4 me  staff      128 Sep 10 17:16 engines-1.1
-rwxr-xr-x   1 me  staff  2294496 Sep 10 17:16 libcrypto.1.1.so
-rw-r--r--   1 me  staff  4002848 Sep 10 17:16 libcrypto.a
lrwxr-xr-x   1 me  staff       19 Sep 10 17:16 libcrypto.so -> libcrypto.1.1.so
-rwxr-xr-x   1 me  staff   631176 Sep 10 17:12 liblog4cplus-2.0.3.so
lrwxr-xr-x   1 me  staff       24 Sep 10 17:12 liblog4cplus.so -> liblog4cplus-2.0.3.so
-rwxr-xr-x   1 me  staff     1012 Sep 10 17:12 liblog4cplus.a
-rwxr-xr-x   1 me  staff   694328 Sep 10 17:12 liblog4cplusU-2.0.3.so
lrwxr-xr-x   1 me  staff       25 Sep 10 17:12 liblog4cplusU.dylib -> liblog4cplusU-2.0.3.so
-rwxr-xr-x   1 me  staff     1017 Sep 10 17:12 liblog4cplusU.a
-rwxr-xr-x   1 me  staff   536416 Sep 10 17:16 libssl.1.1.so
-rw-r--r--   1 me  staff   795184 Sep 10 17:16 libssl.a
lrwxr-xr-x   1 me  staff       16 Sep 10 17:16 libssl.so -> libssl.1.1.so
drwxr-xr-x   6 me  staff      192 Sep 10 17:16 pkgconfig
```

Dans l'exemple de sortie ci-dessus, `symlinks` ils ne sont pas cassés. Les Broken n'`symlinks`auront pas de flèches pointant vers leurs cibles.

**Résolution :**

Il existe deux options pour corriger les liens symboliques :
+ **Recommandé :** Recréez le `symlink` avec la `ln` commande. Type :

  ```
  ln -s /path/to/actual/library /path/to/symlink
  ```
+ Copiez le fichier de bibliothèque actuel et renommez-le pour qu'il corresponde au`symlink`.
**Note**  
Cette option entraîne une augmentation de l'utilisation du stockage. 

La meilleure pratique consiste à compiler sur le même système d'exploitation à l'aide d'outils tels que Docker pour éviter les problèmes de compilation croisée. 

**Dépendances manquantes :**

Si le nom de bibliothèque manquant commence par`libkvs`, consultez la section « bibliothèques déplacées » ci-dessus pour installer les bibliothèques Kinesis Video Streams de l'appareil hôte vers l'appareil cible. 

Dans le cas [Installation des prérequis logiciels](producersdk-cpp-rpi-software.md) contraire, assurez-vous que tous les logiciels open source requis sont installés sur l'appareil cible.

# Référence du code d'erreur
<a name="producer-sdk-errors"></a>

Cette section contient des informations relatives aux erreurs et codes d'état pour le [Transférer vers Kinesis Video Streams](producer-sdk.md).

Pour obtenir plus d'informations sur les solutions concernant des problèmes courants, consultez [Résolution des problèmes liés à Kinesis Video Streams](troubleshooting.md).

**Topics**
+ [Erreurs et codes d'état renvoyés par les PutFrame rappels - Code indépendant de la plate-forme (PIC)](#producer-sdk-errors-putframe)
+ [Erreurs et codes d'état renvoyés par les PutFrame rappels - bibliothèque C Producer](#producer-sdk-errors-putframe-c)

## Erreurs et codes d'état renvoyés par les PutFrame rappels - Code indépendant de la plate-forme (PIC)
<a name="producer-sdk-errors-putframe"></a>

Les sections suivantes contiennent des informations d'erreur et d'état renvoyées par des rappels pour l'`PutFrame`opération dans le code PIC (Platform Independent Code).

**Topics**
+ [Codes d'erreur et d'état renvoyés par la bibliothèque cliente](#producer-sdk-errors-client)
+ [Codes d'erreur et d'état renvoyés par la bibliothèque de durées](#producer-sdk-errors-duration)
+ [Codes d'erreur et d'état renvoyés par la bibliothèque commune](#producer-sdk-errors-common)
+ [Codes d'erreur et d'état renvoyés par la bibliothèque heap](#producer-sdk-errors-heap)
+ [Codes d'erreur et d'état renvoyés par la MKVGen bibliothèque](#producer-sdk-errors-mkvgen)
+ [Codes d'erreur et d'état renvoyés par la bibliothèque Trace](#producer-sdk-errors-trace)
+ [Codes d'erreur et d'état renvoyés par la bibliothèque Utils](#producer-sdk-errors-utils)
+ [Codes d'erreur et d'état renvoyés par la bibliothèque View](#producer-sdk-errors-view)

### Codes d'erreur et d'état renvoyés par la bibliothèque cliente
<a name="producer-sdk-errors-client"></a>

Le tableau suivant contient les informations d'erreur et d'état renvoyées par les méthodes de la bibliothèque Kinesis Video `Client` Streams.


****  

| Code | Message | Description | Action recommandée | 
| --- | --- | --- | --- | 
| 0x52000001 | STATUS\$1MAX\$1STREAM\$1COUNT | Le nombre maximal de flux a été atteint. | Spécifiez un plus grand nombre max. de flux dans DeviceInfo que le nombre spécifié dans [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). | 
| 0x52000002 | STATUS\$1MIN\$1STREAM\$1COUNT | Erreur relative au nombre minimal de flux. | Spécifiez le nombre maximum de flux entrants supérieurs à zéroDeviceInfo. | 
| 0x52000003 | STATUS\$1INVALID\$1DEVICE\$1NAME\$1LENGTH | La longueur du nom de périphérique n'est pas valide. | Reportez-vous à la longueur maximale du nom de l'appareil en caractères spécifiée dans[Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). | 
| 0x52000004 | STATUS\$1INVALID\$1DEVICE\$1INFO\$1VERSION | La version de la structure DeviceInfo est non valide. | Spécifiez la version actuelle correcte de la structure. | 
| 0x52000005 | STATUS\$1MAX\$1TAG\$1COUNT | Le nombre maximal de balises a été atteint. | Reportez-vous au nombre maximal de balises actuel spécifié dans[Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). | 
| 0x52000006 | STATUS\$1DEVICE\$1FINGERPRINT\$1LENGTH | 
| 0x52000007 | STATUS\$1INVALID\$1CALLBACKS\$1VERSION | La version de la structure Callbacks est non valide. | Spécifiez la version actuelle correcte de la structure. | 
| 0x52000008 | STATUS\$1INVALID\$1STREAM\$1INFO\$1VERSION | La version de la structure StreamInfo est non valide. | Spécifiez la version actuelle correcte de la structure. | 
| 0x52000009 | STATUS\$1INVALID\$1STREAM\$1NAME\$1LENGTH | La longueur du nom de flux n'est pas valide. | Reportez-vous à la longueur maximale du nom du flux en caractères spécifiée dans[Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). | 
| 0x5200000a | STATUS\$1INVALID\$1STORAGE\$1SIZE | Une taille de stockage non valide a été spécifiée. | La taille de stockage en octets doit être comprise dans les limites spécifiées dans [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). | 
| 0x5200000b | STATUS\$1INVALID\$1ROOT\$1DIRECTORY\$1LENGTH | La longueur de chaîne du répertoire racine est non valide. | Reportez-vous à la longueur maximale du chemin du répertoire racine spécifiée dans[Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). | 
| 0x5200000c | STATUS\$1INVALID\$1SPILL\$1RATIO | Taux de déversement non valide. | Exprimez le taux de déversement sous forme de pourcentage compris entre 0 et 100. | 
| 0x5200000d | STATUS\$1INVALID\$1STORAGE\$1INFO\$1VERSION | La version de la structure StorageInfo est non valide. | Spécifiez la version actuelle correcte de la structure. | 
| 0x5200000e | STATUS\$1INVALID\$1STREAM\$1STATE | Le flux est dans un état qui ne permet pas d'effectuer l'opération actuelle. | Le plus souvent, cette erreur se produit lorsque le SDK n'atteint pas l'état requis pour effectuer l'opération demandée. Par exemple, elle se produit si l'appel de l'API GetStreamingEndpoint échoue et que l'application cliente l'ignore et continue de placer des images dans le flux.  | 
| 0x5200000f | STATUS\$1SERVICE\$1CALL\$1CALLBACKS\$1MISSING | La structure Callbacks a des points d'entrée de fonction manquants pour certaines fonctions obligatoires. | Vérifiez que les rappels obligatoires sont implémentés dans l'application cliente. Cette erreur n'est visible que pour les clients PIC (Platform Independent Code). C\$1\$1 et d'autres wrappers de plus haut niveau satisfont à ces appels. | 
| 0x52000010 | STATUS\$1SERVICE\$1CALL\$1NOT\$1AUTHORIZED\$1ERROR | Non autorisé. | Vérifiez le jeton de sécurité, le certificat, l'intégration du jeton de sécurité et l'expiration. Vérifiez que les droits associés au jeton sont corrects. Pour les exemples d'applications Kinesis Video Streams, vérifiez que la variable d'environnement est correctement définie. | 
| 0x52000011 | STATUS\$1DESCRIBE\$1STREAM\$1CALL\$1FAILED | Échec de l'API DescribeStream. | Cette erreur est renvoyée après l'échec de la nouvelle tentative d'exécution de l'API DescribeStream. Le client PIC renvoie cette erreur après avoir arrêté de réessayer.  | 
| 0x52000012 | STATUS\$1INVALID\$1DESCRIBE\$1STREAM\$1RESPONSE | La structure DescribeStreamResponse est non valide.  | La structure qui a été transmise à DescribeStreamResultEvent a pour valeur NULL ou contient des éléments non valides, tels qu'un nom Amazon Resource Name (ARN) de valeur NULL. | 
| 0x52000013 | STATUS\$1STREAM\$1IS\$1BEING\$1DELETED\$1ERROR | Le flux est en cours de suppression. | Un échec d'API a été causé par le flux en cours de suppression. Vérifiez qu'aucun autre processus n'essaie de supprimer le flux pendant qu'il est en cours d'utilisation.  | 
| 0x52000014 | STATUS\$1SERVICE\$1CALL\$1INVALID\$1ARG\$1ERROR | Des arguments non valides ont été spécifiés pour l'appel de service.  | Le backend renvoie cette erreur lorsqu'un argument d'appel de service n'est pas valide ou lorsque le SDK rencontre une erreur qu'il ne peut pas interpréter. | 
| 0x52000015 | STATUS\$1SERVICE\$1CALL\$1DEVICE\$1NOT\$1FOUND\$1ERROR | L'appareil est introuvable.  | Vérifiez que l'appareil n'est pas supprimé pendant son utilisation.  | 
| 0x52000016 | STATUS\$1SERVICE\$1CALL\$1DEVICE\$1NOT\$1PROVISIONED\$1ERROR | L'appareil n'a pas été mis en service.  | Vérifiez que l'appareil a été approvisionné.  | 
| 0x52000017 | STATUS\$1SERVICE\$1CALL\$1RESOURCE\$1NOT\$1FOUND\$1ERROR | Une ressource générique introuvable a été renvoyée du service.  | Cette erreur se produit lorsque le service ne peut pas localiser la ressource (par exemple, un flux). Cela peut signifier différentes choses selon les contextes, mais la cause probable est l'utilisation de APIs avant la création du flux. L'utilisation du SDK confirme que le flux a été créé en premier.  | 
| 0x52000018 | STATUS\$1INVALID\$1AUTH\$1LEN | Longueur non valide des infos d'authentification.  | Reportez-vous aux valeurs actuelles spécifiées dans [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). | 
| 0x52000019 | STATUS\$1CREATE\$1STREAM\$1CALL\$1FAILED | L'appel de l'API CreateStream a échoué.  | Reportez-vous à la chaîne d'erreur pour obtenir de plus amples informations sur la raison pour laquelle l'opération a échoué. | 
| 0x5200002a | STATUS\$1GET\$1STREAMING\$1TOKEN\$1CALL\$1FAILED | L'appel de GetStreamingToken a échoué.  | Reportez-vous à la chaîne d'erreur pour obtenir de plus amples informations sur la raison pour laquelle l'opération a échoué.  | 
| 0x5200002b | STATUS\$1GET\$1STREAMING\$1ENDPOINT\$1CALL\$1FAILED | L'appel de l'API GetStreamingEndpoint a échoué.  | Reportez-vous à la chaîne d'erreur pour obtenir de plus amples informations sur la raison pour laquelle l'opération a échoué. | 
| 0x5200002c | STATUS\$1INVALID\$1URI\$1LEN | Un URI d'une longueur de chaîne non valide a été renvoyé de l'API GetStreamingEndpoint.  | Reportez-vous aux valeurs maximales actuelles spécifiées dans [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). | 
| 0x5200002d | STATUS\$1PUT\$1STREAM\$1CALL\$1FAILED | L'appel de l'API PutMedia a échoué.  | Reportez-vous à la chaîne d'erreur pour obtenir de plus amples informations sur la raison pour laquelle l'opération a échoué.  | 
| 0x5200002e | STATUS\$1STORE\$1OUT\$1OF\$1MEMORY | Le magasin de contenu manque de mémoire. | Le magasin de contenu est partagé entre les flux et doit avoir une capacité suffisante pour stocker les durées maximales pour tous les flux \$1 \$120 % (pour tenir compte de la défragmentation). Il est important de ne pas saturer l'espace de stockage. Choisissez des valeurs pour la durée maximale par flux qui correspondent aux tolérances cumulées de la taille de stockage et de la latence. Nous recommandons de supprimer les cadres lorsqu'ils sortent de la fenêtre d'affichage du contenu plutôt que d'être simplement placés (pression sur la mémoire du magasin de contenu). Cela est dû au fait que la suppression des cadres déclenche les rappels de notification de la pression du cours d'eau. Ensuite, l'application peut ajuster les composants multimédias en amont (comme l'encodeur) pour fluidifier la vitesse de transmission, supprimer des images ou agir en conséquence.  | 
| 0x5200002f | STATUS\$1NO\$1MORE\$1DATA\$1AVAILABLE | Aucune donnée n'est plus disponible actuellement pour un flux.  | Il s'agit d'un résultat valide potentiel lorsque le pipeline média produit plus lentement que le thread de mise en réseau consomme les images à envoyer au service. Les clients de niveau supérieur (par exemple, C\$1\$1, Java ou Android) ne voient pas cet avertissement car il est géré en interne. | 
| 0x52000030 | STATUS\$1INVALID\$1TAG\$1VERSION | La version de la structure Tag est non valide.  | Spécifiez la version actuelle correcte de la structure.  | 
| 0x52000031 | STATUS\$1SERVICE\$1CALL\$1UNKNOWN\$1ERROR | Une erreur inconnue ou générique a été renvoyée à partir de la pile de mise en réseau.  | Consultez les journaux pour obtenir des informations plus détaillées.  | 
| 0x52000032 | STATUS\$1SERVICE\$1CALL\$1RESOURCE\$1IN\$1USE\$1ERROR | Ressource en cours d'utilisation.  | Renvoyée du service. Pour plus d'informations, consultez le manuel de référence de l'API Kinesis Video Streams.  | 
| 0x52000033 | STATUS\$1SERVICE\$1CALL\$1CLIENT\$1LIMIT\$1ERROR | Limite du client.  | Renvoyée du service. Pour plus d'informations, consultez le manuel de référence de l'API Kinesis Video Streams. | 
| 0x52000034 | STATUS\$1SERVICE\$1CALL\$1DEVICE\$1LIMIT\$1ERROR | Limite de l'appareil.  | Renvoyée du service. Pour plus d'informations, consultez le manuel de référence de l'API Kinesis Video Streams. | 
| 0x52000035 | STATUS\$1SERVICE\$1CALL\$1STREAM\$1LIMIT\$1ERROR | Limite du flux.  | Renvoyée du service. Pour plus d'informations, consultez le manuel de référence de l'API Kinesis Video Streams. | 
| 0x52000036 | STATUS\$1SERVICE\$1CALL\$1RESOURCE\$1DELETED\$1ERROR | La ressource a été supprimée ou est en cours de suppression.  | Renvoyée du service. Pour plus d'informations, consultez le manuel de référence de l'API Kinesis Video Streams. | 
| 0x52000037 | STATUS\$1SERVICE\$1CALL\$1TIMEOUT\$1ERROR | L'appel du service a expiré.  | L'appel d'une API de service particulière a entraîné le dépassement d'un délai d'attente. Vérifiez que vous disposez d'une connexion réseau valide. Le code PIC retente automatiquement l'opération.  | 
| 0x52000038 | STATUS\$1STREAM\$1READY\$1CALLBACK\$1FAILED | Notification de préparation de flux.  | Cette notification est envoyée à partir du code PIC au client pour indiquer que le flux asynchrone a été créé.  | 
| 0x52000039 | STATUS\$1DEVICE\$1TAGS\$1COUNT\$1NON\$1ZERO\$1TAGS\$1NULL | Des balises non valides ont été spécifiées.  | Le nombre de balises n'est pas nul, mais les balises sont vides. Vérifiez que les balises sont spécifiées ou que le nombre est égal à zéro.  | 
| 0x5200003a | STATUS\$1INVALID\$1STREAM\$1DESCRIPTION\$1VERSION | La version de la structure StreamDescription est non valide.  | Spécifiez la version actuelle correcte de la structure. | 
| 0x5200003b | STATUS\$1INVALID\$1TAG\$1NAME\$1LEN | La longueur du nom de balise n'est pas valide.  | Reportez-vous aux limites pour le nom de balise qui sont spécifiées dans [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). | 
| 0x5200003c | STATUS\$1INVALID\$1TAG\$1VALUE\$1LEN | La longueur de la valeur de balise n'est pas valide.  | Reportez-vous aux limites pour la valeur de balise qui sont spécifiées dans [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). | 
| 0x5200003d | STATUS\$1TAG\$1STREAM\$1CALL\$1FAILED | L'API TagResource a échoué. | L'appel de l'API TagResource a échoué. Recherchez une connexion réseau valide. Consultez les journaux pour obtenir plus d'informations sur l'échec.  | 
| 0x5200003e | STATUS\$1INVALID\$1CUSTOM\$1DATA | Données personnalisées non valides lors de l'appel PIC APIs.  | Des données personnalisées non valides ont été spécifiées lors d'un appel au PIC APIs. Cela peut se produire uniquement dans les clients qui utilisent directement le code PIC.  | 
| 0x5200003f | STATUS\$1INVALID\$1CREATE\$1STREAM\$1RESPONSE | La structure CreateStreamResponse est non valide.  | La structure ou ses champs membres ne sont pas valides (c'est-à-dire que le nom ARN est null ou plus grand que ce qui est spécifié dans [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits)).  | 
| 0x52000040 | STATUS\$1CLIENT\$1AUTH\$1CALL\$1FAILED  | L'authentification du client a échoué.  | Le PIC n'a pas réussi à obtenir les informations d'authentification appropriées (AccessKeyIdouSecretAccessKey) après plusieurs tentatives. Vérifiez l'intégration de l'authentification. Les exemples d'application utilisent des variables d'environnement pour transmettre des informations d'identification à la bibliothèque Producteur C\$1\$1.  | 
| 0x52000041 | STATUS\$1GET\$1CLIENT\$1TOKEN\$1CALL\$1FAILED | L'appel pour obtenir le jeton de sécurité a échoué.  | Cela peut se produire uniquement pour les clients qui utilisent directement le code PIC. Après un certain nombre de tentatives, l'appel échoue avec cette erreur. | 
| 0x52000042 | STATUS\$1CLIENT\$1PROVISION\$1CALL\$1FAILED | Erreur de mise en service.  | Le provisionnement n'est pas implémenté.  | 
| 0x52000043 | STATUS\$1CREATE\$1CLIENT\$1CALL\$1FAILED | Impossible de créer le client producteur.  | Une erreur générique a été renvoyée par le code PIC après un certain nombre de tentatives lors de l'échec de la création du client.  | 
| 0x52000044 | STATUS\$1CLIENT\$1READY\$1CALLBACK\$1FAILED | Impossible d'obtenir le client producteur à l'état READY.  | Erreur renvoyée par la machine d'état PIC si le code PIC ne passe pas à l'état READY. Consultez les journaux pour obtenir plus d'informations sur la cause principale.  | 
| 0x52000045 | STATUS\$1TAG\$1CLIENT\$1CALL\$1FAILED | Échec de TagResource pour le client producteur.  | L'appel de l'API TagResourcea échoué pour le client producteur. Consultez les journaux pour obtenir plus d'informations sur la cause principale.  | 
| 0x52000046 | STATUS\$1INVALID\$1CREATE\$1DEVICE\$1RESPONSE | La création de l'appareil/producteur a échoué.  | Les niveaux supérieurs SDKs (par exemple, C\$1\$1 ou Java) n'implémentent pas encore l'API de création d'appareils ou de producteurs. Les clients qui utilisent le code PIC directement peuvent indiquer un échec en utilisant la notification des résultats.  | 
| 0x52000047 | STATUS\$1ACK\$1TIMESTAMP\$1NOT\$1IN\$1VIEW\$1WINDOW | L'horodatage de l'ACK reçu n'est pas dans la vue.  | Cette erreur se produit si l'image correspondant à l'ACK reçu sort de la fenêtre d'affichage de contenu. En règle générale, cela se produit si la livraison ACK est lente. Cela peut être interprété comme un avertissement et une indication que la liaison descendante est lente.  | 
| 0x52000048 | STATUS\$1INVALID\$1FRAGMENT\$1ACK\$1VERSION | La version de la structure FragmentAck est non valide.  | Spécifiez la version actuelle correcte de la structure FragmentAck. | 
| 0x52000049 | STATUS\$1INVALID\$1TOKEN\$1EXPIRATION | Expiration non valide du jeton de sécurité.  | À l'avenir, l'expiration du jeton de sécurité devrait avoir un horodatage absolu supérieur à l'horodatage actuel, avec un délai de grâce. Pour les limites de la période de grâce, reportez-vous à [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x5200004a | STATUS\$1END\$1OF\$1STREAM | Indicateur de fin de flux (EOS).  | Dans l'appel de l'API GetStreamData, indique que la session de la poignée de chargement en cours est terminée. Cela se produit si la session se termine ou présente des erreurs, ou si le jeton de session a expiré et que la session est en cours de rotation.  | 
| 0x5200004b | STATUS\$1DUPLICATE\$1STREAM\$1NAME | Nom de flux en double.  | Plusieurs flux ne peuvent pas avoir le même nom de flux. Choisissez un nom unique pour le flux.  | 
| 0x5200004c | STATUS\$1INVALID\$1RETENTION\$1PERIOD | Période de conservation non valide.  | Une période de conservation non valide est spécifiée dans la structure StreamInfo. Pour plus d'informations sur la plage de valeurs valides pour la période de conservation, reportez-vous à [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x5200004d | STATUS\$1INVALID\$1ACK\$1KEY\$1START | Non valide FragmentAck.  | Impossible d'analyser la chaîne ACK de fragment. Indicateur de début de clé non valide. La chaîne ACK de fragment peut être endommagée. Elle peut se corriger automatiquement et cette erreur peut être traitée comme un avertissement.  | 
| 0x5200004e | STATUS\$1INVALID\$1ACK\$1DUPLICATE\$1KEY\$1NAME | Non valide FragmentAck.  | Impossible d'analyser la chaîne ACK de fragment. Plusieurs clés ont le même nom. La chaîne ACK de fragment peut être endommagée. Elle peut se corriger automatiquement et cette erreur peut être traitée comme un avertissement.  | 
| 0x5200004f | STATUS\$1INVALID\$1ACK\$1INVALID\$1VALUE\$1START | Non valide FragmentAck.  | Impossible d'analyser la chaîne ACK de fragment en raison d'un indicateur de début de valeur de clé non valide. La chaîne ACK de fragment peut être endommagée. Elle peut se corriger automatiquement, et cette erreur peut être traitée comme un avertissement.  | 
| 0x52000050 | STATUS\$1INVALID\$1ACK\$1INVALID\$1VALUE\$1END | Non valide FragmentAck.  | Impossible d'analyser la chaîne ACK de fragment en raison d'un indicateur de fin de valeur de clé non valide. La chaîne ACK de fragment peut être endommagée. Elle peut se corriger automatiquement et cette erreur peut être traitée comme un avertissement.  | 
| 0x52000051 | STATUS\$1INVALID\$1PARSED\$1ACK\$1TYPE | Non valide FragmentAck.  | Impossible d'analyser la chaîne ACK de fragment car un type ACK non valide a été spécifié.  | 
| 0x52000052 | STATUS\$1STREAM\$1HAS\$1BEEN\$1STOPPED | Le flux a été arrêté.  | Le flux a été arrêté, mais une image est encore en train d'être placée dans le flux. | 
| 0x52000053 | STATUS\$1INVALID\$1STREAM\$1METRICS\$1VERSION | La version de la structure StreamMetrics est non valide.  | Spécifiez la version actuelle correcte de la structure StreamMetrics.  | 
| 0x52000054 | STATUS\$1INVALID\$1CLIENT\$1METRICS\$1VERSION | La version de la structure ClientMetrics est non valide.  | Spécifiez la version actuelle correcte de la structure ClientMetrics.  | 
| 0x52000055 | STATUS\$1INVALID\$1CLIENT\$1READY\$1STATE | L'initialisation du producteur n'a pas atteint un état READY.  | Impossible d'atteindre l'état READY lors de l'initialisation du client producteur. Consultez les journaux pour en savoir plus.  | 
| 0x52000056 | STATUS\$1STATE\$1MACHINE\$1STATE\$1NOT\$1FOUND | Erreur interne de machine d'état.  | Erreur qui n'est pas visible publiquement.  | 
| 0x52000057 | STATUS\$1INVALID\$1FRAGMENT\$1ACK\$1TYPE | Un type ACK non valide est spécifié dans la structure FragmentAck.  | La structure FragmentAck doit contenir les types ACK définis dans l'en-tête public.  | 
| 0x52000058 | STATUS\$1INVALID\$1STREAM\$1READY\$1STATE | Erreur de transition de machine d'état interne.  | Erreur qui n'est pas visible publiquement.  | 
| 0x52000059 | STATUS\$1CLIENT\$1FREED\$1BEFORE\$1STREAM | L'objet de flux a été libéré après la libération du producteur.  | Il y a eu une tentative pour libérer un objet de flux après la libération de l'objet producteur. Cela peut se produire uniquement dans des clients qui utilisent directement PIC.  | 
| 0x5200005a | STATUS\$1ALLOCATION\$1SIZE\$1SMALLER\$1THAN\$1REQUESTED | Erreur interne de stockage.  | Une erreur interne indiquant que la taille d'allocation réelle provenant du magasin de contenu est inférieure à la taille du cadre et du fragment empaquetés.  | 
| 0x5200005b | STATUS\$1VIEW\$1ITEM\$1SIZE\$1GREATER\$1THAN\$1ALLOCATION | Erreur interne de stockage.  | La taille stockée de l'allocation dans l'affichage du contenu est supérieure à la taille d'allocation dans le magasin de contenu.  | 
| 0x5200005c | STATUS\$1ACK\$1ERR\$1STREAM\$1READ\$1ERROR | Erreur de lecture de flux ACK.  | Une erreur renvoyée par l'ACK depuis le backend indiquant une erreur de lecture ou d'analyse du flux. Elle se produit généralement lorsque le backend ne parvient pas à récupérer le flux. Un restreaming automatique peut généralement corriger cette erreur.  | 
| 0x5200005d | STATUS\$1ACK\$1ERR\$1FRAGMENT\$1SIZE\$1REACHED | La taille maximale de fragment a été atteinte. | La taille maximale de fragment en octets est définie dans [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). Cette erreur indique la présence d'images très volumineuses ou l'absence d'images clés pour créer des fragments de taille gérable. Vérifiez les paramètres de l'encodeur et vérifiez que les images clés sont produites correctement. Pour les flux à très haute densité, configurez l'encodeur pour produire des fragments de plus petites durées pour gérer la taille maximale.  | 
| 0x5200005e | STATUS\$1ACK\$1ERR\$1FRAGMENT\$1DURATION\$1REACHED | La durée maximale de fragment a été atteinte.  | La durée maximale de fragment est définie dans [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). Cette erreur indique une très faible fréquence d'images par seconde ou l'absence d'images clés pour créer des fragments de durée gérable. Vérifiez les paramètres de l'encodeur et vérifiez que les images clés sont produites correctement à intervalles réguliers.  | 
| 0x5200005f | STATUS\$1ACK\$1ERR\$1CONNECTION\$1DURATION\$1REACHED | La durée maximale de connexion a été atteinte.  | Kinesis Video Streams applique la durée maximale de connexion spécifiée dans le. [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits) Le SDK Producer fait automatiquement pivoter le flux ou le jeton avant que le maximum ne soit atteint. Les clients utilisant le SDK ne devraient pas recevoir cette erreur. | 
| 0x52000060 | STATUS\$1ACK\$1ERR\$1FRAGMENT\$1TIMECODE\$1NOT\$1MONOTONIC | Les codes horaires n'augmentent pas de façon monotone.  | Le SDK Producer applique les horodatages, de sorte que les clients utilisant le SDK ne devraient pas recevoir cette erreur. | 
| 0x52000061 | STATUS\$1ACK\$1ERR\$1MULTI\$1TRACK\$1MKV | Pistes multiples dans le MKV.  | Le SDK Producer applique les flux à piste unique, de sorte que les clients utilisant le SDK ne devraient pas recevoir cette erreur.  | 
| 0x52000062 | STATUS\$1ACK\$1ERR\$1INVALID\$1MKV\$1DATA | Données MKV non valides.  | L'analyseur MKV du backend a rencontré une erreur lors de l'analyse du flux. Les clients utilisant le SDK peuvent rencontrer cette erreur si le flux est endommagé pendant la transition. Cela peut également se produire si les pressions de la zone tampon obligent le SDK à abandonner les châssis partiellement transmis. Dans ce dernier cas, nous vous recommandons de réduire le nombre d'images par seconde et la résolution, d'augmenter le taux de compression ou (s'il s'agit d'un réseau « surchargé ») d'augmenter la durée du stockage du contenu et de la mémoire tampon pour faire face aux pressions temporaires.  | 
| 0x52000063 | STATUS\$1ACK\$1ERR\$1INVALID\$1PRODUCER\$1TIMESTAMP | Horodatage non valide du kit Producer.  | Le service renvoie cet ACK d'erreur si l'horloge du producteur présente une grande dérive dans l'avenir. Les niveaux supérieurs SDKs (par exemple, Java ou C\$1\$1) utilisent une version de l'horloge système pour satisfaire le rappel horaire actuel du PIC. Vérifiez que l'horloge du système est correctement réglée. Les clients utilisant directement le PIC doivent vérifier que leurs fonctions de rappel renvoient l'horodatage correct.  | 
| 0x52000064 | STATUS\$1ACK\$1ERR\$1STREAM\$1NOT\$1ACTIVE | Flux inactif.  | Un appel à une API de backend a été effectué pendant que le flux n'était pas dans un état « Actif ». Cela se produit lorsque le client crée le flux et continue immédiatement à lui transmettre (push) des images. Le kit SDK gère ce scénario via la machine d'état et le mécanisme de récupération.  | 
| 0x52000065 | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1ACCESS\$1DENIED | AWS KMS erreur d'accès refusé.  | Erreur renvoyée lorsque le compte n'a pas accès à la clé spécifiée.  | 
| 0x52000066 | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1DISABLED | AWS KMS la touche est désactivée.  | La clé spécifiée a été désactivée.  | 
| 0x52000067 | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1VALIDATION\$1ERROR  | AWS KMS erreur de validation des clés.  | Erreur de validation générique. Pour plus d’informations, consultez la Référence des API [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/APIReference/).  | 
| 0x52000068 | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1UNAVAILABLE | AWS KMS key indisponible.  | La clé est indisponible. Pour plus d’informations, consultez la Référence des API [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/APIReference/).  | 
| 0x52000069 | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1INVALID\$1USAGE | Utilisation non valide de la clé KMS. | Le n' AWS KMS key est pas configuré pour être utilisé dans ce contexte. Pour plus d’informations, consultez la Référence des API [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/APIReference/).  | 
| 0x5200006a | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1INVALID\$1STATE | AWS KMS état non valide.  | Pour plus d’informations, consultez la Référence des API [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/APIReference/). | 
| 0x5200006b | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1NOT\$1FOUND | La clé KMS est introuvable.  | La clé est introuvable. Pour plus d’informations, consultez la Référence des API [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/APIReference/).  | 
| 0x5200006c | STATUS\$1ACK\$1ERR\$1STREAM\$1DELETED | Le flux a été ou est en cours de suppression.  | Le flux est en cours de suppression par une autre application ou via la AWS Management Console. | 
| 0x5200006d | STATUS\$1ACK\$1ERR\$1ACK\$1INTERNAL\$1ERROR | Erreur interne.  | Erreur interne du service générique.  | 
| 0x5200006e | STATUS\$1ACK\$1ERR\$1FRAGMENT\$1ARCHIVAL\$1ERROR | Erreur d'archivage du fragment.  | Erreur renvoyée lorsque le service ne parvient pas à indexer et conserver durablement le fragment. Bien que rare, elle peut se produire pour diverses raisons. Par défaut, le kit SDK tente d'envoyer à nouveau le fragment.  | 
| 0x5200006f | STATUS\$1ACK\$1ERR\$1UNKNOWN\$1ACK\$1ERROR | Erreur inconnue.  | Le service a renvoyé une erreur inconnue.  | 
| 0x52000070 | STATUS\$1MISSING\$1ERR\$1ACK\$1ID | Informations ACK manquantes.  | L'analyseur ACK a terminé l'analyse, mais les informations FragmentAck sont manquantes.  | 
| 0x52000071 | STATUS\$1INVALID\$1ACK\$1SEGMENT\$1LEN | Longueur non valide de segment ACK.  | Une chaîne de segment ACK d'une longueur non valide a été spécifiée pour l'analyseur ACK. Pour de plus amples informations, veuillez consulter [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x52000074 | STATUS\$1MAX\$1FRAGMENT\$1METADATA\$1COUNT | Le nombre maximal d'éléments de métadonnées a été ajouté à un fragment. | Un flux vidéo Kinesis peut ajouter jusqu'à 10 éléments de métadonnées à un fragment, soit en ajoutant un élément non persistant à un fragment, soit en ajoutant un élément persistant à la file d'attente de métadonnées. Pour de plus amples informations, veuillez consulter [Utilisation des métadonnées de streaming avec Kinesis Video Streams](how-meta.md).  | 
| 0x52000075 | STATUS\$1ACK\$1ERR\$1FRAGMENT\$1METADATA\$1LIMIT\$1REACHED | Une limite (nombre maximal de métadonnées, longueur de nom de métadonnées ou longueur de valeur de métadonnées) a été atteinte. | Le kit SDK Producer limite le nombre et la taille des éléments de métadonnées. Cette erreur ne se produit que si les limites du code du SDK du producteur sont modifiées. Pour de plus amples informations, veuillez consulter [Utilisation des métadonnées de streaming avec Kinesis Video Streams](how-meta.md).  | 
| 0x52000076 | STATUS\$1BLOCKING\$1PUT\$1INTERRUPTED\$1STREAM\$1TERMINATED | Non implémenté. |  | 
| 0x52000077 | STATUS\$1INVALID\$1METADATA\$1NAME | Le nom des métadonnées n'est pas valide. | Le nom des métadonnées ne peut pas commencer par la chaîne « AWS ». Si cette erreur se produit, l'élément de métadonnées n'est pas ajouté au fragment ou à la file d'attente de métadonnées. Pour de plus amples informations, veuillez consulter [Utilisation des métadonnées de streaming avec Kinesis Video Streams](how-meta.md). | 
| 0x52000078 | STATUS\$1END\$1OF\$1FRAGMENT\$1FRAME\$1INVALID\$1STATE | La fin d'une trame de fragment est à un état non valide. | La fin du fragment ne doit pas être envoyée dans un flux non-key-frame fragmenté. | 
| 0x52000079 | STATUS\$1TRACK\$1INFO\$1MISSING | Il manque les informations de piste. | Le numéro de piste doit être supérieur à zéro et correspondre à l'identifiant de piste. | 
| 0x5200007a | STATUS\$1MAX\$1TRACK\$1COUNT\$1EXCEEDED | Le nombre maximum de pistes est dépassé. | Vous pouvez avoir un maximum de trois titres par stream. | 
| 0x5200007b | STATUS\$1OFFLINE\$1MODE\$1WITH\$1ZERO\$1RETENTION | La durée de conservation du mode de streaming hors ligne est définie sur zéro. | La durée de rétention du mode streaming hors ligne ne doit pas être fixée à zéro. | 
| 0x5200007c | STATUS\$1ACK\$1ERR\$1TRACK\$1NUMBER\$1MISMATCH | Le numéro de piste de l'erreur ACK ne correspond pas. |  | 
| 0x5200007d | STATUS\$1ACK\$1ERR\$1FRAMES\$1MISSING\$1FOR\$1TRACK | Trames manquantes pour une piste.  |  | 
| 0x5200007e | STATUS\$1ACK\$1ERR\$1MORE\$1THAN\$1ALLOWED\$1TRACKS\$1FOUND | Le nombre maximal de pistes autorisé est dépassé. |  | 
| 0x5200007f | STATUS\$1UPLOAD\$1HANDLE\$1ABORTED | La poignée de chargement est abandonnée. |  | 
| 0x52000080 | STATUS\$1INVALID\$1CERT\$1PATH\$1LENGTH | Longueur de chemin de certificat non valide. |  | 
| 0x52000081 | STATUS\$1DUPLICATE\$1TRACK\$1ID\$1FOUND | ID de piste en double trouvé. |  | 
| 0x52000082 | STATUS\$1INVALID\$1CLIENT\$1INFO\$1VERSION |  |  | 
| 0x52000083 | STATUS\$1INVALID\$1CLIENT\$1ID\$1STRING\$1LENGTH |  |  | 
| 0x52000084 | STATUS\$1SETTING\$1KEY\$1FRAME\$1FLAG\$1WHILE\$1USING\$1EOFR |  |  | 
| 0x52000085 | STATUS\$1MAX\$1FRAME\$1TIMESTAMP\$1DELTA\$1BETWEEN\$1TRACKS\$1EXCEEDED |  |  | 
| 0x52000086 | STATUS\$1STREAM\$1SHUTTING\$1DOWN |  |  | 
| 0x52000087 | STATUS\$1CLIENT\$1SHUTTING\$1DOWN |  |  | 
| 0x52000088 | STATUS\$1PUTMEDIA\$1LAST\$1PERSIST\$1ACK\$1NOT\$1RECEIVED |  |  | 
| 0x52000089 | STATUS\$1NON\$1ALIGNED\$1HEAP\$1WITH\$1IN\$1CONTENT\$1STORE\$1ALLOCATORS |  |  | 
| 0x5200008a | STATUS\$1MULTIPLE\$1CONSECUTIVE\$1EOFR |  |  | 
| 0x5200008b | STATUS\$1DUPLICATE\$1STREAM\$1EVENT\$1TYPE |  |  | 
| 0x5200008c | STATUS\$1STREAM\$1NOT\$1STARTED |  |  | 
| 0x5200008d | STATUS\$1INVALID\$1IMAGE\$1PREFIX\$1LENGTH |  |  | 
| 0x5200008e | STATUS\$1INVALID\$1IMAGE\$1METADATA\$1KEY\$1LENGTH |  |  | 
| 0x5200008f | STATUS\$1INVALID\$1IMAGE\$1METADATA\$1VALUE\$1LENGTH |  |  | 

### Codes d'erreur et d'état renvoyés par la bibliothèque de durées
<a name="producer-sdk-errors-duration"></a>

Le tableau suivant contient les informations d'erreur et d'état renvoyées par les méthodes de la `Duration` bibliothèque.


****  

| Code | Message | 
| --- | --- | 
| 0xFFFFFFFFFFFFFFFF | INVALID\$1DURATION\$1VALUE | 

### Codes d'erreur et d'état renvoyés par la bibliothèque commune
<a name="producer-sdk-errors-common"></a>

Le tableau suivant contient les informations d'erreur et d'état renvoyées par les méthodes de la `Common` bibliothèque.

**Note**  
Ces codes d'informations d'erreur et d'état sont communs à de nombreuses personnes APIs.


****  

| Code | Code sans 0 en début | Message | Description | 
| --- | --- | --- | --- | 
| 0x00000001  | 0x1 | STATUS\$1NULL\$1ARG | La valeur NULL a été transmise pour un argument obligatoire.  | 
| 0x00000002  | 0x2 | STATUS\$1INVALID\$1ARG  | Une valeur non valide a été spécifiée pour un argument.  | 
| 0x00000003  | 0x3 | STATUS\$1INVALID\$1ARG\$1LEN  | Une longueur d'argument non valide a été spécifiée. | 
| 0x00000004  | 0x4 | STATUS\$1NOT\$1ENOUGH\$1MEMORY  | Impossible d'allouer suffisamment de mémoire.  | 
| 0x00000005  | 0x5 | STATUS\$1BUFFER\$1TOO\$1SMALL  | La taille de tampon spécifiée est trop petite.  | 
| 0x00000006  | 0x6 | STATUS\$1UNEXPECTED\$1EOF  | Une fin de fichier inattendue a été atteinte.  | 
| 0x00000007  | 0x7 | STATUS\$1FORMAT\$1ERROR  | Un format non valide a été rencontré.  | 
| 0x00000008  | 0 x 8 | STATUS\$1INVALID\$1HANDLE\$1ERROR  | Valeur de handle non valide.  | 
| 0x00000009  | 0x9 | STATUS\$1OPEN\$1FILE\$1FAILED  | Échec d'ouverture d'un fichier.  | 
| 0x0000000a  | 0xa | STATUS\$1READ\$1FILE\$1FAILED | Impossible de lire à partir d'un fichier.  | 
| 0x0000000b  | 0xb | STATUS\$1WRITE\$1TO\$1FILE\$1FAILED  | Impossible d'écrire dans un fichier.  | 
| 0x0000000c  | 0xc | STATUS\$1INTERNAL\$1ERROR  | Erreur interne qui ne se produit normalement pas et qui peut indiquer un bogue au niveau de l'API du service ou du kit SDK.  | 
| 0x0000000d  | 0xd | STATUS\$1INVALID\$1OPERATION  | Une opération non valide a eu lieu ou l'opération n'est pas autorisée.  | 
| 0x0000000e  | 0xe | STATUS\$1NOT\$1IMPLEMENTED  | La fonctionnalité n'est pas mise en œuvre.  | 
| 0x0000000f  | 0xf | STATUS\$1OPERATION\$1TIMED\$1OUT  | L'opération a expiré.  | 
| 0x00000010  | 0 x 10 | STATUS\$1NOT\$1FOUND  | Une ressource requise est introuvable.  | 
| 0x00000011 | 0 x 11 | STATUS\$1CREATE\$1THREAD\$1FAILED  | Impossible de créer un fil de discussion. | 
| 0x00000012 | 0 x 12 | STATUS\$1THREAD\$1NOT\$1ENOUGH\$1RESOURCES  | Des ressources insuffisantes pour créer un autre thread ou une limite du nombre de threads imposée par le système a été rencontrée. | 
| 0x00000013  | 0x13 | STATUS\$1THREAD\$1INVALID\$1ARG  | Attributs de thread spécifiés non valides, ou un autre thread attend déjà de rejoindre ce thread. | 
| 0x00000014  | 0x14 | STATUS\$1THREAD\$1PERMISSIONS  | Aucune autorisation pour définir la politique de planification et les paramètres spécifiés dans les attributs du thread. | 
| 0x00000015  | 0 x 15 | STATUS\$1THREAD\$1DEADLOCKED  | Un blocage a été détecté ou le thread de jonction indique le thread appelant. | 
| 0x00000016  | 0 x 16 | STATUS\$1THREAD\$1DOES\$1NOT\$1EXIST  | Impossible de trouver le thread avec l'ID de thread spécifié. | 
| 0x00000017  | 0x17 | STATUS\$1JOIN\$1THREAD\$1FAILED  | Une erreur inconnue ou générique a été renvoyée lors de l'opération de jointure des threads. | 
| 0x00000018  | 0 x 18 | STATUS\$1WAIT\$1FAILED  | Le temps d'attente maximal pour la variable conditionnelle a été dépassé. | 
| 0x00000019  | 0x19 | STATUS\$1CANCEL\$1THREAD\$1FAILED  | Une erreur inconnue ou générique a été renvoyée par l'opération d'annulation du thread. | 
| 0x0000001a  | 0 x 1 a | STATUS\$1THREAD\$1IS\$1NOT\$1JOINABLE  | L'opération de jointure de thread est demandée sur un thread non joignable. | 
| 0x0000001b  | 0x1b | STATUS\$1DETACH\$1THREAD\$1FAILED   | Une erreur inconnue ou générique a été renvoyée lors de l'opération de détachement du thread. | 
| 0x0000001c  | 0 x 1 c | STATUS\$1THREAD\$1ATTR\$1INIT\$1FAILED  | Impossible d'initialiser l'objet des attributs du thread. | 
| 0x0000001d  | 0x1d | STATUS\$1THREAD\$1ATTR\$1SET\$1STACK\$1SIZE\$1FAILED  | Impossible de définir la taille de pile pour l'objet des attributs de thread. | 
| 0x0000001e  | 0x1e | STATUS\$1MEMORY\$1NOT\$1FREED  | Utilisé uniquement dans les tests. Indique que toute la mémoire demandée n'a pas été libérée. | 
| 0x0000001f | 0x1f | STATUS\$1INVALID\$1THREAD\$1PARAMS\$1VERSION  | Version de structure ThreadParams « » non valide. Spécifiez la version actuelle correcte de la structure. | 

### Codes d'erreur et d'état renvoyés par la bibliothèque heap
<a name="producer-sdk-errors-heap"></a>

Le tableau suivant contient les informations d'erreur et d'état renvoyées par les méthodes de la `Heap` bibliothèque.


****  

| Code | Message | Description | 
| --- | --- | --- | 
| 0x10000001  | STATUS\$1HEAP\$1FLAGS\$1ERROR  | Une combinaison non valide d'indicateurs a été spécifiée.  | 
| 0x10000002  | STATUS\$1HEAP\$1NOT\$1INITIALIZED  | Une opération a été tentée avant l'initialisation du segment de mémoire.  | 
| 0x10000003  | STATUS\$1HEAP\$1CORRUPTED  | Le segment de mémoire a été corrompu ou la bande de garde (en mode de débogage) a été remplacée. Un dépassement de mémoire tampon dans le code client peut conduire à la corruption d'un segment de mémoire.  | 
| 0x10000004  | STATUS\$1HEAP\$1VRAM\$1LIB\$1MISSING  | L'utilisateur VRAM (RAM vidéo) ou la bibliothèque en mode noyau ne peuvent pas être chargés ou sont absents. Vérifiez si la plateforme sous-jacente prend en charge les allocations de VRAM.  | 
| 0x10000005  | STATUS\$1HEAP\$1VRAM\$1LIB\$1REOPEN  | Impossible d'ouvrir la bibliothèque VRAM.  | 
| 0x10000006  | STATUS\$1HEAP\$1VRAM\$1INIT\$1FUNC\$1SYMBOL  | Impossible de charger l'exportation de la fonction INIT.  | 
| 0x10000007  | STATUS\$1HEAP\$1VRAM\$1ALLOC\$1FUNC\$1SYMBOL  | Impossible de charger l'exportation de la fonction ALLOC.  | 
| 0x10000008  | STATUS\$1HEAP\$1VRAM\$1FREE\$1FUNC\$1SYMBOL  | Impossible de charger l'exportation de la fonction FREE.  | 
| 0x10000009  | STATUS\$1HEAP\$1VRAM\$1LOCK\$1FUNC\$1SYMBOL  | Impossible de charger l'exportation de la fonction LOCK.  | 
| 0x1000000a  | STATUS\$1HEAP\$1VRAM\$1UNLOCK\$1FUNC\$1SYMBOL  | Impossible de charger l'exportation de la fonction UNLOCK.  | 
| 0x1000000b  | STATUS\$1HEAP\$1VRAM\$1UNINIT\$1FUNC\$1SYMBOL  | Impossible de charger l'exportation de la fonction UNINIT.  | 
| 0x1000000c  | STATUS\$1HEAP\$1VRAM\$1GETMAX\$1FUNC\$1SYMBOL  | Impossible de charger l'exportation de la fonction GETMAX.  | 
| 0x1000000d  | STATUS\$1HEAP\$1DIRECT\$1MEM\$1INIT  | Impossible d'initialiser le pool de segments de mémoire principal dans le segment de mémoire hybride.  | 
| 0x1000000e  | STATUS\$1HEAP\$1VRAM\$1INIT\$1FAILED  | Échec de l'initialisation dynamique de VRAM.  | 
| 0x1000000f  | STATUS\$1HEAP\$1LIBRARY\$1FREE\$1FAILED  | Impossible de désallouer et de libérer la bibliothèque VRAM.  | 
| 0x10000010  | STATUS\$1HEAP\$1VRAM\$1ALLOC\$1FAILED  | Échec de l'allocation de VRAM.  | 
| 0x10000011  | STATUS\$1HEAP\$1VRAM\$1FREE\$1FAILED  | Échec de la libération de VRAM.  | 
| 0x10000012  | STATUS\$1HEAP\$1VRAM\$1MAP\$1FAILED  | Échec du mappage de VRAM.  | 
| 0x10000013  | STATUS\$1HEAP\$1VRAM\$1UNMAP\$1FAILED  | Échec de l'annulation du mappage de VRAM.  | 
| 0x10000014  | STATUS\$1HEAP\$1VRAM\$1UNINIT\$1FAILED  | Échec de la désinitialisation de VRAM.  | 
| 0x10000015 | STATUS\$1INVALID\$1ALLOCATION\$1SIZE |  | 
| 0x10000016 | STATUS\$1HEAP\$1REALLOC\$1ERROR |  | 
| 0x10000017 | STATUS\$1HEAP\$1FILE\$1HEAP\$1FILE\$1CORRUPT |  | 

### Codes d'erreur et d'état renvoyés par la MKVGen bibliothèque
<a name="producer-sdk-errors-mkvgen"></a>

Le tableau suivant contient les informations d'erreur et d'état renvoyées par les méthodes de la `MKVGen` bibliothèque.


****  

| Code | Message | Description/Action recommandée | 
| --- | --- | --- | 
| 0x32000001  | STATUS\$1MKV\$1INVALID\$1FRAME\$1DATA  | Membres non valides de la structure de données Frame. Assurez-vous que la durée, la taille et les données de trame sont valides et respectent les limites spécifiées dans[Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x32000002  | STATUS\$1MKV\$1INVALID\$1FRAME\$1TIMESTAMP  | Horodatage d'image non valide. Les valeurs calculées de PTS (horodatage de présentation) et DTS (horodatage de décodage) sont supérieures ou égales à l'horodatage de l'image de début du fragment. Ceci indique un redémarrage potentiel de pipeline média ou un problème de stabilité d'encodeur. Pour plus d'informations sur le dépannage, consultez [Erreur : « Failed to submit frame to Kinesis Video client » (Échec d'envoi d'image au client Kinesis Video)](troubleshooting.md#troubleshooting-producer-failed-frame-client) | 
| 0x32000003  | STATUS\$1MKV\$1INVALID\$1CLUSTER\$1DURATION  | Une durée de fragment non valide a été spécifiée. Pour de plus amples informations, veuillez consulter [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x32000004  | STATUS\$1MKV\$1INVALID\$1CONTENT\$1TYPE\$1LENGTH  | Longueur non valide de chaîne de type de contenu. Pour de plus amples informations, veuillez consulter [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x32000005  | STATUS\$1MKV\$1NUMBER\$1TOO\$1BIG  | Une tentative a eu lieu d'encoder un nombre trop grand pour être représenté dans le format EBML (Extensible Binary Meta Language). Cela ne doit pas être exposé aux clients du kit SDK. | 
| 0x32000006  | STATUS\$1MKV\$1INVALID\$1CODEC\$1ID\$1LENGTH  | Longueur non valide de chaîne d'ID de codec. Pour de plus amples informations, veuillez consulter [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x32000007  | STATUS\$1MKV\$1INVALID\$1TRACK\$1NAME\$1LENGTH  | Longueur non valide de chaîne de nom de piste. Pour de plus amples informations, veuillez consulter [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x32000008  | STATUS\$1MKV\$1INVALID\$1CODEC\$1PRIVATE\$1LENGTH  | Longueur non valide des données privées codec. Pour de plus amples informations, veuillez consulter [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x32000009  | STATUS\$1MKV\$1CODEC\$1PRIVATE\$1NULL  | Les données privées du codec (CPD) sont NULL, alors que la taille du CPD est supérieure à zéro.  | 
| 0x3200000a  | STATUS\$1MKV\$1INVALID\$1TIMECODE\$1SCALE  | Valeur d'échelle de code horaire non valide. Pour de plus amples informations, veuillez consulter [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x3200000b  | STATUS\$1MKV\$1MAX\$1FRAME\$1TIMECODE  | Le code horaire d'image est supérieur au maximum. Pour de plus amples informations, veuillez consulter [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x3200000c  | STATUS\$1MKV\$1LARGE\$1FRAME\$1TIMECODE  | Le code horaire d'image maximal a été atteint. Le format MKV utilise 16 bits signés pour représenter le code horaire relatif de l'image au début du cluster. L'erreur est générée si le code temporel de l'image ne peut pas être représenté. Cette erreur indique une mauvaise sélection de l'échelle du code horaire ou une durée de cluster trop longue, de sorte que la représentation du code horaire de l'image sature l'espace des 16 bits signés.  | 
| 0x3200000d  | STATUS\$1MKV\$1INVALID\$1ANNEXB\$1NALU\$1IN\$1FRAME\$1DATA  | Un code de démarrage Annex B non valide a été rencontré. Par exemple, l'indicateur d'adaptation Annex-B a été spécifié et le code rencontre une séquence de démarrage non valide de plus de trois zéros. Un format Annex-B valide doit avoir une séquence de « prévention d'émulation » pour échapper une séquence de trois zéros ou plus dans le flux d'octets. Pour plus d'informations, consultez la norme MPEG. Pour plus d'informations sur cette erreur sur Android, consultez [0x3200000d STATUS\$1MKV\$1INVALID\$1ANNEXB\$1NALU\$1IN\$1FRAME\$1DATA (erreur sur Android)](troubleshooting.md#troubleshooting-producer-android-invalid-annexb). | 
| 0x3200000e  | STATUS\$1MKV\$1INVALID\$1AVCC\$1NALU\$1IN\$1FRAME\$1DATA  | Packaging AVCC NALU non valide lorsque l'indicateur AVCC d'adaptation est spécifié. Vérifiez que le flux d'octets est au format AVCC valide. Pour plus d'informations, consultez la norme MPEG.  | 
| 0x3200000f  | STATUS\$1MKV\$1BOTH\$1ANNEXB\$1AND\$1AVCC\$1SPECIFIED  | L'adaptation de l'AVCC et de l'annexe B a été NALUs spécifiée. N'en spécifiez qu'un ou n'en spécifiez aucun.  | 
| 0x32000010  | STATUS\$1MKV\$1INVALID\$1ANNEXB\$1NALU\$1IN\$1CPD  | Format Annex-B non valide des CPD lorsque l'indicateur Annex-B d'adaptation est spécifié. Vérifiez que le CPD est dans un format d'annexe B valide. Si ce n'est pas le cas, supprimez l'indicateur d'adaptation CPD Annex-B.  | 
| 0x32000011  | STATUS\$1MKV\$1PTS\$1DTS\$1ARE\$1NOT\$1SAME  | Kinesis Video Streams impose que le PTS (horodatage de présentation) et le DTS (horodatage de décodage) soient identiques pour les images de début du fragment. Il s'agit des images clés qui démarrent le fragment.  | 
| 0x32000012  | STATUS\$1MKV\$1INVALID\$1H264\$1H265\$1CPD  | Impossible d'analyser les données privées codec H264/H265.  | 
| 0x32000013  | STATUS\$1MKV\$1INVALID\$1H264\$1H265\$1SPS\$1WIDTH  | Impossible d'extraire la largeur des données privées codec.  | 
| 0x32000014  | STATUS\$1MKV\$1INVALID\$1H264\$1H265\$1SPS\$1HEIGHT  | Impossible d'extraire la hauteur des données privées codec.  | 
| 0x32000015  | STATUS\$1MKV\$1INVALID\$1H264\$1H265\$1SPS\$1NALU  | NALU SPS H264/H265 non valide. | 
| 0x32000016  | STATUS\$1MKV\$1INVALID\$1BIH\$1CPD  | Format non valide d'en-tête d'informations de bitmap dans les données privées codec.  | 
| 0x32000017  | STATUS\$1MKV\$1INVALID\$1HEVC\$1NALU\$1COUNT  | Nombre d'unités NALU (Network Abstraction Layer units) HEVC (High Efficiency Video Coding) non valide.  | 
| 0x32000018  | STATUS\$1MKV\$1INVALID\$1HEVC\$1FORMAT  | Format HEVC non valide. | 
| 0x32000019  | STATUS\$1MKV\$1HEVC\$1SPS\$1NALU\$1MISSING  | HEVC manquant NALUs dans le jeu de paramètres de séquence (SPS). | 
| 0x3200001a  | STATUS\$1MKV\$1INVALID\$1HEVC\$1SPS\$1NALU\$1SIZE   | Taille NALU SPS HEVC non valide. | 
| 0x3200001b  | STATUS\$1MKV\$1INVALID\$1HEVC\$1SPS\$1CHROMA\$1FORMAT\$1IDC   | IDC de format Chroma non valide. | 
| 0x3200001c  | STATUS\$1MKV\$1INVALID\$1HEVC\$1SPS\$1RESERVED   | SPS réservé HEVC non valide. | 
| 0x3200001d  | STATUS\$1MKV\$1MIN\$1ANNEX\$1B\$1CPD\$1SIZE   | Taille minimale de la valeur bêta privée du AnnexBb codec. Pour H264, cette valeur doit être supérieure ou égale à 11. Pour H265, cette valeur doit être supérieure ou égale à 15. | 
| 0x3200001e  | STATUS\$1MKV\$1ANNEXB\$1CPD\$1MISSING\$1NALUS  | Données privées du codec manquantes dans l'annexe B. NALUs | 
| 0x3200001f  | STATUS\$1MKV\$1INVALID\$1ANNEXB\$1CPD\$1NALUS  | Bêta privée du codec non valide dans l'annexe B. NALUs | 
| 0x32000020  | STATUS\$1MKV\$1INVALID\$1TAG\$1NAME\$1LENGTH   | La longueur du nom de balise n'est pas valide. La valeur valide est supérieure à zéro et inférieure à 128. | 
| 0x32000021  | STATUS\$1MKV\$1INVALID\$1TAG\$1VALUE\$1LENGTH   | La longueur de la valeur de balise n'est pas valide. La valeur valide est supérieure à zéro et inférieure à 256. | 
| 0x32000022  | STATUS\$1MKV\$1INVALID\$1GENERATOR\$1STATE\$1TAGS   | Balises d'état de générateur non valides. | 
| 0x32000023  | STATUS\$1MKV\$1INVALID\$1AAC\$1CPD\$1SAMPLING\$1FREQUENCY\$1INDEX   | Index de fréquence d'échantillonnage des données privées codec AAC non valide. | 
| 0x32000024  | STATUS\$1MKV\$1INVALID\$1AAC\$1CPD\$1CHANNEL\$1CONFIG   | Configuration de canal de données privées codec AAC non valide. | 
| 0x32000025  | STATUS\$1MKV\$1INVALID\$1AAC\$1CPD   | Données privées codec AAC non valides | 
| 0x32000026  | STATUS\$1MKV\$1TRACK\$1INFO\$1NOT\$1FOUND   | Informations de piste introuvables. | 
| 0x32000027  | STATUS\$1MKV\$1INVALID\$1SEGMENT\$1UUID   | UUID de segment non valide. | 
| 0x32000028  | STATUS\$1MKV\$1INVALID\$1TRACK\$1UID   | UID de piste non valide. | 
| 0x32000029 | STATUS\$1MKV\$1INVALID\$1CLIENT\$1ID\$1LENGTH |  | 
| 0x3200002a | STATUS\$1MKV\$1INVALID\$1AMS\$1ACM\$1CPD |  | 
| 0x3200002b | STATUS\$1MKV\$1MISSING\$1SPS\$1FROM\$1H264\$1CPD |  | 
| 0x3200002c | STATUS\$1MKV\$1MISSING\$1PPS\$1FROM\$1H264\$1CPD |  | 
| 0x3200002d | STATUS\$1MKV\$1INVALID\$1PARENT\$1TYPE |  | 

### Codes d'erreur et d'état renvoyés par la bibliothèque Trace
<a name="producer-sdk-errors-trace"></a>

Le tableau suivant contient les informations d'erreur et d'état renvoyées par les méthodes de la `Trace` bibliothèque.


****  

| Code | Message | 
| --- | --- | 
| 0x10100001 | STATUS\$1MIN\$1PROFILER\$1BUFFER  | 

### Codes d'erreur et d'état renvoyés par la bibliothèque Utils
<a name="producer-sdk-errors-utils"></a>

Le tableau suivant contient les informations d'erreur et d'état renvoyées par les méthodes de la `Utils` bibliothèque.


****  

| Code | Message | 
| --- | --- | 
| 0x40000001 | STATUS\$1INVALID\$1BASE64\$1ENCODE  | 
| 0x40000002 | STATUS\$1INVALID\$1BASE  | 
| 0x40000003 | STATUS\$1INVALID\$1DIGIT  | 
| 0x40000004 | STATUS\$1INT\$1OVERFLOW  | 
| 0x40000005 | STATUS\$1EMPTY\$1STRING  | 
| 0x40000006 | STATUS\$1DIRECTORY\$1OPEN\$1FAILED  | 
| 0x40000007 | STATUS\$1PATH\$1TOO\$1LONG  | 
| 0x40000008 | STATUS\$1UNKNOWN\$1DIR\$1ENTRY\$1TYPE  | 
| 0x40000009 | STATUS\$1REMOVE\$1DIRECTORY\$1FAILED  | 
| 0x4000000a | STATUS\$1REMOVE\$1FILE\$1FAILED  | 
| 0x4000000b | STATUS\$1REMOVE\$1LINK\$1FAILED  | 
| 0x4000000c | STATUS\$1DIRECTORY\$1ACCESS\$1DENIED  | 
| 0x4000000d | STATUS\$1DIRECTORY\$1MISSING\$1PATH  | 
| 0x4000000e | STATUS\$1DIRECTORY\$1ENTRY\$1STAT\$1ERROR  | 
| 0x4000000f | STATUS\$1STRFTIME\$1FALIED | 
| 0x40000010 | STATUS\$1MAX\$1TIMESTAMP\$1FORMAT\$1STR\$1LEN\$1EXCEEDED | 
| 0x40000011 | STATUS\$1UTIL\$1MAX\$1TAG\$1COUNT | 
| 0x40000012 | STATUS\$1UTIL\$1INVALID\$1TAG\$1VERSION | 
| 0x40000013 | STATUS\$1UTIL\$1TAGS\$1COUNT\$1NON\$1ZERO\$1TAGS\$1NULL | 
| 0x40000014 | STATUS\$1UTIL\$1INVALID\$1TAG\$1NAME\$1LEN | 
| 0x40000015 | STATUS\$1UTIL\$1INVALID\$1TAG\$1VALUE\$1LEN | 
| 0x4000002a | STATUS\$1EXPONENTIAL\$1BACKOFF\$1INVALID\$1STATE | 
| 0x4000002b | STATUS\$1EXPONENTIAL\$1BACKOFF\$1RETRIES\$1EXHAUSTED | 
| 0x4000002c | STATUS\$1THREADPOOL\$1MAX\$1COUNT | 
| 0x4000002d | STATUS\$1THREADPOOL\$1INTERNAL\$1ERROR | 
| 0x40100001 | STATUS\$1HASH\$1KEY\$1NOT\$1PRESENT | 
| 0x40100002 | STATUS\$1HASH\$1KEY\$1ALREADY\$1PRESENT | 
| 0x40100003 | STATUS\$1HASH\$1ENTRY\$1ITERATION\$1ABORT | 
| 0x41000001 | STATUS\$1BIT\$1READER\$1OUT\$1OF\$1RANGE | 
| 0x41000002 | STATUS\$1BIT\$1READER\$1INVALID\$1SIZE | 
| 0x41100001 | STATUS\$1TIMER\$1QUEUE\$1STOP\$1SCHEDULING | 
| 0x41100002 | STATUS\$1INVALID\$1TIMER\$1COUNT\$1VALUE | 
| 0x41100003 | STATUS\$1INVALID\$1TIMER\$1PERIOD\$1VALUE | 
| 0x41100004 | STATUS\$1MAX\$1TIMER\$1COUNT\$1REACHED | 
| 0x41100005 | STATUS\$1TIMER\$1QUEUE\$1SHUTDOWN | 
| 0x41200001 | STATUS\$1SEMAPHORE\$1OPERATION\$1AFTER\$1SHUTDOWN | 
| 0x41200002 | STATUS\$1SEMAPHORE\$1ACQUIRE\$1WHEN\$1LOCKED | 
| 0x41300001 | STATUS\$1FILE\$1LOGGER\$1INDEX\$1FILE\$1INVALID\$1SIZE | 

### Codes d'erreur et d'état renvoyés par la bibliothèque View
<a name="producer-sdk-errors-view"></a>

Le tableau suivant contient les informations d'erreur et d'état renvoyées par les méthodes de la `View` bibliothèque.


****  

| Code | Message | Description | 
| --- | --- | --- | 
| 0x30000001  | STATUS\$1MIN\$1CONTENT\$1VIEW\$1ITEMS  | Un nombre non valide d'éléments d'affichage de contenu a été spécifié. Pour de plus amples informations, veuillez consulter [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x30000002  | STATUS\$1INVALID\$1CONTENT\$1VIEW\$1DURATION  | Une durée non valide d'affichage de contenu a été spécifiée. Pour de plus amples informations, veuillez consulter [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits).  | 
| 0x30000003  | STATUS\$1CONTENT\$1VIEW\$1NO\$1MORE\$1ITEMS  | Une tentative a été effectuée pour dépasser la position de tête. | 
| 0x30000004  | STATUS\$1CONTENT\$1VIEW\$1INVALID\$1INDEX  | Un index non valide est spécifié. | 
| 0x30000005  | STATUS\$1CONTENT\$1VIEW\$1INVALID\$1TIMESTAMP  | Il y a eu un horodatage non valide ou un chevauchement d'horodatages. L'horodatage du décodage d'image doit être supérieur ou égal à l'horodatage de l'image précédente, plus la durée de l'image précédente :. `DTS(n) >= DTS(n-1) \$1 Duration(n-1)` Cette erreur indique souvent une « instabilité » de l'encodeur. L'encodeur produit un pic d'images encodées et leurs horodatages sont plus petits que les durées intra-image. Ou le flux est configuré pour utiliser les horodatages du kit SDK et les images sont envoyées plus rapidement que les durées des images. Pour aider avec une certaine « instabilité » dans l'encodeur, spécifiez une durée d'image plus petite dans la structure StreamInfo.StreamCaps. Par exemple, si le flux est de 25 images par seconde, la durée de chaque image est de 40 ms. Toutefois, pour gérer la « gigue » de l'encodeur, nous vous recommandons d'utiliser la moitié de cette durée d'image (20 ms). Certains flux requièrent un contrôle de temporisation plus précis pour la détection des erreurs.  | 
| 0x30000006  | STATUS\$1INVALID\$1CONTENT\$1VIEW\$1LENGTH  | Une longueur non valide des données d'éléments d'affichage de contenu a été spécifiée.  | 

## Erreurs et codes d'état renvoyés par les PutFrame rappels - bibliothèque C Producer
<a name="producer-sdk-errors-putframe-c"></a>

La section suivante contient les informations d'erreur et d'état renvoyées par les rappels pour l'`PutFrame`opération dans la bibliothèque du producteur C.


****  

| Code | Message | Description | Action recommandée | 
| --- | --- | --- | --- | 
| 0x15000001 | STATUS\$1STOP\$1CALLBACK\$1CHAIN | La chaîne de rappel a été arrêtée. |  | 
| 0x15000002 | STATUS\$1MAX\$1CALLBACK\$1CHAIN | La chaîne de rappel maximum a été atteinte. |  | 
| 0x15000003 | STATUS\$1INVALID\$1PLATFORM\$1CALLBACKS\$1VERSION | La version de la structure PlatformCallbacks est non valide. | Spécifiez la version actuelle correcte de la structure. | 
| 0x15000004 | STATUS\$1INVALID\$1PRODUCER\$1CALLBACKS\$1VERSION | La version de la structure ProducerCallbacks est non valide. | Spécifiez la version actuelle correcte de la structure. | 
| 0x15000005 | STATUS\$1INVALID\$1STREAM\$1CALLBACKS\$1VERSION | La version de la structure StreamCallbacks est non valide. | Spécifiez la version actuelle correcte de la structure. | 
| 0x15000006 | STATUS\$1INVALID\$1AUTH\$1CALLBACKS\$1VERSION | La version de la structure AuthCallbacks est non valide. | Spécifiez la version actuelle correcte de la structure. | 
| 0x15000007 | STATUS\$1INVALID\$1API\$1CALLBACKS\$1VERSION | La version de la structure ApiCallbacks est non valide. | Spécifiez la version actuelle correcte de la structure. | 
| 0x15000008 | STATUS\$1INVALID\$1AWS\$1CREDENTIALS\$1VERSION | La version de la structure AwsCredentials est non valide. | Spécifiez la version actuelle correcte de la structure. | 
| 0x15000009 | STATUS\$1MAX\$1REQUEST\$1HEADER\$1COUNT | Le nombre maximal d'en-têtes de demande a été atteint. |  | 
| 0x1500000a | STATUS\$1MAX\$1REQUEST\$1HEADER\$1NAME\$1LEN | La longueur maximale du nom d'en-tête de demande a été atteint. |  | 
| 0x1500000b | STATUS\$1MAX\$1REQUEST\$1HEADER\$1VALUE\$1LEN | La longueur maximale de la valeur d'en-tête de demande a été atteinte. |  | 
| 0x1500000c | STATUS\$1INVALID\$1API\$1CALL\$1RETURN\$1JSON | Retour JSON non valide pour un appel d'API. |  | 
| 0x1500000d | STATUS\$1CURL\$1INIT\$1FAILED | L'initialisation de Curl a échoué. |  | 
| 0x1500000e | STATUS\$1CURL\$1LIBRARY\$1INIT\$1FAILED | L'initialisation de la bibliothèque Curl a échoué. |  | 
| 0x1500000f | STATUS\$1INVALID\$1DESCRIBE\$1STREAM\$1RETURN\$1JSON | JSON de retour non valide pour DescribeStream. |  | 
| 0x15000010 | STATUS\$1HMAC\$1GENERATION\$1ERROR | Erreur de génération HMAC. |  | 
| 0x15000011 | STATUS\$1IOT\$1FAILED | L'autorisation IoT a échoué. |  | 
| 0x15000012 | STATUS\$1MAX\$1ROLE\$1ALIAS\$1LEN\$1EXCEEDED | La longueur maximale d'alias de rôle a été atteinte. | Spécifiez une longueur d’alias plus courte. | 
| 0x15000013 | STATUS\$1MAX\$1USER\$1AGENT\$1NAME\$1POSTFIX\$1LEN\$1EXCEEDED | La longueur maximale de postfix du nom d’agent a été atteinte. |  | 
| 0x15000014 | STATUS\$1MAX\$1CUSTOM\$1USER\$1AGENT\$1LEN\$1EXCEEDED | La longueur maximale de l'agent utilisateur du client a été atteinte. |  | 
| 0x15000015 | STATUS\$1INVALID\$1USER\$1AGENT\$1LENGTH | Longueur d’agent utilisateur non valide.  |  | 
| 0x15000016 | STATUS\$1INVALID\$1ENDPOINT\$1CACHING\$1PERIOD | Période de mise en cache de point de terminaison non valide. | Spécifiez une période de mise en cache inférieure à 24 heures. | 
| 0x15000017 | STATUS\$1IOT\$1EXPIRATION\$1OCCURS\$1IN\$1PAST | L'horodatage d'expiration de l'IoT se produit dans le passé. |  | 
| 0x15000018 | STATUS\$1IOT\$1EXPIRATION\$1PARSING\$1FAILED | L'analyse de l'expiration de l'IoT a échoué. |  | 
| 0x15000019 | STATUS\$1DUPLICATE\$1PRODUCER\$1CALLBACK\$1FREE\$1FUNC |  |  | 
| 0x1500001a | STATUS\$1DUPLICATE\$1STREAM\$1CALLBACK\$1FREE\$1FUNC |  |  | 
| 0x1500001b | STATUS\$1DUPLICATE\$1AUTH\$1CALLBACK\$1FREE\$1FUNC |  |  | 
| 0x1500001c | STATUS\$1DUPLICATE\$1API\$1CALLBACK\$1FREE\$1FUNC |  |  | 
| 0x1500001d | STATUS\$1FILE\$1LOGGER\$1INDEX\$1FILE\$1TOO\$1LARGE |  |  | 
| 0x1500001e | STATUS\$1MAX\$1IOT\$1THING\$1NAME\$1LENGTH |  |  | 
| 0x1500001f | STATUS\$1IOT\$1CREATE\$1LWS\$1CONTEXT\$1FAILED |  |  | 
| 0x15000020 | STATUS\$1INVALID\$1CA\$1CERT\$1PATH |  |  | 
| 0x15000022 | STATUS\$1FILE\$1CREDENTIAL\$1PROVIDER\$1OPEN\$1FILE\$1FAILED |  |  | 
| 0x15000023 | STATUS\$1FILE\$1CREDENTIAL\$1PROVIDER\$1INVALID\$1FILE\$1LENGTH |  |  | 
| 0x15000024 | STATUS\$1FILE\$1CREDENTIAL\$1PROVIDER\$1INVALID\$1FILE\$1FORMAT |  |  | 
| 0x15000026 | STATUS\$1STREAM\$1BEING\$1SHUTDOWN |  |  | 
| 0x15000027 | STATUS\$1CLIENT\$1BEING\$1SHUTDOWN |  |  | 
| 0x15000028 | STATUS\$1CONTINUOUS\$1RETRY\$1RESET\$1FAILED |  |  | 
| 0x16000001 | STATUS\$1CURL\$1PERFORM\$1FAILED |  CURL a renvoyé un code d'échec.  |  Consultez les journaux pour plus d'informations. Une erreur CURL courante est « Impossible de résoudre le nom d'hôte. », vérifiez la connectivité Internet de l'appareil.  Une autre erreur courante est le code d'erreur 403. Cela indique que les certificats IoT ne sont pas créés ou spécifiés correctement. Vérifiez que les chemins d'accès aux certificats IoT sont correctement définis et que les autorisations sont correctement définies. Pour plus d’informations, consultez [Contrôle de l'accès aux ressources Kinesis Video Streams à l'aide de AWS IoT](how-iot.md).  | 
| 0x16000002 | STATUS\$1IOT\$1INVALID\$1RESPONSE\$1LENGTH |  J'ai reçu une réponse de longueur nulle lors de la récupération des informations d'identification IoT.  |  Consultez le tableau AWS de bord de santé et réessayez ultérieurement.  | 
| 0x16000003 | STATUS\$1IOT\$1NULL\$1AWS\$1CREDS |  Le JSON renvoyé par le point de terminaison des informations d'identification IoT ne contenait pas l'objet des informations d'identification.  |  Consultez l'élément « message » dans le JSON pour plus d'informations.  | 
| 0x16000004 | STATUS\$1IOT\$1INVALID\$1URI\$1LEN |  L'URL transmise à la fonction de récupération des informations d'identification IoT n'a pas une longueur comprise entre 1 et 10 000.  |  Vérifiez l'URL transmise à cette fonction.  | 
| 0x16000005 | STATUS\$1TIMESTAMP\$1STRING\$1UNRECOGNIZED\$1FORMAT |  L'élément « expiration » du JSON provenant de la récupération des informations d'identification IoT n'est pas au format :`YYYY-MM-DDTHH:mm:SSZ`.  |  Consultez le tableau AWS de bord de santé et réessayez ultérieurement.  | 

# Référence concernant les indicateurs d'adaptation NAL (Network Abstraction Layer)
<a name="producer-reference-nal"></a>

Cette section contient des informations sur les indicateurs disponibles pour l'énumération `StreamInfo.NalAdaptationFlags`.

Le [flux élémentaire](https://en.wikipedia.org/wiki/Elementary_stream) dans une application peut être au format **Annex-B** ou **AVCC** : 
+ Le format **Annex-B** délimite [NALUs (unités de couche d'abstraction réseau)](https://en.wikipedia.org/wiki/Network_Abstraction_Layer#NAL_units) par deux octets de zéros, suivis d'un ou trois octets de zéros, suivis du chiffre *1* (appelé **code de démarrage**, par exemple, 00000001). 
+ Le format **AVCC** est également encapsulé NALUs, mais chaque NALU est précédée d'une valeur indiquant la taille du NALU (généralement quatre octets).

De nombreux encodeurs produisent le format de bitstream Annex-B. Certains processeurs de flux binaire de niveau supérieur (tels qu'un moteur de lecture ou le lecteur [Media Source Extensions (MSE) intégré au AWS Management Console)](https://en.wikipedia.org/wiki/Media_Source_Extensions) utilisent le format AVCC pour leurs images.

Les données privées du codec (CPD), qui sont SPS/PPS (Sequence Parameter Set/Picture Parameter Set) pour le codec H.264, peuvent également être au format Annex-B ou AVCC. Cependant, pour les CPD, les formats sont différents de ceux décrits précédemment.

Les indicateurs indiquent au SDK de l'adapter à l'AVCC ou NALUs à l'annex-B pour les données de trame et le CPD comme suit : 


****  

| Indicateur | Adaptation | 
| --- | --- | 
| NAL\$1ADAPTATION\$1FLAG\$1NONE | Aucune adaptation. | 
| NAL\$1ADAPTATION\$1ANNEXB\$1NALS | Adaptez l'annexe B à l'AVCC NALUs . NALUs | 
| NAL\$1ADAPTATION\$1AVCC\$1NALS | Adaptez l'AVCC NALUs à l'annexe B. NALUs | 
| NAL\$1ADAPTATION\$1ANNEXB\$1CPD\$1NALS | Adaptez l'annexe B NALUs pour les données privées du codec au format AVCC. NALUs | 
| NAL\$1ADAPTATION\$1ANNEXB\$1CPD\$1AND\$1FRAME\$1NALS | Adaptez l'annexe B NALUs pour le codec et encadrez les données privées au format AVCC. NALUs | 

Pour plus d'informations sur les types d'unités NALU, consultez **Section 1.3: Network Abstraction Layer Unit Types** dans [RFC 3984](https://www.ietf.org/rfc/rfc3984.txt).

# Structures du SDK pour les producteurs
<a name="producer-reference-structures-producer"></a>

Cette section contient des informations sur les structures que vous pouvez utiliser pour fournir des données à l'objet Kinesis Video Streams Producer.

**Topics**
+ [DeviceInfo/DefaultDeviceInfoProvider](#producer-reference-structures-producer-deviceinfo)
+ [StorageInfo](#producer-reference-structures-producer-storageinfo)

## DeviceInfo/DefaultDeviceInfoProvider
<a name="producer-reference-structures-producer-deviceinfo"></a>

Les **DefaultDeviceInfoProvider**objets **DeviceInfo**et contrôlent le comportement de l'objet Kinesis Video Streams Producer.

### Champs réservés aux membres
<a name="producer-reference-structures-producer-deviceinfo-fields"></a>
+ **version** — Valeur entière utilisée pour s'assurer que la version correcte de la structure est utilisée avec la version actuelle de la base de code. La version actuelle est spécifiée à l'aide de la macro `DEVICE_INFO_CURRENT_VERSION`.
+ **name** — Le nom lisible par l'homme du périphérique.
+ **TagCount/tags** — Non utilisé actuellement.
+ **StreamCount** — Le nombre maximum de flux que l'appareil peut gérer. Il pré-alloue initialement le stockage des pointeurs vers les objets de flux, mais les objets de flux réels sont créés ultérieurement. La valeur par défaut est de 16 flux, mais vous pouvez la modifier dans le fichier `DefaultDeviceInfoProvider.cpp`.
+ **storageInfo** : Un objet décrivant la configuration du stockage principal. Pour de plus amples informations, veuillez consulter [StorageInfo](#producer-reference-structures-producer-storageinfo).

## StorageInfo
<a name="producer-reference-structures-producer-storageinfo"></a>

Spécifie la configuration du stockage principal pour Kinesis Video Streams.

L'implémentation par défaut est basée sur une implémentation de tas rapide à fragmentation faible, optimisée pour le streaming. Elle utilise l'allocateur `MEMALLOC`, qui peut être remplacé sur une plate-forme donnée. Certaines plates-formes ont une allocation de mémoire virtuelle sans renforcement d'allocation par des pages physiques. À mesure que la mémoire est utilisée, les pages virtuelles sont renforcées par les pages physiques. Cela entraîne une sollicitation moindre de la mémoire sur l'ensemble du système lorsque le stockage est sous-utilisé.

Calculez le volume de stockage par défaut selon la formule suivante. Le paramètre `DefragmentationFactor` doit être défini sur 1.2 (20 pour cent).

```
Size = NumberOfStreams * AverageFrameSize * FramesPerSecond * BufferDurationInSeconds * DefragmentationFactor
```

Dans l'exemple suivant, un appareil dispose de flux audio et vidéo. Le flux audio possède 512 échantillons par seconde avec un échantillon moyen de 100 octets. Le flux vidéo possède 25 images par seconde avec une moyenne de 10 000 octets. Chaque flux comporte 3 minutes de durée de mise en tampon.

```
Size = (512 * 100 * (3 * 60) + 25 * 10000 * (3 * 60)) * 1.2 = (9216000 + 45000000) * 1.2 = 65059200 = ~ 66MB.
```

Si le périphérique dispose de plus de mémoire disponible, nous vous recommandons d'ajouter de la mémoire au stockage afin d'éviter une fragmentation importante. 

Vérifiez que la taille de stockage est suffisante pour accueillir les tampons complets pour tous les flux présentant une complexité de codage élevée (lorsque la taille d'image est plus grande en raison de mouvements élevés) ou lorsque la bande passante est faible. Si le producteur atteint une pression de mémoire, il émet des rappels de pression de dépassement de capacité de stockage (). `StorageOverflowPressureFunc` Toutefois, lorsqu'aucune mémoire n'est disponible dans le magasin de contenu, l'image envoyée dans Kinesis Video Streams est supprimée avec une erreur `STATUS_STORE_OUT_OF_MEMORY = 0x5200002e` (). Pour de plus amples informations, veuillez consulter [Codes d'erreur et d'état renvoyés par la bibliothèque cliente](producer-sdk-errors.md#producer-sdk-errors-client). Cela peut également se produire si les accusés de réception de l'application (ACKs) ne sont pas disponibles ou si les confirmations persistantes ACKs sont retardées. Dans ce cas, les tampons atteignent leur capacité de « durée de mémoire tampon » avant que les images précédentes ne commencent à disparaître.

### Champs réservés aux membres
<a name="producer-reference-structures-producer-storageinfo-fields"></a>
+ **version** — Valeur entière utilisée pour s'assurer que la version correcte de la structure est utilisée avec la version actuelle de la base de code.
+ **StorageType** : `DEVICE_STORAGE_TYPE` énumération qui indique le support sous-jacent et l'implémentation du stockage. Actuellement, la seule valeur prise en charge est `DEVICE_STORAGE_TYPE_IN_MEM`. `DEVICE_STORAGE_TYPE_HYBRID_FILE` sera prise en charge dans une prochaine implémentation, ce qui indique que le stockage revient au magasin de contenu basé sur les fichiers.
+ **StorageSize** — Taille de stockage en octets à préallouer. L'allocation minimum est 10 Mo et l'allocation maximum est 10 Go. (Cela évoluera avec la prochaine implémentation du magasin de contenu basé sur les fichiers.)
+ **SpillRatio** — Valeur entière qui représente le pourcentage de stockage à allouer à partir du type de stockage de mémoire directe (RAM), par opposition au stockage secondaire par débordement (stockage de fichiers). Non utilisé actuellement.
+ **rootDirectory** : Le chemin d'accès au répertoire où se situe le magasin de contenu basé sur les fichiers. Non utilisé actuellement.

# Structures de flux vidéo Kinesis
<a name="producer-reference-structures-stream"></a>

Vous pouvez utiliser les structures suivantes pour fournir des données à une instance d'un flux vidéo Kinesis.

**Topics**
+ [StreamDefinition/StreamInfo](#producer-reference-structures-stream-streaminfo)
+ [ClientMetrics](#producer-reference-structures-stream-clientmetrics)
+ [StreamMetrics](#producer-reference-structures-stream-streammetrics)

## StreamDefinition/StreamInfo
<a name="producer-reference-structures-stream-streaminfo"></a>

L'objet `StreamDefinition` dans la couche C\$1\$1 englobe l'objet `StreamInfo` dans le code indépendant de la plateforme et fournit des valeurs par défaut dans le constructeur. 

### Champs réservés aux membres
<a name="producer-reference-structures-stream-streaminfo-fields"></a>


****  

| Champ | Type de données | Description | Valeur par défaut | 
| --- | --- | --- | --- | 
| stream\$1name | string | Nom de flux facultatif. Pour plus d'informations sur la longueur du nom de flux, consultez [Quotas du SDK pour les producteurs](limits.md#producer-sdk-limits). Chaque flux doit avoir un nom unique. | Si aucun nom n'est spécifié, un nom est généré de façon aléatoire. | 
| retention\$1period | duration<uint64\$1t, ratio<3600>> | La période de conservation du flux en secondes. 0 indique l'absence de conservation. | 3600 (Une heure) | 
| tags | const map<string, string>\$1  | Un mappage de paires clé-valeur contenant les informations d'utilisateur. Si le flux possède déjà un ensemble de balises, les nouvelles balises sont ajoutées à l'ensemble existant.  | Pas de balise | 
| kms\$1key\$1id | string | L'ID de AWS KMS clé à utiliser pour chiffrer le flux. Pour de plus amples informations, veuillez consulter [Protection des données dans Kinesis Video Streams](how-kms.md). | Clé KMS par défaut (aws/kinesisvideo.) | 
| streaming\$1type | Énumération STREAMING\$1TYPE | La seule valeur prise en charge est STREAMING\$1TYPE\$1REALTIME. |  | 
| content\$1type | string | Format du contenu du flux. La console Kinesis Video Streams peut lire du contenu dans ce formatvideo/h264. | video/h264 | 
| max\$1latency | duration<uint64\$1t, milli> | Latence maximale en millisecondes pour le flux. Le rappel de sollicitation de latence de flux (si spécifié) est appelé lorsque la durée de mise en tampon dépasse cette durée. 0 indique qu'aucun rappel de sollicitation de latence de flux ne sera appelé.  | milliseconds::zero() | 
| fragment\$1duration | duration<uint64\$1t>  | La durée de fragment souhaitée en secondes. Cette valeur est utilisée en combinaison avec la valeur key\$1frame\$1fragmentation. Si cette valeur est définiefalse, Kinesis Video Streams génère des fragments sur une image clé une fois cette durée écoulée. Par exemple, un flux audio Advanced Audio Coding (AAC) utilise chaque image en tant qu'image clé. La spécification de key\$1frame\$1fragmentation = false entraîne une fragmentation sur une image clé lorsque cette durée arrive à expiration, ce qui se traduit par des fragments de 2 secondes.  | 2 | 
| timecode\$1scale | duration<uint64\$1t, milli>  | L'échelle de code horaire MKV en millisecondes qui spécifie la granularité des codes horaires pour les images au sein du cluster MKV. Le code horaire d'image MKV est toujours relatif par rapport au démarrage du cluster. MKV utilise une valeur 16 bits signée (0-32767) pour représenter le code horaire au sein du cluster (fragment). Vérifiez que le code temporel de l'image peut être représenté avec l'échelle de code temporel donnée. La valeur d'échelle de code horaire par défaut de 1 ms garantit la représentation de la plus grande image en 32767 ms \$1 = 32 secondes. Cela dépasse la durée de fragment maximum spécifiée dans [Quotas du service Amazon Kinesis Video Streams](limits.md) qui est de 10 secondes. | 1 | 
| key\$1frame\$1fragmentation | bool | Indique s'il faut générer des fragments sur une image clé. Si la valeur est true, le kit SDK génère un début de fragment à chaque image clé. Sifalse, Kinesis Video Streams attend fragment\$1duration au moins et produit un nouveau fragment sur l'image clé qui le suit. | true | 
| frame\$1timecodes | bool | Indique s'il faut utiliser codes horaires d'image ou générer des horodatages à l'aide du rappel actuel. De nombreux encodeurs ne génèrent pas d'horodatages avec les images. La spécification false de ce paramètre garantit donc que les images sont horodatées lorsqu'elles sont placées dans Kinesis Video Streams. | true | 
| absolute\$1fragment\$1times | bool | Kinesis Video Streams utilise MKV comme mécanisme d'empaquetage sous-jacent. La spécification MKV est stricte en ce qui concerne l'aspect relatif du code horaire d'image par rapport au début du cluster (fragment). Toutefois, les codes horaires de cluster peuvent être absolus ou relatifs par rapport à l'heure de démarrage du flux. Si les horodatages sont relatifs, l'appel de l'API de service PutMedia utilisera l'horodatage de démarrage de flux facultatif et ajustera les horodatages de cluster. Le service stocke toujours les fragments avec leurs horodatages absolus. | true | 
| fragment\$1acks | bool | S'il faut recevoir un fragment au niveau de l'application ACKs (accusés de réception).  | true, ce qui signifie que le SDK les recevra ACKs et agira en conséquence. | 
| restart\$1on\$1error | bool | Indique s'il faut redémarrer en cas d'erreurs spécifiques. | La valeur true signifie que le kit SDK essaie de redémarrer le streaming en cas d'erreur. | 
| recalculate\$1metrics | bool | Indique s'il faut recalculer les métriques. Chaque appel à extraire les métriques peut recalculer celles qui permettent d'obtenir la dernière valeur « en cours », ce qui peut avoir un léger impact sur le processeur. Il se peut que vous deviez définir cette valeur sur false pour les périphériques à très faible consommation / couverture afin d'économiser les cycles de processeur. Dans le cas contraire, nous vous déconseillons false d'utiliser cette valeur. | true | 
| nal\$1adaptation\$1flags | uint32\$1t  |  Spécifie les indicateurs d'adaptation d'unité Network Abstraction Layer (NAL). Si le flux binaire est codé en H.264, il peut ensuite être traité comme brut ou empaqueté. NALUs Ils sont au format Annex-B ou AVCC. La plupart des producteurs et consommateurs de flux élémentaires (encodeurs de lecture et décodeurs) utilisent le format Annex-B car il présente des avantages, tels que la récupération des erreurs. Les systèmes de niveau supérieur utilisent le format AVCC qui est le format par défaut pour MPEG, HLS, DASH, etc. La lecture de console utilise les extensions MSE (media source extensions) du navigateur pour décoder et lire le flux utilisant le format AVCC. Pour H.264 (et pour M-JPEG et H.265), le kit SDK fournit des capacités d'adaptation. De nombreux flux élémentaires sont au format suivant. Dans cet exemple, `Ab` est le code de démarrage Annex-B (001 ou 0001). <pre>Ab(Sps)Ab(Pps)Ab(I-frame)Ab(P/B-frame) Ab(P/B-frame)…. Ab(Sps)Ab(Pps)Ab(I-frame)Ab(P/B-frame) Ab(P/B-frame)</pre> Dans le cas du H.264, les données privées du codec (CPD) se trouvent dans les paramètres SPS (ensemble de paramètres de séquence) et PPS (ensemble de paramètres d'image) et peuvent être adaptées au format AVCC. L'application peut extraire les CPD de l'image, sauf si le pipeline multimédia les fournit séparément. Il peut le faire en recherchant la première trame IDR (qui doit contenir le SPS et le PPS), en extrayant les deux NALUs (qui le sont`Ab(Sps)Ab(Pps)`) et en la définissant dans le CPD in. `StreamDefinition` Pour de plus amples informations, veuillez consulter [Référence concernant les indicateurs d'adaptation NAL (Network Abstraction Layer)](producer-reference-nal.md).  | La valeur par défaut consiste à adapter le format Annex-B au format AVCC pour les données d'image et les données privées codec.  | 
| frame\$1rate | uint32\$1t  | Débit d'images attendu. Cette valeur est utilisée pour mieux calculer les besoins de mise en mémoire tampon. | 25 | 
| avg\$1bandwidth\$1bps | uint32\$1t  | Bande passante moyenne attendue pour le flux. Cette valeur est utilisée pour mieux calculer les besoins de mise en mémoire tampon. | 4 \$1 1024 \$1 1024  | 
| buffer\$1duration | duration<uint64\$1t>  | Durée de la mémoire tampon de flux en secondes. Le SDK conserve les cadres du magasin de contenu pendant une durée maximale debuffer\$1duration, après quoi les cadres précédents sont supprimés au fur et à mesure que la fenêtre avance. Si le cadre supprimé n'a pas été envoyé au backend, le rappel du cadre supprimé est appelé. Si la durée de mise en tampon actuelle est supérieure à max\$1latency, le rappel de sollicitation de latence de flux est appelé. La mémoire tampon est tronquée au début du fragment suivant lorsque l'accusé de réception de conservation de ce dernier est reçu. Cela indique que le contenu a été conservé durablement dans le cloud, afin de le stockage du contenu sur l'appareil local ne soit plus nécessaire. | 120 | 
| replay\$1duration | duration<uint64\$1t> | Durée, en secondes, nécessaire pour faire reculer le lecteur actuel pour le rejouer en cas d'erreur si le redémarrage est activé. La restauration s'arrête au début du tampon (si le streaming vient de commencer ou si l'accusé de réception de conservation est arrivé). La restauration essaie de se poser sur une image clé qui indique un début de fragment. Si l'erreur « à l'origine du redémarrage » n'indique pas un hôte mort (l'hôte est toujours en vie et contient les données de trame dans ses tampons internes), le rollback s'arrête à la dernière trame ACK reçue. Ensuite, la restauration se poursuit jusqu'à l'image clé suivante, car l'ensemble du fragment est déjà stocké dans la mémoire hôte.  | 40 | 
| connection\$1staleness | duration<uint64\$1t> | Durée, en secondes, après laquelle le rappel de stagnation du flux est appelé si le SDK ne reçoit pas l'ACK de mise en mémoire tampon. Cela indique que les images sont envoyées depuis l'appareil, mais le backend ne les accuse pas de réception. Cet état indique une connexion coupée au niveau du saut intermédiaire ou de l'équilibreur de charge.  | 30 | 
| codec\$1id | string | ID de codec de la piste MKV. | V\$1MPEG4/ISO/AVC | 
| track\$1name | string | Nom de la piste MKV. | kinesis\$1video | 
| codecPrivateData | unsigned char\$1  | La mémoire tampon des données privées codec (CPD). Si le pipeline média contient les informations sur les données de type CPD avant que le flux démarre, elle peut être définie dans StreamDefinition.codecPrivateData. Les bits sont copiés et la mémoire tampon peut être réutilisée ou libérée après l'appel pour créer le flux. Toutefois, si les données ne sont pas disponibles lors de la création du flux, elles peuvent être définies dans l'une des surcharges de la KinesisVideoStream.start(cpd) fonction. | null | 
| codecPrivateDataTaille | uint32\$1t  | La taille de la mémoire tampon des données privées codec. | 0 | 

## ClientMetrics
<a name="producer-reference-structures-stream-clientmetrics"></a>

L'**ClientMetrics**objet est rempli en appelant`getKinesisVideoMetrics`.

### Champs réservés aux membres
<a name="producer-reference-structures-stream-clientmetrics-fields"></a>


****  

| Champ | Type de données | Description | 
| --- | --- | --- | 
| Version | UINT32 | Version de la structure, définie dans la macro CLIENT\$1METRICS\$1CURRENT\$1VERSION. | 
| contentStoreSize  | UINT64 | Taille du magasin de contenu global, en octets. Il s'agit de la valeur spécifiée dans DeviceInfo.StorageInfo.storageSize. | 
| contentStoreAvailableTaille | UINT64 | Taille de stockage actuellement disponible en octets.  | 
| contentStoreAllocatedTaille | UINT64 | Taille actuellement allouée. Le total de la taille allouée et de la taille disponible doit être légèrement inférieur à la taille de stockage globale, en raison des données comptables internes et de l'implémentation du magasin de contenu. | 
| totalContentViewsTaille | UINT64 | Taille de la mémoire allouée pour l'ensemble des affichages de contenu pour tous les flux. Cela n'est pas pris en compte dans la taille de stockage. Cette mémoire est allouée à l'aide de la macro MEMALLOC, qui peut être remplacée pour fournir un allocateur personnalisé. | 
| totalFrameRate | UINT64 | Débit d'images total observé pour tous les flux. | 
| totalTransferRate | UINT64 | Débit de flux total observé, en octets par seconde, pour tous les flux. | 

## StreamMetrics
<a name="producer-reference-structures-stream-streammetrics"></a>

L'**StreamMetrics**objet est rempli en appelant`getKinesisVideoMetrics`.

### Champs réservés aux membres
<a name="producer-reference-structures-stream-clientmetrics-fields"></a>


****  

| Champ | Type de données | Description | 
| --- | --- | --- | 
| Version | UINT32 | Version de la structure, définie dans la macro STREAM\$1METRICS\$1CURRENT\$1VERSION. | 
| currentViewDuration  | UINT64 | Durée des images accumulées. Dans le cas d'un réseau rapide, cette durée est soit nulle, soit la durée de la trame (lorsque la trame est transmise). Si la durée devient plus longue que celle max\$1latency spécifiée dans leStreamDefinition, le rappel de latence du flux est appelé s'il est spécifié. La durée est spécifiée en unités de 100ns, qui constitue l'unité de temps par défaut pour la couche PIC. | 
| overallViewDuration  | UINT64 | Durée d'affichage globale. Si le flux est configuré avec absence ACKs ou persistance, cette valeur augmente au fur et à mesure que les images sont insérées dans le flux vidéo Kinesis et devient égale à celle dubuffer\$1duration. StreamDefinition Lorsque ACKs sont activés et que l'ACK persistant est reçu, la mémoire tampon est réduite à l'image clé suivante. Cela est dû au fait que l'horodatage ACK indique le début de l'ensemble du fragment. La durée est spécifiée en unités de 100-ns qui constitue l'unité de temps par défaut pour la couche PIC. | 
| currentViewSize  | UINT64 | Taille, en octets, de la mémoire tampon actuelle. | 
| overallViewSize  | UINT64 | Taille de l'affichage global, en octets. | 
| currentFrameRate  | UINT64 | Débit d'images observé pour le flux actuel. | 
| currentTransferRate | UINT64 | Débit de transfert observé, en octets par seconde, pour le flux actuel. | 

# Rappels du SDK pour les producteurs
<a name="producer-reference-callbacks"></a>

Les classes et les méthodes du SDK Amazon Kinesis Video Streams Producer ne gèrent pas leurs propres processus. À la place, elles utilisent les appels et les événements entrants de la fonction afin de planifier les rappels pour communiquer avec l'application.

Il existe deux schémas de rappel que l'application peut utiliser pour interagir avec le kit SDK :
+ `CallbackProvider`— Cet objet expose tous les rappels du composant de code indépendant de la plate-forme (PIC) à l'application. Ce schéma permet des fonctionnalités complètes, mais cela signifie également que l'implémentation doit gérer toutes les méthodes d'API publique et les signatures dans la couche C\$1\$1.
+ [StreamCallbackProvider](#producer-reference-callbacks-streamcallbackprovider)et [ClientCallbackProvider](#producer-reference-callbacks-clientcallbackprovider) — Ces objets exposent les rappels spécifiques au flux et au client, et la couche C\$1\$1 du SDK expose le reste des rappels. Il s'agit du schéma de rappel préféré pour interagir avec le kit SDK Producteur.

Le diagramme suivant illustre le modèle d'objet des objets de rappel :

![\[Schéma illustrant l'interaction entre producteurs et consommateurs dans Kinesis Video Streams.\]](http://docs.aws.amazon.com/fr_fr/kinesisvideostreams/latest/dg/images/callbacks-10.png)


Dans le diagramme précédent, `DefaultCallbackProvider` dérive de `CallbackProvider` (qui expose tous les rappels dans le PIC) et contient `StreamCallbackProvider` et `ClientCallbackProvider`.

**Topics**
+ [ClientCallbackProvider](#producer-reference-callbacks-clientcallbackprovider)
+ [StreamCallbackProvider](#producer-reference-callbacks-streamcallbackprovider)
+ [ClientCallbacks structure](#producer-reference-callbacks-clientcallbacks)
+ [Implémentations de callback pour réessayer le streaming](#producer-reference-callbacks-retry)

## ClientCallbackProvider
<a name="producer-reference-callbacks-clientcallbackprovider"></a>

L'objet `ClientCallbackProvider` expose des fonctions de rappel au niveau du client. Les détails des fonctions sont décrites dans la section [ClientCallbacks structure](#producer-reference-callbacks-clientcallbacks).

**Méthodes de rappel :**
+ `getClientReadyCallback`— Signale un état de préparation pour le client.
+ `getStorageOverflowPressureCallback`— Signale un débordement ou une pression de stockage. Ce rappel est appelé lorsque l'utilisation du stockage est inférieure à la valeur `STORAGE_PRESSURE_NOTIFICATION_THRESHOLD`, qui correspond à 5 pour cent du volume de stockage global. Pour de plus amples informations, veuillez consulter [StorageInfo](producer-reference-structures-producer.md#producer-reference-structures-producer-storageinfo).

## StreamCallbackProvider
<a name="producer-reference-callbacks-streamcallbackprovider"></a>

L'objet `StreamCallbackProvider` expose des fonctions de rappel au niveau du flux.

**Méthodes de rappel :**
+ `getDroppedFragmentReportCallback` : Signale un fragment abandonné.
+ `getDroppedFrameReportCallback`— Signale la perte d'une image.
+ `getFragmentAckReceivedCallback`— Signale qu'un fragment ACK a été reçu pour le flux.
+ `getStreamClosedCallback`— Signale une condition de fermeture d'un cours d'eau.
+ `getStreamConnectionStaleCallback`— Signale un état de connexion périmé. Dans cette situation, le producteur envoie des données au service mais ne reçoit aucun accusé de réception.
+ `getStreamDataAvailableCallback`— Indique que les données sont disponibles dans le flux.
+ `getStreamErrorReportCallback`— Signale une condition d'erreur de flux.
+ `getStreamLatencyPressureCallback`— Signale une condition de latence du flux, c'est-à-dire lorsque la taille de la mémoire tampon cumulée est supérieure à la `max_latency` valeur. Pour de plus amples informations, veuillez consulter [StreamDefinition/StreamInfo](producer-reference-structures-stream.md#producer-reference-structures-stream-streaminfo).
+ `getStreamReadyCallback`: —Signale une condition de disponibilité pour le flux.
+ `getStreamUnderflowReportCallback`— Signale un état de sous-débit d'un cours d'eau. Cette fonction n'est pas utilisée actuellement et est réservée pour une utilisation future.

Pour le code source de`StreamCallbackProvider`, voir [StreamCallbackProvider.h.](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/d1684599a141785752582c16264e3123866f3cf8/kinesis-video-producer/src/StreamCallbackProvider.h)

## ClientCallbacks structure
<a name="producer-reference-callbacks-clientcallbacks"></a>

La structure `ClientCallbacks` contient les points d'entrée de la fonction de rappel que le PIC appelle en cas d'événements spécifiques. La structure contient également des informations de version dans le champ `CALLBACKS_CURRENT_VERSION` ainsi qu'un champ `customData` pour les données définies par l'utilisateur et renvoyées avec les fonctions de rappel individuelles.

L'application client peut utiliser un pointeur `this` pour le champ `custom_data` afin de mapper les fonctions de membre vers les fonctions `ClientCallback` statiques lors de l'exécution, comme illustré dans l'exemple de code suivant : 

```
STATUS TestStreamCallbackProvider::streamClosedHandler(UINT64 custom_data, STREAM_HANDLE stream_handle, UINT64 stream_upload_handle) {
    LOG_INFO("Reporting stream stopped.");

TestStreamCallbackProvider* streamCallbackProvider = reinterpret_cast<TestStreamCallbackProvider*> (custom_data);
streamCallbackProvider->streamClosedHandler(...);
```


**Événements**  

| Fonction | Description | Type | 
| --- | --- | --- | 
| CreateDeviceFunc | Pas implémenté actuellement sur le backend. Cet appel échoue lorsque appelé à partir de Java ou C\$1\$1. Les autres clients effectuent une initialisation propre à la plateforme. | API de backend | 
| CreateStreamFunc | Appelé lors de la création du flux. | API de backend | 
| DescribeStreamFunc | Appelé lorsque DescribeStream est appelé. | API de backend | 
| GetStreamingEndpointFunc | Appelé lorsque GetStreamingEndpoint est appelé. | API de backend | 
| GetStreamingTokenFunc | Appelé lorsque GetStreamingToken est appelé. | API de backend | 
| PutStreamFunc | Appelé lorsque PutStream est appelé. | API de backend | 
| TagResourceFunc | Appelé lorsque TagResource est appelé. | API de backend | 
|   |   |   | 
| CreateMutexFunc | Crée un mutex de synchronisation. | Synchronisation | 
| FreeMutexFunc | Libère les mutex. | Synchronisation | 
| LockMutexFunc | Verrouille le mutex de synchronisation. | Synchronisation | 
| TryLockMutexFunc | Essaie de verrouiller les mutex. Pas implémenté actuellement. | Synchronisation | 
| UnlockMutexFunc | Déverrouille le mutex. | Synchronisation | 
|   |   |   | 
| ClientReadyFunc | Appelé lorsque le client passe en l'état prêt. | Notification | 
| DroppedFrameReportFunc | Signale lorsqu'une image est abandonnée. | Notification | 
| DroppedFragmentReportFunc | Signale lorsqu'un fragment est abandonné. Cette fonction n'est pas utilisée actuellement et est réservée pour une utilisation future. | Notification | 
| FragmentAckReceivedFunc | Appelé lorsqu'un accusé de réception de fragment (mise en mémoire tampon, réception, conservation et erreur) est reçu. | Notification | 
| StorageOverflowPressureFunc | Appelé lorsque l'utilisation du stockage est inférieure à la valeur STORAGE\$1PRESSURE\$1NOTIFICATION\$1THRESHOLD qui correspond à 5 pour cent du volume de stockage global. | Notification | 
| StreamClosedFunc | Appelé lorsque les derniers bits des images restantes sont diffusés en continu. | Notification | 
| StreamConnectionStaleFunc | Appelé lorsque le flux passe en état de connexion obsolète. Dans cet état, l'application Producteur envoie des données vers le service, mais ne reçoit pas d'accusés de réception. | Notification | 
| StreamDataAvailableFunc | Appelé lorsque les données de flux sont disponibles. | Notification | 
| StreamErrorReportFunc | Appelé en cas d'erreur de flux. Dans cet état, le PIC ferme automatiquement le flux. | Notification | 
| StreamLatencyPressureFunc | Appelé lorsque le flux passe en état de latence qui correspond au moment où la taille de la mémoire tampon accumulée est supérieure à la valeur max\$1latency. Pour de plus amples informations, veuillez consulter [StreamDefinition/StreamInfo](producer-reference-structures-stream.md#producer-reference-structures-stream-streaminfo). | Notification | 
| StreamReadyFunc | Appelé lorsque le flux passe en état prêt. | Notification | 
| StreamUnderflowReportFunc | Cette fonction n'est pas utilisée actuellement et est réservée pour une utilisation future. | Notification | 
|   |   |   | 
| DeviceCertToTokenFunc | Renvoie le certificat de connexion sous la forme d'un jeton. | Intégration de plateforme | 
| GetCurrentTimeFunc | Renvoie l'heure actuelle. | Intégration de plateforme | 
| GetDeviceCertificateFunc | Renvoie le certificat de l'appareil. Cette fonction n'est pas utilisée actuellement et est réservée pour une utilisation future. | Intégration de plateforme | 
| GetDeviceFingerprintFunc | Renvoie l'empreinte de l'appareil. Cette fonction n'est pas utilisée actuellement et est réservée pour une utilisation future. | Intégration de plateforme | 
| GetRandomNumberFunc | Renvoie un nombre aléatoire entre 0 et RAND\$1MAX. | Intégration de plateforme | 
| GetSecurityTokenFunc | Renvoie le jeton de sécurité transmis aux fonctions qui communiquent avec l'API principale. L'implémentation peut spécifier les AccessKeyId, SecretKeyId sérialisés et le jeton de session. | Intégration de plateforme | 
| LogPrintFunc | Consigne une ligne de texte avec la balise et le niveau de journalisation. Pour de plus amples informations, veuillez consulter PlatformUtils.h. | Intégration de plateforme | 

Pour les fonctions d'intégration de plateforme dans le tableau précédent, le dernier paramètre est une structure `ServiceCallContext` qui comporte les champs suivants :
+ `version` : La version de la structure.
+ `callAfter` : Un délai absolu après lequel appeler la fonction.
+ `timeout` : Le délai d'expiration de l'opération en unités de 100 nanosecondes.
+ `customData` : Une valeur définie par l'utilisateur à retransmettre au client.
+ `pAuthInfo` : les informations d'identification pour l'appel. Pour plus d'informations, consultez la structure (`__AuthInfo`) suivante.

Les informations d'autorisation sont fournies à l'aide de la structure `__AuthInfo` sous la forme d'informations d'identification sérialisées ou de jeton d'authentification propre au fournisseur. Cette structure possède les champs suivants :
+ `version` : La version de la structure `__AuthInfo`.
+ `type` : Une valeur `AUTH_INFO_TYPE` définissant le type d'informations d'identification (certificat ou jeton de sécurité).
+ `data` : Une matrice à octets contenant les informations d'authentification.
+ `size` : La taille du paramètre `data`.
+ `expiration` : Le délai d'expiration des informations d'identification en unités de 100 nanosecondes.

## Implémentations de callback pour réessayer le streaming
<a name="producer-reference-callbacks-retry"></a>

Le kit SDK Kinesis Video Producer fournit le statut de diffusion en continu par le biais de fonctions de rappel. Nous vous recommandons de mettre en œuvre les mécanismes de rappel suivants pour remédier à tout problème réseau momentané rencontré pendant le streaming.
+ **Rappel de la pression de latence du flux** : ce mécanisme de rappel est lancé lorsque le SDK rencontre une condition de latence du flux. Cela se produit lorsque la taille de mémoire tampon accumulée est supérieure à la valeur MAX\$1LATENCY. Lorsque le flux est créé, l'application de diffusion en continu définit une valeur par défaut de 60 secondes pour MAX\$1LATENCY. L'implémentation standard pour ce rappel est de réinitialiser la connexion. Vous pouvez utiliser l'exemple d'implémentation à l'adresse [https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/kinesis-video-c-producer/src/source/StreamLatencyStateMachine.c](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c/blob/master/src/source/StreamLatencyStateMachine.c) selon vos besoins. Notez qu'il n'est pas possible de stocker les trames non livrées en raison d'une panne du réseau dans un stockage secondaire à des fins de remblayage. 
+ Rappel **de temporisation des flux** : ce rappel est lancé lorsque le producteur peut envoyer des données au service Amazon Kinesis Data Streams (liaison montante) mais qu'il n'est pas en mesure de récupérer les accusés de réception (ACK mis en mémoire tampon) à temps (la valeur par défaut est de 60 secondes). Selon les paramètres du réseau, le rappel de la pression de latence du flux ou le rappel de l'obsolescence du flux, ou les deux, peuvent être initiés. À l’image de l’implémentation d’un nouveau rappel de sollicitation de latence de flux, l'implémentation standard consiste à réinitialiser la connexion et à en démarrer une nouvelle pour la diffusion en continu. Vous pouvez utiliser l'exemple d'implémentation disponible sur [https://github.com/awslabs/amazon-kinesis-video-streams-producer- c/blob/master/src/source/ConnectionStaleStateMachine .c selon](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c/blob/master/src/source/ConnectionStaleStateMachine.c) vos besoins. 
+ **Rappel d'erreur de flux** : ce rappel est lancé lorsque le SDK rencontre un délai d'expiration sur la connexion réseau ou d'autres erreurs lors de l'appel aux appels du service API KVS. 
+ **Rappel de trame supprimé** : ce rappel est lancé lorsque la taille de stockage est pleine, soit en raison d'une lenteur du réseau, soit d'une erreur de flux. Si la vitesse du réseau entraîne des pertes d'images, vous pouvez augmenter la taille de stockage, réduire la taille des images vidéo ou la fréquence d'images pour qu'elle corresponde à la vitesse du réseau.

# Utilisation des métadonnées de streaming avec Kinesis Video Streams
<a name="how-meta"></a>

Vous pouvez utiliser le SDK Amazon Kinesis Video Streams Producer pour intégrer des métadonnées au niveau du fragment individuel dans un flux vidéo Kinesis. Dans Kinesis Video Streams, les métadonnées sont une paire clé-valeur modifiable. Vous pouvez l'utiliser pour décrire le contenu du fragment, intégrer les mesures de capteur associées qui doivent être transférées avec le fragment lui-même ou répondre à d'autres besoins personnalisés. Les métadonnées sont mises à disposition dans le cadre des opérations d'API [GetMedia](API_dataplane_GetMedia.md) ou [GetMediaForFragmentList](API_reader_GetMediaForFragmentList.md). Il est stocké avec les fragments pendant toute la durée de conservation du stream. Vos applications consommatrices peuvent lire, traiter et réagir en fonction des métadonnées à l'aide du[Regardez le résultat des caméras à l'aide de la bibliothèque d'analyseurs](parser-library.md). 

Il existe deux modes dans lequel les métadonnées peuvent être intégrées à des fragments dans un flux : 
+ **Non persistant** : vous pouvez apposer des métadonnées de manière ponctuelle ou ad hoc sur des fragments d'un flux, en fonction de critères spécifiques à l'entreprise qui se sont produits. Par exemple, une caméra intelligente détecte un mouvement et ajoute des métadonnées aux fragments correspondants contenant le mouvement avant de les envoyer vers son flux vidéo Kinesis. Vous pouvez appliquer les métadonnées au fragment selon le format suivant : `Motion = true`.
+ **Persistant** : vous pouvez apposer des métadonnées sur des fragments consécutifs et successifs d'un flux en fonction d'un besoin continu. Par exemple, une caméra intelligente envoie les coordonnées de latitude et de longitude actuelles associées à tous les fragments qu'elle envoie à son flux vidéo Kinesis. Vous pouvez appliquer les métadonnées à tous les fragments selon le format suivant : `Lat = 47.608013N , Long = -122.335167W`.

Vous pouvez associer simultanément les métadonnées au même fragment dans ces deux modes, en fonction des besoins de votre application. Les métadonnées intégrées peuvent inclure les objets détectés, l'activité suivie, les coordonnées GPS ou d'autres données personnalisées que vous souhaitez associer aux fragments du flux. Les métadonnées sont codées sous forme de paires de chaînes clé-valeur.

## Ajouter des métadonnées à un flux vidéo Kinesis
<a name="how-meta-add"></a>

Les métadonnées que vous ajoutez à un flux vidéo Kinesis sont modélisées sous forme de balises MKV, qui sont implémentées sous forme de paires clé-valeur. 

Les métadonnées peuvent être *transitoires*, pour marquer un événement dans le flux par exemple, ou *persistantes*, pour identifier les fragments dans lesquels un événement donné est en cours par exemple. Un élément de métadonnées persistant est conservé et est appliqué à chaque fragment consécutif jusqu'à son annulation.

**Note**  
Les éléments de métadonnées ajoutés à l'aide de [Transférer vers Kinesis Video Streams](producer-sdk.md) sont distincts du balisage au niveau du flux APIs implémenté avec[TagStream](API_TagStream.md), et[UntagStream](API_UntagStream.md). [ListTagsForStream](API_ListTagsForStream.md)

### API de métadonnées de streaming
<a name="how-meta-api"></a>

Vous pouvez utiliser les opérations suivantes dans le SDK du producteur pour implémenter les métadonnées de streaming.

**Topics**
+ [PIC](#how-meta-api-pic)
+ [SDK pour le producteur de C\$1\$1](#how-meta-api-cpp)
+ [SDK pour le producteur Java](#how-meta-api-java)
+ [Métadonnées persistantes et non persistantes](#how-meta-api-persistence)

#### PIC
<a name="how-meta-api-pic"></a>

```
PUBLIC_API STATUS putKinesisVideoFragmentMetadata(STREAM_HANDLE streamHandle, 
    PCHAR name, 
    PCHAR value, 
    BOOL persistent);
```

#### SDK pour le producteur de C\$1\$1
<a name="how-meta-api-cpp"></a>

```
/**
 * Appends a "tag" or metadata - a key/value string pair into the stream.
 */
bool putFragmentMetadata(const std::string& name, const std::string& value, bool persistent = true);
```

#### SDK pour le producteur Java
<a name="how-meta-api-java"></a>

Vous pouvez utiliser le SDK Java Producer pour ajouter des métadonnées à un utilisateur `MediaSource` : `MediaSourceSink.onCodecPrivateData`

```
void onFragmentMetadata(final @Nonnull String metadataName, final @Nonnull String metadataValue, final boolean persistent)
throws KinesisVideoException;
```

#### Métadonnées persistantes et non persistantes
<a name="how-meta-api-persistence"></a>

Pour les métadonnées non persistantes, vous pouvez ajouter plusieurs éléments de métadonnées portant le même *nom*. Le SDK du producteur collecte les éléments de métadonnées dans la file d'attente de métadonnées jusqu'à ce qu'ils soient ajoutés au fragment suivant. La file d'attente des métadonnées est effacée lorsque les éléments de métadonnées sont appliqués au flux. Pour reproduire les métadonnées, appelez à nouveau `putKinesisVideoFragmentMetadata` ou `putFragmentMetadata`. 

Pour les métadonnées persistantes, le SDK du producteur collecte les éléments de métadonnées dans la file d'attente de métadonnées de la même manière que pour les métadonnées non persistantes. Toutefois, les éléments de métadonnées ne sont pas supprimés de la file d'attente lorsqu'ils sont ajoutés au fragment suivant.

L'appel de `putKinesisVideoFragmentMetadata` ou `putFragmentMetadata` avec `persistent` défini sur `true` a le comportement suivant : 
+ L'appel de l'API place l'élément des métadonnées dans la file d'attente. Les métadonnées sont ajoutées sous la forme d'une balise MVK à chaque fragment tandis que l'élément se trouve dans la file d'attente.
+ L'appel de l'API avec le même *nom* et une autre *valeur* en tant qu'élément de métadonnées précédemment ajouté remplace l'élément.
+ L'appel de l'API avec une *valeur* vide supprime (annule) l'élément de métadonnées de la file d'attente des métadonnées.



# Utilisation IPv6 avec Kinesis Video Streams
<a name="ipv6-support"></a>

Vous pouvez configurer Kinesis Video Streams pour l' IPv6 utiliser à la fois pour les opérations du plan de contrôle et du plan de données. Cela permet à vos applications de communiquer avec les services Kinesis Video Streams à l' IPv6 aide d'adresses via des points de terminaison à double pile.

**Note**  
IPv6 le support nécessite des versions du SDK et des paramètres de configuration spécifiques. Assurez-vous que vos versions IPv6 du SDK AWS et du SDK Kinesis Video Streams prennent en charge les points de terminaison à double pile. Les points de terminaison à double pile prennent en charge à la fois le IPv6 trafic IPv4 et sont disponibles pour certains services dans certaines régions.

Kinesis Video Streams IPv6 prend en charge, via des points de terminaison à double pile, les applications destinées aux producteurs et aux consommateurs. Vous pouvez configurer vos applications IPv6 pour les appels d'API du plan de contrôle et les opérations de streaming du plan de données.

## Configurer le AWS SDK pour IPv6
<a name="configure-aws-sdk-ipv6"></a>

Si vous utilisez le AWS SDK pour appeler le APIs plan de contrôle Kinesis Video Streams dans votre configuration de production, vous pouvez l' IPv6 activer en configurant des points de terminaison à double pile. Le AWS SDK fournit plusieurs méthodes standardisées pour activer les points de terminaison à double pile.

**Important**  
Lorsque les points de terminaison à double pile sont activés, le SDK tente d'utiliser des points de terminaison à double pile pour effectuer des requêtes réseau. S'il n'existe pas de point de terminaison à double pile pour le service ou la région, la demande échoue.

### Utiliser des variables d'environnement
<a name="ipv6-environment-variables"></a>

Définissez la variable d'environnement suivante pour activer les points de terminaison IPv6 à double pile :

```
export AWS_USE_DUALSTACK_ENDPOINT=true
```

### Utiliser le fichier AWS de configuration
<a name="ipv6-config-file"></a>

Ajoutez le paramètre suivant à votre fichier AWS de configuration (`~/.aws/config`) :

```
[default]
use_dualstack_endpoint = true
```

### Utiliser les propriétés du système JVM (Java et Kotlin uniquement SDKs )
<a name="ipv6-jvm-properties"></a>

Pour les applications Java et Kotlin, définissez la propriété système JVM suivante :

```
-Daws.useDualstackEndpoint=true
```

Ou par programmation dans votre code Java :

```
System.setProperty("aws.useDualstackEndpoint", "true");
```

### Prise en charge de SDK
<a name="sdk-support-table"></a>

Les configurations de point de terminaison à double pile prises en AWS SDKs charge sont les suivantes :


| Kit SDK | Pris en charge | Méthodes de configuration | 
| --- | --- | --- | 
| AWS CLI v2 | Oui | Variable d'environnement, fichier de configuration | 
| SDK pour C\$1\$1 | Oui | Variable d'environnement, fichier de configuration | 
| SDK pour Go V2 (1.x) | Oui | Variable d'environnement, fichier de configuration | 
| SDK pour Java 2.x | Oui | Variable d'environnement, fichier de configuration, propriété JVM | 
| Kit SDK pour Java 1.x | Non | Non pris en charge | 
| SDK pour 3.x JavaScript  | Oui | Variable d'environnement, fichier de configuration | 
| Kit SDK for Python (Boto3) | Oui | Variable d'environnement, fichier de configuration | 

Une fois que vous avez configuré des points de terminaison à double pile, le AWS SDK utilise automatiquement les points de IPv6 terminaison lorsque vous appelez le plan de contrôle Kinesis Video Streams. APIs

## Configurer le SDK Kinesis Video Streams Producer pour IPv6
<a name="configure-producer-sdk-ipv6"></a>

Le SDK Kinesis Video Streams Producer IPv6 fournit des options de configuration pour les opérations du plan de contrôle et du plan de données. Ces paramètres fonctionnent avec la configuration du point de terminaison à double pile du AWS SDK.

### Configuration du SDK C/C\$1\$1 Producer
<a name="configure-c-cpp-producer-sdk"></a>

Les points de terminaison par défaut et la chaîne de résolution DNS sont implémentés par le SDK KVS Producer-C version 1.6.0. Il vérifie séquentiellement chaque endroit où vous pouvez définir la configuration de ces paramètres, puis sélectionne le premier que vous définissez. La séquence prédéfinie est la suivante :

Pour plus d'informations sur le Producer SDKs, consultez les rubriques relatives au [SDK Producer pour C](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c), au [SDK Producer pour](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp) C\$1\$1 [et au SDK Producer](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk.html#producer-sdk-related-topics).

#### Configuration du terminal
<a name="endpoint-configuration"></a>

1. Le `controlPlaneUrl` paramètre pour`createAbstractDefaultCallbacksProvider`.

1.  CMake Paramètres de configuration du point de terminaison : (`-DAWS_KVS_USE_LEGACY_ENDPOINT_ONLY=TRUE`,`-DAWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY=TRUE`)

1. Variables d'environnement : (`export AWS_USE_DUALSTACK_ENDPOINT=TRUE`)
   + Si tel `AWS_USE_DUALSTACK_ENDPOINT` est le cas `TRUE` (sans distinction majuscules/majuscules), le point de terminaison à double pile sera utilisé.

1. Dans le cas contraire, l'ancien point de terminaison sera construit et utilisé.

Avec 2, 3 et 4, le point de terminaison sera construit en fonction de la région fournie à`createAbstractDefaultCallbacksProvider`.

#### Filtrage DNS
<a name="dns-filtering"></a>

Le SDK KVS Producer définira le `CURLOPT_IPRESOLVE` paramètre approprié en fonction de la configuration :

1.  CMake Paramètres de résolution DNS : (`-DAWS_KVS_IPV4_ONLY=TRUE`,`-DAWS_KVS_IPV6_ONLY=TRUE`,`-DAWS_KVS_IPV4_AND_IPV6_ONLY=TRUE`)

1. Variables d'environnement (`export AWS_KVS_USE_IPV4=TRUE`,`export AWS_KVS_USE_IPV6=TRUE`)

1. Dans le cas contraire, aucun filtrage n'aura lieu. Les deux adresses, IPv4 ainsi que les adresses IPv6 IP, si elles sont renvoyées par le DNS, peuvent être utilisées.

**Note**  
Si les paramètres du filtre DNS sont définis pour filtrer les adresses IPV6 IP, mais que la configuration du SDK consiste à utiliser l'ancien point de terminaison (renvoie IPV4 uniquement les adresses), la demande échouera.

La version 3.5.0 du SDK C\$1\$1 Producer utilise le SDK Producer-C 1.6.0 pour les appels d'API KVS.

### Configurer le GStreamer plugin
<a name="configure-gstreamer-plugin"></a>

Le GStreamer plugin utilise le SDK C Producer sous-jacent, de sorte que IPv6 la configuration est gérée automatiquement lorsque vous configurez le SDK C IPv6 comme décrit précédemment.

Il n'est pas nécessaire de modifier le code, il suffit de créer le SDK avec les CMake paramètres ou de définir les variables d'environnement appropriées comme décrit dans la section précédente.

### Résolution des extrémités du plan de données
<a name="data-plane-endpoint-resolution"></a>

Pour les opérations sur le plan de données, utilisez l'`GetDataEndpoint`API pour récupérer le point de terminaison du plan de données à double pile approprié. Le service renvoie le point de terminaison correspondant en fonction de l'URL de la demande.

Exemple :
+ Si la demande `GetDataEndpoint` d'API est adressée à l'ancien point de terminaison se terminant par`.amazonaws.com`, Kinesis Video Streams renvoie l'ancien point de terminaison du plan de données se terminant par. `.amazonaws.com`
+ Si la demande `GetDataEndpoint` d'API est envoyée au point de terminaison à double pile se terminant par`.api.aws`, Kinesis Video Streams renvoie le point de terminaison du plan de données à double pile se terminant par. `.api.aws`

## Configurez le AWS CLI pour IPv6
<a name="configure-aws-cli-ipv6"></a>

Si vous utilisez les opérations Kinesis Video Streams (généralement AWS CLI proof-of-concept pour le travail), vous pouvez l' IPv6 activer en configurant des points de terminaison à double pile.

### Utiliser une variable d'environnement
<a name="cli-environment-variable"></a>

```
export AWS_USE_DUALSTACK_ENDPOINT=true
```

### Utiliser le fichier AWS de configuration
<a name="cli-config-file"></a>

Ajoutez ce qui suit à votre fichier AWS CLI de configuration (`~/.aws/config`) :

```
[default]
use_dualstack_endpoint = true
```

## Exemples de configuration
<a name="configuration-examples"></a>

### Exemple de SDK C
<a name="c-sdk-example"></a>

Pour créer le SDK KVS Producer-C en mode IPV6 -only et ignorer la configuration des variables d'environnement, utilisez les commandes suivantes pour créer le SDK :

```
cmake .. -DAWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY=TRUE -DAWS_KVS_IPV6_ONLY=TRUE
make -j
```

**Note**  
Si vous avez déjà créé le SDK, vous devrez effectuer une nouvelle génération. Supprimez les dossiers de compilation, de code source ouvert et de dépendance existants avant d'exécuter les commandes de génération.

## Considérations
<a name="ipv6-considerations"></a>

### Exigences réseau
<a name="network-requirements"></a>
+ Assurez-vous que votre infrastructure réseau prend en charge IPv6 la connectivité
+ Vérifiez que vos groupes de sécurité et votre réseau ACLs autorisent IPv6 le trafic
+ Testez la connectivité aux AWS IPv6 terminaux depuis votre environnement de déploiement
+ Des points de terminaison à double pile sont disponibles pour certains services dans certaines régions. Vérifiez la disponibilité pour vos régions cibles

### Compatibilité avec le SDK
<a name="sdk-compatibility"></a>
+ Assurez-vous que vous utilisez une version du AWS SDK prise en charge
+ Le AWS SDK pour Java 1.x ne prend pas en charge la configuration des points de terminaison à double pile
+ Pour le SDK pour Go 1.x (V1), vous devez activer le chargement depuis le fichier de configuration pour utiliser les paramètres du fichier de configuration partagés

### Tests et validation
<a name="testing-validation"></a>

Avant de déployer des applications Kinesis Video Streams IPv6 compatibles en production :
+ Tester les opérations du plan de contrôle (création de flux, suppression, listage)
+ Vérifier le fonctionnement du plan de données (ingestion et consommation de vidéos)
+ Validez les performances et la connectivité dans votre environnement réseau
+ Exécutez des tests Canary pour garantir des IPv6 fonctionnalités cohérentes
+ Testez le comportement du basculement lorsque les points de terminaison à double pile ne sont pas disponibles

## Les clients concernés par la mise à niveau incluent IPv6
<a name="customers-impacted-ipv6"></a>

Lorsque vous activez IPv6 Kinesis Video Streams, vous devrez peut-être mettre à jour vos configurations et politiques existantes dans plusieurs domaines afin de garantir le fonctionnement continu.

### Politiques IAM et filtrage des adresses IP
<a name="iam-policies-ip-filtering"></a>

Si vous utilisez le filtrage des adresses IP source dans vos politiques utilisateur IAM, vos politiques de rôle ou vos politiques basées sur les ressources, vous devez mettre à jour ces politiques pour inclure IPv6 les plages d'adresses.

**Important**  
Les politiques IAM existantes qui utilisent des blocs `IpAddress` ou des `NotIpAddress` conditions IPv4 CIDR ne fonctionneront pas automatiquement avec IPv6 les adresses. Vous devez ajouter des IPv6 plages de manière explicite pour maintenir le contrôle d'accès.

Exemple de mise à jour de la politique IAM pour IPv6 :

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "kinesisvideo:*",
      "Resource": "*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "192.0.2.0/24",
            "203.0.113.0/24",
            "2001:db8::/32"
          ]
        }
      }
    }
  ]
}
```

### Journalisation et surveillance
<a name="logging-monitoring-ipv6"></a>

IPv6 les adresses ont un format différent de celui IPv4 des adresses, ce qui peut avoir un impact sur vos systèmes de journalisation, de surveillance et d'analyse.

#### journaux
<a name="cloudtrail-logs"></a>

 les journaux contiendront IPv6 les adresses dans le `sourceIPAddress` champ lorsque les demandes seront effectuées IPv6. Mettez à jour vos outils et scripts d'analyse des journaux pour gérer les formats d' IPv6 adresses.

Exemple IPv6 d'adresse dans les journaux :

```
{
  "sourceIPAddress": "2001:db8::1",
  "eventName": "CreateStream",
  "eventSource": "kinesisvideo.amazonaws.com"
}
```

## Résolution des problèmes
<a name="troubleshooting-ipv6"></a>

### Problèmes courants
<a name="common-issues"></a>
+ Défaillances de connexion — Vérifiez la connectivité IPv6 réseau et la résolution DNS
+ Erreurs du SDK : assurez-vous que vous utilisez des versions du SDK compatibles qui prennent en charge les points de terminaison à double pile
+ Problèmes d'authentification — Vérifiez que les politiques et les informations d'identification IAM fonctionnent avec IPv6 les points de terminaison
+ Point de terminaison non disponible : si aucun point de terminaison à double pile n'existe pour le service ou la région, les demandes échouent

### Étapes de vérification
<a name="verification-steps"></a>
+ Vérifiez que `AWS_USE_DUALSTACK_ENDPOINT=true` c'est défini ou qu'`use_dualstack_endpoint = true`il se trouve dans votre fichier de configuration
+ Vérifiez que les indicateurs de configuration du IPv6 SDK Kinesis Video Streams sont correctement définis
+ Testez la connectivité réseau aux AWS IPv6 terminaux
+ Consultez les journaux des applications pour détecter les IPv6 messages d'erreur spécifiques
+ Vérifiez que votre région prend en charge les points de terminaison à double pile pour Kinesis Video Streams

### Validation de configuration
<a name="configuration-validation"></a>

Vous pouvez vérifier la configuration de votre point de terminaison à double pile en vérifiant :
+ Variables d'environnement : `echo $AWS_USE_DUALSTACK_ENDPOINT`
+ AWS fichier de configuration : `cat ~/.aws/config | grep use_dualstack_endpoint`
+ Propriétés de la JVM (Java) : vérifiez les propriétés du système dans les journaux de vos applications