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 las 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 automatizada de imágenes en tiempo real implica los siguientes pasos:
Crear un bucket de S3 para recibir las imágenes generadas.
Configurar la propiedad de ImageGenerationConfiguration transmisión que indica a Kinesis Video Streams cómo crear las imágenes y dónde enviarlas.
Agregar etiquetas de generación de imágenes: Kinesis Video Streams solo genera imágenes con fragmentos que tienen la etiqueta de generación de imágenes. Estas etiquetas se agregan al cargar vídeos con el SDK de Kinesis Video Streams Producer junto con el método.
putKinesisVideoEventMetadata
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 sube el archivo) tenga los siguientes permisos, que son necesarios para cifrar y descifrar los 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
Cree un bucket 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 la URI del bucket, que necesitará en el siguiente paso para actualizar la configuración de generación de imágenes de la transmisión.
-
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.
-
Cree un nuevo archivo llamado
update-image-generation-input.jsoncon el siguiente contenido como entrada. Actualice los valores del marcador de posición con los valores que desee usar. Para conocer los valores máximos y mínimos admitidos, consulta la UpdateImageGenerationConfiguration API.{ "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 } } -
Actualiza la configuración de generación de imágenes de la transmisión mediante la UpdateImageGenerationConfiguration API y adjunta 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 -
Si tiene éxito, se devuelve una respuesta vacía y no se imprime nada en su 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.
-
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 de fragmentos y no a etiquetas de nivel de flujo.
importante
Las etiquetas de generación de imágenes se tienen en cuenta para el límite de etiquetas de metadatos de fragmentos. Para obtener más información, consulte Cuotas del servicio de metadatos de streaming.
A continuación se muestra un ejemplo de cómo se ve 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 de AWS_KINESISVIDEO_IMAGE_GENERATION y sin valor. Para obtener más información, consulte el ejemplo de etiquetas de vídeo
|+ 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 este método para agregar la etiqueta de generación de imágenes a cada fragmento que desee etiquetar. Un nuevo fragmento comienza cuando putFrame se invoca con un marco que contiene la keyframe marca.
Si subes un vídeo pregrabado, es posible que se suba a una velocidad diferente a la velocidad a la que se grabó, en función de la velocidad de la red. Le recomendamos que utilice la marca de hora 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 utilizar las marcas de tiempo del servidor generadas en función de la velocidad a la que Amazon Kinesis Video Streams recibió su vídeo.
Para ver un ejemplo completo de este código, consulte el ejemplo de código en. VideoOnlyRealtimeStreamingSample
// 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 marcos de ejemplo se explican de la siguiente manera:
-
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 indique el principio del siguiente fotograma, hay que poner uneofrantes de añadir el siguiente fotograma a la secuencia. -
Coloque el fotograma actual en la secuencia.
-
Añade la etiqueta de generación de imágenes. El
putKinesisVideoEventMetadatamétodo se puede llamar en cualquier momento después de laputFrame(keyFrame)llamada y antes deputFrame(eofr). Solo se debe invocar como máximo una vez por fragmento. Dado que cada fragmento solo tendrá un fotograma clave, ahora lo denominamos por motivos de simplicidad. El valor devuelto porputKinesisVideoEventMetadatase comprueba para ver si hay un código de éxito (0). -
Agregue otros metadatos fragmentarios personalizados, que Kinesis Video Streams transformará en metadatos de objetos de Amazon S3.
-
Finalice el último fragmento de esta sesión de carga.
Uso de las muestras para añadir etiquetas de generación de imágenes
Puedes usarlo kvs_gstreamer_audio_video_sample en el SDK de C++ Producer si quieres una opción de línea de comandos para agregar etiquetas de generación de imágenes. Para habilitar esta función, agrega el -e both argumento -e image o, como se muestra en el siguiente ejemplo.
./kvs_gstreamer_audio_video_samplestream-name\ -fvideo-to-upload.mp4\ -e both
Para obtener más información sobre este ejemplo de aplicación, consulte Amazon Kinesis Video Streams CPP Producer, GStreamer Plugin y JNI README en.
Ruta del objeto de Amazon S3 (imagen)
La ruta del objeto de S3 describe la ubicación del bucket 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 deAWS_KINESISVIDEO_IMAGE_PREFIXsi está presente. -
AccountID- El Cuenta de AWS ID con el que se creó la transmisión. -
StreamName- Nombre de la transmisión a partir de la cual se genera la imagen. -
ImageTimecode- Código de tiempo 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
Recuperar los metadatos de la imagen
Puede usar la consola o la CLI de S3 para recuperar los metadatos de las imágenes generadas.
Kinesis Video Streams establece el número de fragmento, la marca de tiempo del productor y el servidor y los metadatos del tipo de contenido de la imagen generada, todos 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 head-object de la API de Amazon S3 para recuperar los metadatos del objeto. La respuesta incluye los metadatos creados por Kinesis Video Streams.
aws s3api head-object --bucketmy-bucket-name--key111122223333_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 limitaciones. Para obtener más información, consulte Límites de solicitudes de venta de prefijos de S3.
Los prefijos de Amazon S3 comienzan con un límite PUT de 3500 solicitudes PUT por segundo y irán aumentando gradualmente con el tiempo para establecer prefijos únicos. Evite utilizar fechas y horas como prefijos de Amazon S3. Los datos codificados por tiempo afectarán a un prefijo a la vez y también cambiarán con regularidad, lo que invalidará los escalamientos 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, a la URI de destino de Amazon S3. Por ejemplo, los prefijos de código hexadecimal dividirán naturalmente las solicitudes de forma aleatoria entre 16 prefijos diferentes (un prefijo para cada carácter hexadecimal único), lo que permitirá recibir 56 000 solicitudes PUT por segundo una vez que Amazon S3 haya escalado automáticamente.