

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.

# Utilice la biblioteca de productores de C\$1\$1
<a name="producer-sdk-cpp"></a>

Puede utilizar la biblioteca de productores de C\$1\$1 proporcionada por Amazon Kinesis Video Streams para escribir código de aplicación para enviar datos multimedia desde un dispositivo a una transmisión de vídeo de Kinesis. 

## Modelo de objetos
<a name="producer-sdk-cpp-objectmodel"></a>

La biblioteca C\$1\$1 proporciona los siguientes objetos para gestionar el envío de datos a una transmisión de vídeo de Kinesis:
+ **KinesisVideoProducer:** contiene información sobre su fuente multimedia y sus AWS credenciales, y mantiene las llamadas para informar sobre los eventos de Kinesis Video Streams.
+ **KinesisVideoStream:** Representa la transmisión de vídeo de Kinesis. Contiene información sobre los parámetros de la transmisión de vídeo, como el nombre, el período de retención de datos y el tipo de contenido multimedia.

## Coloca contenido multimedia en la transmisión
<a name="producer-sdk-cpp-putframe"></a>

Puedes usar los métodos proporcionados por la biblioteca C\$1\$1 (por ejemplo,`PutFrame`) para colocar datos en el `KinesisVideoStream` objeto. A continuación, la biblioteca administra el estado interno de los datos, lo que puede incluir las siguientes tareas: 
+ Realización de la autenticación.
+ Observación de la latencia de red. Si la latencia es demasiado elevada, la biblioteca podría optar por anular fotogramas.
+ Seguimiento del estado del streaming en curso.

## Interfaces de devolución de llamada
<a name="producer-sdk-cpp-callbacks"></a>

Esta capa expone un conjunto de interfaces de devolución de llamada, lo que le permite comunicarse con la capa de la aplicación. Entre estas interfaces de devolución de llamada se incluyen las siguientes:


+ **Interfaz de llamadas de servicio (`CallbackProvider`):** la biblioteca invoca los eventos obtenidos a través de esta interfaz cuando crea una transmisión, obtiene una descripción de la secuencia y elimina una transmisión.
+ **Interfaz preparada para el cliente o con poco espacio de almacenamiento (`ClientCallbackProvider`):** la biblioteca invoca los eventos de esta interfaz cuando el cliente está preparado o cuando detecta que podría quedarse sin espacio de almacenamiento o memoria disponible.
+ **Interfaz de retrollamada para eventos de transmisión (`StreamCallbackProvider`):** la biblioteca invoca eventos de esta interfaz cuando se producen eventos de transmisión, como cuando la transmisión entra en estado preparado, se pierden fotogramas o se producen errores de transmisión.

Kinesis Video Streams proporciona implementaciones predeterminadas para estas interfaces. También puede proporcionar su propia implementación personalizada, por ejemplo, si necesita una lógica de red personalizada o si desea exponer una condición de bajo almacenamiento en la interfaz de usuario.

Para obtener más información sobre las devoluciones de llamadas en las bibliotecas de los productores, consulte. [Retrollamadas del SDK del productor](producer-reference-callbacks.md)

## Procedimiento: utilice el SDK para productores de C\$1\$1
<a name="producer-sdk-cpp-using"></a>

Este procedimiento muestra cómo utilizar el cliente de Kinesis Video Streams y las fuentes multimedia en una aplicación de C\$1\$1 para enviar datos a la transmisión de vídeo de Kinesis.

El procedimiento incluye los pasos siguientes:

**Topics**

# Requisitos previos
<a name="producer-sdk-cpp-prerequisites"></a>

Antes de configurar el SDK para productores de C\$1\$1, asegúrese de cumplir los siguientes requisitos previos: 
+ **Credenciales:** en el código de ejemplo, las credenciales se proporcionan especificando un perfil que se configura en el archivo de perfil de AWS credenciales. Si aún no lo ha hecho, configure en primer lugar su perfil de credenciales. 

  Para obtener más información, consulte [Configurar AWS credenciales y regiones para el desarrollo](https://docs.aws.amazon.com//sdk-for-java/v1/developer-guide/setup-credentials.html).
+ **Integración del almacén de certificados:** la biblioteca de productores de Kinesis Video Streams debe establecer una relación de confianza con el servicio al que llama. Esto se realiza mediante la validación de las autoridades de certificación (CAs) en el almacén de certificados público. En los modelos basados en Linux, este almacén se encuentra en el directorio `/etc/ssl`/. 

  Descargue el certificado de la siguiente ubicación en el almacén de certificados:

  [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem)
+ Instale las siguientes dependencias de compilación para macOS:
  + [Autoconf 2.69](http://www.gnu.org/software/autoconf/autoconf.html) (licencia GPLv3 \$1/Autoconf: GNU GPL versión 3 o posterior) 
  + [CMake 3.7 o 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 desarrollo de Java (JDK) (para la compilación de JNI de Java)
  + [Lib-Pkg](https://github.com/freebsd/pkg/tree/master/libpkg)
+ Instale las siguientes dependencias de compilación para Ubuntu:
  + Git: `sudo apt install git`
  + [CMake](http://kitware.com/cmake): `sudo apt install cmake`
  + G\$1\$1: `sudo apt install g++`
  + pkg-config: `sudo apt install pkg-config`
  + OpenJDK: `sudo apt install openjdk-8-jdk`
**nota**  
Esto solo es necesario si está creando la interfaz nativa de Java (JNI).
  + Establezca la variable de entorno `JAVA_HOME`: `export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/`

# Descargue y configure el código de la biblioteca del productor de C\$1\$1
<a name="producersdk-cpp-download"></a>

Para obtener información sobre cómo descargar y configurar la biblioteca de productores de C\$1\$1, consulte [Amazon Kinesis Video Streams CPP Producer GStreamer , Plugin](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp) y JNI.

Para ver los requisitos previos y obtener más información sobre este ejemplo, consulte. [Utilice la biblioteca de productores de C\$1\$1](producer-sdk-cpp.md)

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

A continuación se muestra una tabla de referencia para los argumentos específicos del SDK CMake de C\$1\$1 Producer. También puedes pasar las [ CMake opciones estándar](https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html) a CMake .

**importante**  
Todas son opcionales.

**Banderas para incluir o excluir determinadas funciones**


| CMake argumento | Tipo | Predeterminado | Explicación | 
| --- | --- | --- | --- | 
| `BUILD_DEPENDENCIES` |  Booleano  |  ON  | Cree dependencias a partir de la fuente. De lo contrario, utilice las dependencias que ya están instaladas en el sistema. Si no se encuentra una de las dependencias requeridas, se devolverá un error. | 
| `BUILD_GSTREAMER_PLUGIN` | Booleano |  OFF  | Crea el kvssink GStreamer complemento. | 
|  `BUILD_JNI`  | Booleano |  OFF  | Crea la interfaz nativa de Java (JNI) para poder llamar a este código desde un entorno de ejecución de Java. | 
|  `ALIGNED_MEMORY_MODEL`  | Booleano |  OFF  | Si las asignaciones de memoria deben alinearse con los límites de 8 bytes. Algunas arquitecturas no permiten el acceso a la memoria de forma no alineada. | 
| `CONSTRAINED_DEVICE` | Booleano |  OFF  | Solo para dispositivos que no son de Windows. Cuando está activada, establece el tamaño de la pila de subprocesos en0.5 MiB. Necesario para las compilaciones de [Alpine Linux](https://wiki.alpinelinux.org/wiki/Main_Page). De lo contrario, se utiliza el sistema operativo predeterminado. | 
|  `BUILD_STATIC`  | Booleano |  OFF  | Cree bibliotecas y ejecutables como [compartidos](https://en.wikipedia.org/wiki/Shared_library) (DESACTIVADOS) o [estáticos](https://en.wikipedia.org/wiki/Static_library) (ACTIVADOS). | 
|  `ADD_MUCLIBC`  | Booleano |  OFF  | Conéctese a [uClibc](https://en.wikipedia.org/wiki/UClibc) en lugar de a la biblioteca C estándar, que es una biblioteca estándar C más pequeña diseñada para sistemas embebidos. | 
|  `OPEN_SRC_INSTALL_PREFIX`  |  Cadena  | .. /de código abierto/local | Ubicación para instalar las dependencias de código abierto, si se está compilando desde el código fuente. | 

**Banderas para la compilación cruzada**

**importante**  
Configúrelas si las arquitecturas de la CPU de la máquina de destino y la del equipo anfitrión son diferentes.


| CMake argumento | Tipo | Predeterminado | Explicación | 
| --- | --- | --- | --- | 
| `BUILD_LOG4CPLUS_HOST` |  Cadena  |  ""  | Cree la log4cplus dependencia para la arquitectura de CPU especificada. Si no se establece, log4cplus detectará automáticamente y utilizará la arquitectura de CPU de la máquina host. | 
| `BUILD_OPENSSL_PLATFORM`  |  Cadena  |  ""  | Cree la OpenSSL dependencia para la arquitectura de CPU especificada. Si no se establece, OpenSSL detectará automáticamente y utilizará la arquitectura de CPU de la máquina host. | 

**Indicadores relacionados con las pruebas**


| CMake argumento | Tipo | Predeterminado | Explicación | 
| --- | --- | --- | --- | 
| `BUILD_TEST` |  Booleano  |  OFF  | Construya las pruebas unitarias y de integración. Para ejecutar todas las pruebas, ejecútelas ./tst/producerTest desde el directorio de compilación. AWS Se necesitan credenciales para ejecutar las pruebas. | 
| `CODE_COVERAGE` | Booleano | OFF | Solo disponible para GNU/Clang compiladores. Habilite la recopilación de cobertura de código con [gcov](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html) y la generación de informes. | 
| `COMPILER_WARNINGS` | Booleano | OFF | Solo disponible para compiladores. GNU/Clang Activa todas las advertencias del compilador. | 
| `ADDRESS_SANITIZER` | Booleano | OFF | Solo disponible para GNU/Clang compiladores. Construye con [AddressSanitizer](https://compiler-rt.llvm.org/). | 
| `MEMORY_SANITIZER` | Booleano | OFF | Solo disponible para GNU/Clang compiladores. Construye con [MemorySanitizer](https://compiler-rt.llvm.org/). | 
| `THREAD_SANITIZER` | Booleano | OFF | Solo disponible para GNU/Clang compiladores. Construye con [ThreadSanitizer](https://compiler-rt.llvm.org/). | 
| `UNDEFINED_BEHAVIOR_SANITIZER` | Booleano | OFF | Solo disponible para GNU/Clang compiladores. Construye con [UndefinedBehaviorSanitizer](https://compiler-rt.llvm.org/). | 

Para usar estos CMake argumentos, páselos como una lista de `-Dkey=value` pares separados por espacios siguiendo el `cmake ..` comando. Por ejemplo:

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

CMake buscará la cadena de herramientas del compilador siguiendo la variable. `$PATH` Antes de ejecutar CMake, defina las variables de `CXX` entorno `CC` y las variables de entorno para configurar de forma explícita la cadena de herramientas que se utilizará en la compilación cruzada.

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

En esta sección[Utilice la biblioteca de productores de C\$1\$1](producer-sdk-cpp.md), se examina el código del arnés de pruebas de C\$1\$1 (`tst/ProducerTestFixture.h`y de otros archivos). Descargó este código en la sección anterior.

El ejemplo de C\$1\$1 **independiente de la plataforma:** muestra el siguiente patrón de código:
+ Cree una instancia de `KinesisVideoProducer` para acceder a Kinesis Video Streams.
+ Cree una instancia de `KinesisVideoStream`. Esto crea una transmisión de vídeo de Kinesis en su Cuenta de AWS archivo si aún no existe una transmisión con el mismo nombre.
+ Llama a `putFrame` en la `KinesisVideoStream` para cada fotograma de datos, a medida que están disponibles, para enviarlos a la transmisión.

En las siguientes secciones se proporciona más información sobre este patrón de codificación.



## Cree una instancia de KinesisVideoProducer
<a name="producersdk-cpp-write-create-producer"></a>

Puede crear el objeto `KinesisVideoProducer` llamando al método `KinesisVideoProducer::createSync`. En el siguiente ejemplo se crea el `KinesisVideoProducer` en el archivo `ProducerTestFixture.h`:

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

El método `createSync` usa los siguientes parámetros:
+ Un objeto `DeviceInfoProvider`, que devuelve un objeto `DeviceInfo` que contiene información sobre el dispositivo o configuración de almacenamiento.
**nota**  
Configure el tamaño del almacén de contenido mediante el parámetro `deviceInfo.storageInfo.storageSize`. Las transmisiones de contenido comparten el almacén de contenido. Para determinar los requisitos en cuanto a tamaño de almacenamiento, multiplique el tamaño medio del fotograma por el número de fotogramas almacenados para obtener la duración máxima de todas las transmisiones. A continuación, multiplique el resultado por 1,2 para tener en cuenta la desfragmentación. Por ejemplo, suponga que su aplicación tiene la siguiente configuración:  
Tres transmisiones
3 minutos de duración máxima
Cada transmisión es de 30 fotogramas por segundo (FPS)
Cada uno de los fotogramas tiene un tamaño de 10 000 KB
Los requisitos de almacenamiento de contenido para esta aplicación son **3 (transmisiones) \$1 3 (minutos) \$1 60 (segundos en un minuto) \$1 10000 (kb) \$1 1,2 (margen de desfragmentación) = 194,4 Mb \$1 200 Mb**.
+ Un objeto `ClientCallbackProvider`, que devuelve indicadores de la función que informan de eventos específicos del cliente.
+ Un objeto `StreamCallbackProvider`, que devuelve indicadores de función que se vuelven a llamar cuando se producen eventos específicos a la transmisión.
+ Un `CredentialProvider` objeto que proporciona acceso a las variables de entorno de AWS credenciales.
+ El Región de AWS («us-west-2"). El punto de enlace de servicio se determina a partir de la región.

## Crea una instancia de KinesisVideoStream
<a name="producersdk-cpp-write-create-stream"></a>

Puede crear el objeto `KinesisVideoStream` llamando al método `KinesisVideoProducer::CreateStream` con un parámetro `StreamDefinition`. El ejemplo crea `KinesisVideoStream` en el archivo `ProducerTestFixture.h` con el tipo de pista como vídeo y con el ID de pista como 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));
```

El objeto `StreamDefinition` tiene los siguientes campos:
+ Nombre de transmisión.
+ Periodo de retención de datos.
+ Etiquetas para la transmisión. Las aplicaciones consumidoras pueden usar estas etiquetas para encontrar la transmisión correcta o para obtener más información sobre la transmisión. Las etiquetas también se pueden ver en la Consola de administración de AWS.
+ AWS KMS clave de cifrado para la transmisión. Para obtener más información, consulte [Protección de datos en Kinesis Video Streams](how-kms.md).
+ Tipo de streaming. El único valor válido actualmente es `STREAMING_TYPE_REALTIME`.
+ Tipo de contenido de medios.
+ Latencia de medios. Este valor no se utiliza actualmente y debe establecerse en 0.
+ Duración de la reproducción de cada fragmento.
+ Escala de código temporal de medios.
+ Si los medios utilizan fragmentación de fotogramas claves.
+ Si los medios utilizan códigos de tiempo.
+ Si los medios utilizan tiempos de fragmentos absolutos.

## Añadir una pista de audio a la transmisión de vídeo de Kinesis
<a name="producersdk-cpp-write-add-audiotrack-to-stream"></a>

Puede añadir detalles de una pista de audio a una definición de flujo de pista de vídeo mediante el siguiente `addTrack` método`StreamDefinition`:

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

El `addTrack` método requiere los siguientes parámetros:
+ ID de pista (igual que para el audio). Debe ser un valor único y distinto de cero.
+ Nombre de pista definido por el usuario (por ejemplo, «audio» para la pista de audio). 
+ ID de códec para esta pista (por ejemplo, para la pista de audio «A\$1AAC»).
+ Tipo de pista (por ejemplo, utilice el valor de enumeración de MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO para el audio). 

Si tiene datos privados del códec para la pista de audio, puede pasarlos cuando llame a la función addTrack. También puedes enviar los datos privados del códec después de crear el objeto mientras llamas al método start. KinesisVideoStream KinesisVideoStream

## Coloque un fotograma en la transmisión de vídeo de Kinesis
<a name="producersdk-cpp-write-putframe"></a>

El contenido multimedia se coloca en la transmisión de vídeo de Kinesis mediante `KinesisVideoStream::putFrame` un `Frame` objeto que contiene el encabezado y los datos multimedia. En el ejemplo se llama a `putFrame` en el archivo `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));
```

**nota**  
El ejemplo anterior del productor de C\$1\$1 envía un búfer de datos de prueba. En una aplicación real, debe obtener el búfer y el tamaño del fotograma a partir de los datos del fotograma de un origen de medios (como una cámara).

El objeto `Frame` tiene los siguientes campos:
+ Índice de fotograma. Este valor debe incrementarse de forma monotónica.
+ Indicadores asociados con el fotograma. Por ejemplo, si el codificador se ha configurado para producir un fotograma clave, a este fotograma se le asignará el indicador `FRAME_FLAG_KEY_FRAME`.
+ Marca de tiempo de decodificación.
+ Marca de tiempo de presentación.
+ Duración del fotograma (en unidades de 100 ns).
+ Tamaño del fotograma en bytes.
+ Datos de fotograma.

Para obtener más información acerca del formato de los fotogramas, consulte [Modelo de datos de Kinesis Video Streams](how-data.md).

## Pon una KinesisVideoFrame en una pista específica de KinesisVideoStream
<a name="producersdk-cpp-write-putframeintospecifictrack"></a>

Puede usar la `PutFrameHelper` clase para colocar datos de fotogramas en una pista específica. En primer lugar, llama `getFrameDataBuffer` a para que el puntero apunte a uno de los búferes preasignados para rellenar los `KinesisVideoFrame` datos. Luego, puede llamar al `putFrameMultiTrack` para enviar el valor `KinesisVideoFrame` junto con el booleano para indicar el tipo de datos del marco. Use true si se trata de datos de vídeo o false si el fotograma contiene datos de audio. El `putFrameMultiTrack` método utiliza un mecanismo de cola para garantizar que los fragmentos MKV mantengan marcas de tiempo de fotogramas que aumentan monótonamente y que los dos fragmentos no se superpongan. Por ejemplo, la marca de tiempo MKV del primer fotograma de un fragmento siempre debe ser mayor que la marca de tiempo MKV del último fotograma del fragmento anterior. 

El valor `PutFrameHelper` tiene los siguientes campos:
+ Número máximo de fotogramas de audio en la cola. 
+ Número máximo de fotogramas de vídeo en la cola.
+ Tamaño que se debe asignar a un único fotograma de audio.
+ Tamaño que se debe asignar a un único fotograma de vídeo.

## Acceda a las métricas y al registro de métricas
<a name="producersdk-cpp-write-metrics"></a>

El SDK para productores de C\$1\$1 incluye funciones para las métricas y el registro de métricas. 

Puede utilizar las operaciones `getKinesisVideoMetrics` y las de la `getKinesisVideoStreamMetrics` API para recuperar información sobre Kinesis Video Streams y sus transmisiones activas.

El siguiente código procede del archivo `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);
```

El objeto `PClientMetrics` rellenado por `getKinesisVideoMetrics` contiene la siguiente información:
+ **contentStoreSize:** El tamaño total en bytes del almacén de contenido (la memoria utilizada para almacenar los datos de streaming).
+ **contentStoreAvailableTamaño:** la memoria disponible en el almacén de contenido, en bytes.
+ **contentStoreAllocatedTamaño:** la memoria asignada en el almacén de contenido.
+ **totalContentViewsTamaño:** memoria total utilizada para la visualización del contenido. La vista de contenido es una serie de índices de información en el almacén de contenido.
+ **totalFrameRate:** el número total de fotogramas por segundo en todas las transmisiones activas.
+ **totalTransferRate:** El total de bits por segundo (bps) que se envían en todas las transmisiones.

El objeto `PStreamMetrics` rellenado por `getKinesisVideoStreamMetrics` contiene la siguiente información:
+ **currentViewDuration:** la diferencia en unidades de 100 ns entre la cabecera de la visualización del contenido (cuando se codifican los fotogramas) y la posición actual (cuando los datos de los fotogramas se envían a Kinesis Video Streams).
+ **overallViewDuration:** La diferencia en unidades de 100 ns entre la parte superior de la visualización de contenido (cuando los fotogramas están codificados) y la cola (cuando los fotogramas se vacían de la memoria, ya sea porque se supera el espacio total asignado para la visualización del contenido o porque se recibe un `PersistedAck` mensaje de Kinesis Video Streams y los fotogramas que se sabe que persisten se vacían).
+ **currentViewSize:** el tamaño en bytes del contenido visualizado desde el encabezado (cuando los fotogramas están codificados) hasta la posición actual (cuando los fotogramas se envían a Kinesis Video Streams).
+ **overallViewSize:** el tamaño total en bytes de la visualización del contenido.
+ **currentFrameRate:** la última velocidad medida de la transmisión, en fotogramas por segundo.
+ **currentTransferRate:** la última velocidad medida de la transmisión, en bytes por segundo.

## Desglose
<a name="producersdk-cpp-write-teardown"></a>

Si desea enviar los bytes restantes de un búfer y esperar a recibir una respuesta `ACK`, puede utilizar `stopSync`:

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

También puede llamar a `stop` para finalizar la transmisión: 

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

Después de detener la secuencia, puede liberarla invocando la siguiente API:

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

# Ejecute y verifique el código
<a name="producersdk-cpp-test"></a>

Para ejecutar y verificar el código del[Utilice la biblioteca de productores de C\$1\$1](producer-sdk-cpp.md), consulte las siguientes instrucciones específicas del sistema operativo:
+ [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)
+ [Sistema operativo Raspberry Pi](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/raspberry-pi.md)

Puedes monitorear el tráfico de tu transmisión viendo las métricas asociadas a tu transmisión en la CloudWatch consola de Amazon, como`PutMedia.IncomingBytes`.

# Usa el SDK para productores de C\$1\$1 como GStreamer complemento
<a name="producer-sdk-cpp-gstreamer"></a>

[GStreamer](https://gstreamer.freedesktop.org/)es un popular marco multimedia utilizado por varias cámaras y fuentes de vídeo para crear canales multimedia personalizados mediante la combinación de complementos modulares. El complemento Kinesis Video GStreamer Streams agiliza la integración de su canal multimedia GStreamer existente con Kinesis Video Streams. 

Para obtener información sobre el uso del SDK para productores de C\$1\$1 como GStreamer complemento, consulte. [Ejemplo: complemento del GStreamer SDK para productores de Kinesis Video Streams: kvssink](examples-gstreamer-plugin.md)

# Utilice el SDK del productor de C\$1\$1 como GStreamer complemento en un contenedor de Docker
<a name="producer-sdk-cpp-gstreamer-docker"></a>

[GStreamer](https://gstreamer.freedesktop.org/)es un popular marco multimedia que utilizan varias cámaras y fuentes de vídeo para crear canales multimedia personalizados mediante la combinación de complementos modulares. El complemento Kinesis Video GStreamer Streams agiliza la integración de su canal multimedia GStreamer existente con Kinesis Video Streams. 

Además, el uso de [Docker]() para crear la GStreamer canalización estandariza el entorno operativo de Kinesis Video Streams, lo que agiliza la creación y la ejecución de la aplicación.

Para obtener información sobre el uso del SDK para productores de C\$1\$1 como GStreamer complemento en un contenedor de Docker, consulte. [Ejecute el GStreamer elemento en un contenedor de Docker](examples-gstreamer-plugin.md#examples-gstreamer-plugin-docker)

# Utilice el registro con el SDK para productores de C\$1\$1
<a name="producer-sdk-cpp-logging"></a>

El registro para las aplicaciones del SDK del productor de C\$1\$1 se configura en el `kvs_log_configuration` archivo de la `kinesis-video-native-build` carpeta.

En el siguiente ejemplo, se muestra la primera línea del archivo de configuración predeterminado, que configura la aplicación para escribir las entradas de registro de nivel `DEBUG` en la Consola de administración de AWS:

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

Puede configurar el nivel de registro en `INFO` para obtener un registro menos detallado.

Para configurar la aplicación para que escriba entradas de registro en un archivo de registro, actualice la primera línea del archivo de la siguiente manera:

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

Así se configura la aplicación para escribir entradas de registro en el archivo `kvs.log` de la carpeta `kinesis-video-native-build/log`.

Para cambiar la ubicación del archivo de registro, actualice la línea siguiente con la ruta nueva:

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

**nota**  
Si se escribe el registro de nivel `DEBUG` en un archivo, este puede consumir el espacio de almacenamiento disponible en el dispositivo rápidamente.