

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-cpp-write"></a>

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

El ejemplo de C\+\+ **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) \* 3 (minutos) \* 60 (segundos en un minuto) \* 10000 (kb) \* 1,2 (margen de desfragmentación) = 194,4 Mb \~ 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\_AAC»).
+ Tipo de pista (por ejemplo, utilice el valor de enumeración de MKV\_TRACK\_INFO\_TYPE\_AUDIO 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\+\+ 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\+\+ 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);            
```