

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Escribe y examina el código
<a name="producersdk-c-write"></a>

En esta sección, examinará el código de la aplicación de ejemplo `KvsVideoOnlyStreamingSample.c` en la `samples` carpeta del repositorio [https://github.com/awslabs/amazon-kinesis-video-streams-producer-c](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c). GitHub Descargó este código en el paso anterior. En este ejemplo se muestra cómo utilizar la biblioteca de productores de C para enviar fotogramas de vídeo codificados en H.264 de la `samples/h264SampleFrames` carpeta a la transmisión de vídeo de Kinesis.

Esta aplicación de ejemplo tiene tres secciones:
+ Inicialización y configuración:
  + Inicialización y configuración de la canalización multimedia específica de la plataforma.
  + Inicializar y configurar KinesisVideoClient y KinesisVideoStream para la canalización, establecer las devoluciones de llamadas, integrar la autenticación específica para cada escenario, extraer y enviar los datos privados del códec y poner la transmisión en estado READY.
+ Bucle principal:
  + Obtención del fotograma de la canalización multimedia con las marcas de tiempo y otras marcas.
  + Enviar el marco al. KinesisVideoStream
+ Desglose:
  + Detener (sincronizar) KinesisVideoStream, liberar KinesisVideoStream, liberar KinesisVideoClient.

Esta aplicación de ejemplo lleva a cabo las siguientes tareas:
+ Llama a la API `createDefaultDeviceInfo` para crear el objeto `deviceInfo` que contiene información sobre el dispositivo o la configuración de almacenamiento.

  ```
  // 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;
  ```
+ Llama a la API `createRealtimeVideoStreamInfoProvider` para crear el objeto `StreamInfo`.

  ```
  CHK_STATUS(createRealtimeVideoStreamInfoProvider(streamName, DEFAULT_RETENTION_PERIOD, DEFAULT_BUFFER_DURATION, &pStreamInfo));
  // adjust members of pStreamInfo here if needed
  ```
+ Llama a la `createDefaultCallbacksProviderWithAwsCredentials` API para crear el proveedor de llamadas predeterminado en función de las credenciales estáticas. AWS 

  ```
  CHK_STATUS(createDefaultCallbacksProviderWithAwsCredentials(accessKey,
                                                                  secretKey,
                                                                  sessionToken,
                                                                  MAX_UINT64,
                                                                  region,
                                                                  cacertPath,
                                                                  NULL,
                                                                  NULL,
                                                                  FALSE,
                                                                  &pClientCallbacks));
  ```
+ Llame a la `createKinesisVideoClient` API para crear el `KinesisVideoClient` objeto que contiene información sobre el almacenamiento de su dispositivo y mantiene las llamadas para informar sobre los eventos de Kinesis Video Streams.

  ```
  CHK_STATUS(createKinesisVideoClient(pDeviceInfo, pClientCallbacks, &clientHandle));                
  ```
+ Llama a la API `createKinesisVideoStreamSync` para crear el objeto `KinesisVideoStream`.

  ```
  CHK_STATUS(createKinesisVideoStreamSync(clientHandle, pStreamInfo, &streamHandle));                
  ```
+ Configura un fotograma de ejemplo y llama a la API `PutKinesisVideoFrame` para enviar ese fotograma al objeto `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;
      }
  ```
+ Desglose:

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