Paso 2: escribir y examinar 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: escribir y examinar 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 dispositivo 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 siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguientes siguiente

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 (límite 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 del entorno de AWS credenciales.

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

  • Clave de cifrado de AWS KMS 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 usa 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.

Agregar una pista de audio a la transmisión de video 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 deStreamDefinition:

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 uno 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 KinesisVideoStream objeto mientras llamas al método de inicio enKinesisVideoStream.

Inclutar un fotograma en la transmisión de video de Kinesis

Para incluir contenido multimedia en la transmisión de vídeo de KinesisKinesisVideoStream::putFrame, utilice un Frame objeto que contenga 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 temporal de la 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 el modelo de datos de Kinesis Video Streams.

Poner un KinesisVideoFrame en una pista específica de KinesisVideoStream

Puede utilizar la PutFrameHelper clase para incluir datos de fotogramas en una pista específica. Primero, llama al getFrameData búfer para obtener un puntero a uno de los búferes preasignados para completar los KinesisVideoFrame datos. A continuación, puede llamar a putFrameMulti Track para enviar el valor booleano KinesisVideoFrame junto con el valor 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 método putFrameMulti Track utiliza un mecanismo de cola para garantizar que los fragmentos MKV mantengan marcas de tiempo de fotogramas que aumentan de forma monótona y que 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.

PutFrameHelperTiene los siguientes siguientes siguientes campos siguientes:

  • 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 a asignar a un único fotograma de audio.

  • Tamaño a asignar a un solo 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 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 del 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 100 ns unidades entre el encabezado de la vista de contenido (cuando los fotogramas están codificados) y la posición actual (cuando los datos de fotogramas se envían a Kinesis Video Streams).

  • overallViewDuration: La diferencia en 100 ns unidades entre la cabecera de la vista de contenido (cuando se codifican los fotogramas) 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 se codifican los fotogramas) hasta la posición actual (cuando los fotogramas se envían a Kinesis Video Streams).

  • overallViewSize: el tamaño total en bytes de la vista de 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);

Paso siguiente

Paso 3: Ejecutar y verificar el código