Generación automatizada de imágenes en tiempo real - 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.

Generación automatizada de imágenes en tiempo real

Amazon Kinesis Video Streams ofrece la capacidad de transcodificar y entregar imágenes. Kinesis Video Streams extrae automáticamente imágenes de los datos de vídeo en tiempo real y las envía al bucket de Amazon S3 que especifique. La implementación de la extracción de imágenes automatizada y en tiempo real implica los siguientes pasos:

  • Crear un depósito S3 para recibir las imágenes generadas.

  • Configurar la propiedad de ImageGenerationConfigurationtransmisión que indica a Kinesis Video Streams cómo crear las imágenes y dónde enviarlas.

  • Añadir etiquetas de generación de imágenes: Kinesis Video Streams solo genera imágenes a partir de fragmentos que tengan la etiqueta de generación de imágenes. Estas etiquetas se añaden al cargar vídeos mediante el SDK de Kinesis Video Streams Producer junto con putKinesisVideoEventMetadata el método.

Los siguientes procedimientos proporcionan instrucciones para completar cada uno de estos pasos.

Si utiliza una clave gestionada por el cliente, asegúrese de que la función que realiza las PutMedia llamadas (persona que carga) tenga los siguientes permisos necesarios para cifrar y descifrar datos y para acceder al bucket de Amazon S3.

  • kms:Encrypt

  • kms:GenerateDataKey

  • kms:Decrypt

  • s3:PutObject

Para obtener más información, consulte ¿Cómo puedo comenzar a usar el cifrado en el servidor?.

Para configurar el destino de las imágenes generadas
  1. Cree un depósito de destino de S3 al que se enviarán las imágenes.

    Siga la Guía del usuario de Amazon S3 para crear un bucket de Amazon S3.

    Anote el URI del bucket, que necesitará en el siguiente paso al actualizar la configuración de generación de imágenes de la transmisión.

  2. Comprueba que lo tienes AWS CLI instalado y configurado. Para obtener más información, consulte la Guía del AWS Command Line Interface usuario de la versión 2.

  3. Cree un nuevo archivo llamado update-image-generation-input.json con el siguiente contenido como entrada. Actualice los valores de los marcadores de posición con los valores que desee usar. Para conocer los valores máximos y mínimos admitidos, consulta la UpdateImageGenerationConfigurationAPI.

    { "StreamName": "demo-stream", "ImageGenerationConfiguration": { "Status": "ENABLED", "DestinationConfig": { "DestinationRegion": "us-east-1", "Uri": "s3://my-bucket-name" }, "SamplingInterval": 200, "ImageSelectorType": "PRODUCER_TIMESTAMP", "Format": "JPEG", "FormatConfig": { "JPEGQuality": "80" }, "WidthPixels": 320, "HeightPixels": 240 } }
  4. Actualice la configuración de generación de imágenes de la transmisión mediante la UpdateImageGenerationConfiguration API y adjunte el archivo JSON como entrada, como se muestra en el siguiente comando. Tenga en cuenta que la ruta del archivo apunta al archivo del directorio actual.

    aws kinesisvideo update-image-generation-configuration \ --cli-input-json file://./update-image-generation-input.json
  5. En caso de éxito, se devuelve una respuesta vacía y no se imprime nada en el terminal.

    nota

    Tras actualizar la configuración de generación de imágenes, se tarda al menos 1 minuto en iniciar el flujo de trabajo de generación de imágenes. Espera al menos 1 minuto antes de subir el vídeo a tu transmisión.

  6. Verifica los ajustes de configuración. AWS CLI Utilízala para llamar a la DescribeImageGenerationConfiguration API de tu transmisión.

    aws kinesisvideo describe-image-generation-configuration \ --stream-name "demo-stream"

Kinesis Video Streams solo generará y entregará imágenes para los fragmentos que tengan la etiqueta de generación de imágenes. Todos los metadatos de fragmentos adicionales que se proporcionen junto con las etiquetas de generación de imágenes de Amazon S3 se guardarán como metadatos de Amazon S3.

nota

Las etiquetas de generación de imágenes se refieren a etiquetas de metadatos fragmentados y no a etiquetas a nivel de transmisión.

importante

Las etiquetas de generación de imágenes se tienen en cuenta para el límite de etiquetas de fragmentos y metadatos. Para obtener más información, consulte Cuotas del servicio de metadatos de streaming.

A continuación, se muestra un ejemplo del aspecto de la estructura de las etiquetas de metadatos de los fragmentos con la mkvinfo utilidad. La etiqueta de generación de imágenes es una etiqueta MKV simple con una clave igual AWS_KINESISVIDEO_IMAGE_GENERATION y ningún valor. Para obtener más información, consulte el ejemplo de etiquetas de vídeo en la documentación de Matroska.

|+ Tags | + Tag | // MANDATORY: Predefined MKV tag to trigger image generation for the fragment | + Simple | + Name: AWS_KINESISVIDEO_IMAGE_GENERATION | // OPTIONAL: S3 prefix which will be set as prefix for generated image. | + Simple | + Name: AWS_KINESISVIDEO_IMAGE_PREFIX | + String: image_prefix_in_s3 // 256 bytes max | // OPTIONAL: Key value pairs that will be persisted as S3 Image object metadata. | + Simple | + Name: CUSTOM_KEY_1 // Max 128 bytes | + String: CUSTOM_VALUE_1 // Max 256 bytes | + Simple | + Name: CUSTOM_KEY_2 // Max 128 bytes | + String: CUSTOM_VALUE_2 // Max 256 bytes

Añadir etiquetas de generación de imágenes a los fragmentos

Kinesis Video Streams genera y entrega imágenes solo para los fragmentos que tienen la etiqueta de generación de imágenes. Kinesis Video Streams reconoce estas etiquetas MKV especiales e inicia el flujo de trabajo de generación de imágenes en función de la configuración de procesamiento de imágenes de la transmisión.

Cuando utilice el SDK de Kinesis Video Streams Producer para cargar contenido multimedia, utilice putKinesisVideoEventMetadata el método para añadir la etiqueta de generación de imágenes a cada fragmento que desee etiquetar. Cuando putFrame se invoca, un fragmento nuevo comienza con un marco que contiene la keyframe bandera.

Si vas a subir un vídeo pregrabado, es posible que se cargue a una velocidad diferente a la que se grabó, en función de la velocidad de la red. Le recomendamos que utilice la marca de tiempo del productor para configurar la generación de imágenes si desea generar imágenes a intervalos regulares en función de las marcas de tiempo originales del vídeo y no utilice las marcas de tiempo del servidor generadas en función de la velocidad a la que Amazon Kinesis Video Streams recibió el vídeo.

Para ver un ejemplo completo de este código, consulte el ejemplo de código en. VideoOnlyRealtimeStreamingSample GitHub

// 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; Frame eofr = EOFR_FRAME_INITIALIZER; 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)); // 1. End the previous fragment if (frame.flags == FRAME_FLAG_KEY_FRAME && !firstFrame) { putKinesisVideoFrame(streamHandle, &eofr); } // 2. putFrame call CHK_STATUS(putKinesisVideoFrame(streamHandle, &frame)); if (frame.flags == FRAME_FLAG_KEY_FRAME) { // 3. Adding the image generation tag CHK_STATUS(putKinesisVideoEventMetadata(streamHandle, STREAM_EVENT_TYPE_IMAGE_GENERATION, NULL);) // 4. Adding fragment metadata for (n = 1; n <= 5; n++) { SNPRINTF(metadataKey, METADATA_MAX_KEY_LENGTH, "SAMPLE_KEY_%d", n); SNPRINTF(metadataValue, METADATA_MAX_VALUE_LENGTH, "SAMPLE_VALUE_%d", frame.index + n); CHK_STATUS(putKinesisVideoFragmentMetadata(streamHandle, metadataKey, metadataValue, FALSE)); } } defaultThreadSleep(frame.duration); frame.decodingTs += frame.duration; frame.presentationTs = frame.decodingTs; frameIndex++; fileIndex++; fileIndex = fileIndex % NUMBER_OF_FRAME_FILES; firstFrame = TRUE; } // 5. End the final fragment putKinesisVideoFrame(streamHandle, &eofr);

Los elementos del código de ejemplo para configurar los marcos de muestra se explican a continuación:

  1. Cada fragmento debe terminar con un final de fragment (eofr). Esta afirmación dice que cada vez que se reciba un nuevo fotograma clave, que señale el comienzo del siguiente fotograma, hay que poner una eofr antes de añadir el siguiente fotograma a la secuencia.

  2. Coloca el fotograma actual en la secuencia.

  3. Añada la etiqueta de generación de imágenes. Se puede llamar al putKinesisVideoEventMetadata método en cualquier momento después de la putFrame(keyFrame) llamada y antes deputFrame(eofr). Solo se debe llamar como máximo una vez por fragmento. Como cada fragmento tendrá solo un fotograma clave, lo llamamos en este momento por motivos de simplicidad. putKinesisVideoEventMetadataSe comprueba si el código devuelto es correcto (0).

  4. Añada otros metadatos de fragmentos personalizados, que Kinesis Video Streams transformará en metadatos de objetos de Amazon S3.

  5. Finalice el fragmento final en esta sesión de carga.

Uso de las muestras para añadir etiquetas de generación de imágenes

Puede utilizarla kvs_gstreamer_audio_video_sample en el SDK de C++ Producer si desea una opción de línea de comandos para añadir etiquetas de generación de imágenes. Para activar esta función, añada el -e both argumento -e image o, tal y como se muestra en el siguiente ejemplo.

./kvs_gstreamer_audio_video_sample stream-name \ -f video-to-upload.mp4 \ -e both

Para obtener más información sobre este ejemplo de aplicación, consulte el productor de CPP de Amazon Kinesis Video Streams GStreamer , el complemento y el archivo README de JNI en. GitHub

Ruta de objetos de Amazon S3 (imagen)

La ruta del objeto de S3 describe la ubicación en el depósito de S3 configurado donde se entregará la imagen generada. Utiliza el siguiente formato:

ImagePrefix_AccountID_StreamName_ImageTimecode_RandomID.file-extension

Los elementos de la ruta del objeto se definen de la siguiente manera:

  • ImagePrefix- Valor de AWS_KINESISVIDEO_IMAGE_PREFIX si está presente.

  • AccountID- El Cuenta de AWS ID con el que se crea la transmisión.

  • StreamName- Nombre de la secuencia a partir de la cual se genera la imagen.

  • ImageTimecode- Código temporal de época (en milisegundos) del fragmento en el que se genera la imagen.

  • RandomID- GUID aleatorio.

  • file-extension- JPG o PNG según el formato de imagen solicitado.

En este ejemplo, la ruta del objeto de las imágenes generadas tendrá el siguiente aspecto:

111122223333_demo-stream_16907729324_f20f9add-75e7-4399-a30f-fc7aefb1bab7.jpg

Recuperando los metadatos de la imagen

Puede usar la consola S3 o la CLI para recuperar los metadatos de las imágenes generadas.

Kinesis Video Streams establece el número de fragmento, la marca horaria del productor y del servidor y los metadatos del tipo de contenido de la imagen generada, todos ellos formateados como metadatos de objetos de Amazon S3. Si hay etiquetas MKV adicionales, esas etiquetas también se añadirán como metadatos de objetos de Amazon S3. El siguiente ejemplo muestra cómo utilizar el comando de la API head-object de Amazon S3 para recuperar los metadatos del objeto. La respuesta incluye los metadatos creados por Kinesis Video Streams.

aws s3api head-object --bucket my-bucket-name --key 111122223333_demo-stream_1690707290324_f20f9add-7e57-4399-a30f-fc7aefb1bab7.jpg { "AcceptRanges": "bytes", "LastModified": "2023-07-30T08:54:51+00:00", "ContentLength": 22693, "ETag": "\"63e03cb6d57f77e2db984c1d344b1083\"", "ContentType": "image/jpeg", "ServerSideEncryption": "AES256", "Metadata": { "aws_kinesisvideo_producer_timestamp": "1690707290324", "aws_kinesisvideo_server_timestamp": "1690707289209", "aws_kinesisvideo_fragment_number": "91343852333182036507421233921329142742245756394" } }

Para obtener más información sobre los metadatos de los objetos de S3, consultehttps://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html.

Recomendaciones de URI de Amazon S3 para protegerse contra la limitación

Si escribe miles de imágenes en Amazon S3, existe el riesgo de que se produzcan estrangulamientos. Para obtener más información, consulte Límites de solicitudes de venta de prefijos en S3.

Un prefijo de Amazon S3 comienza con un límite PUT de 3500 solicitudes PUT por segundo y aumentará gradualmente con el tiempo para prefijos únicos. Evite usar fechas y horas como prefijos de Amazon S3. Los datos codificados con el tiempo afectarán a los prefijos de uno en uno y también cambiarán con regularidad, lo que invalidará las ampliaciones de prefijos anteriores.

Para permitir un escalado de Amazon S3 más rápido y uniforme, recomendamos añadir un prefijo aleatorio, como un código hexadecimal o un UUID, al URI de destino de Amazon S3. Por ejemplo, los prefijos de código hexadecimal dividirán las solicitudes de forma aleatoria de forma natural entre 16 prefijos diferentes (un prefijo para cada carácter hexadecimal único), lo que permitirá recibir 56 000 solicitudes PUT por segundo después de que Amazon S3 haya escalado automáticamente.