Paso 2: Escribe y examina el código - Amazon Kinesis Video Streams

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.

Paso 2: Escribe y examina el código

En esta sección del procedimiento de C++ Producer Library, examinará el código en la herramienta de ejecución de pruebas de C++ (tst/ProducerTestFixture.h y 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.

Crear una instancia de KinesisVideoProducer

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

    El requisito de almacenamiento de contenido para esta aplicación es de 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.

Crear una instancia de KinesisVideoStream

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 AWS Management Console.

  • AWS KMS clave de cifrado para la transmisión. Para obtener más información, consulte Uso del cifrado del lado del servidor con Kinesis Video Streams.

  • 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

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

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

El método addTrack requiere los siguientes parámetros:

  • ID de pista (como el de 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

Colocación de un fotograma en la transmisión de vídeo de Kinesis

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

En el ejemplo anterior de productor C++ se 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 sobre el formato del fotograma, consulte Modelo de datos de Kinesis Video Streams.

Poner un KinesisVideoFrame en una pista específica de KinesisVideoStream

Puede usar la PutFrameHelper clase para colocar datos de fotogramas en una pista específica. En primer lugar, llama al getFrameData búfer para que el puntero apunte a uno de los búferes preasignados para rellenar los KinesisVideoFrame datos. A continuación, puede llamar al putFrameMulti Track para enviar el valor KinesisVideoFrame junto con el valor booleano para indicar el tipo de datos del fotograma. Use true si se trata de datos de vídeo o false si el fotograma contiene datos de audio. El método putFrameMulti Track 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 temporal MKV del primer fotograma de un fragmento siempre debe ser mayor que la marca temporal MKV del último fotograma del fragmento anterior.

Tiene los siguientes campos: PutFrameHelper

  • 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.

Métricas y registro de métricas

El SDK de C++ Producer incluye funciones para 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: 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

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

Siguiente paso

Paso 3: Ejecuta y verifica el código