

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.

# 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));
  ```