View a markdown version of this page

Generazione automatica di immagini in tempo reale - Amazon Kinesis Video Streams

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Generazione automatica di immagini in tempo reale

Amazon Kinesis Video Streams offre la capacità di transcodificare e distribuire immagini. Kinesis Video Streams estrae automaticamente le immagini dai dati video in tempo reale e le invia al bucket Amazon S3 specificato. L'implementazione dell'estrazione automatica delle immagini in tempo reale prevede i seguenti passaggi:

  • Creazione di un bucket S3 per ricevere le immagini generate.

  • Configurazione della proprietà ImageGenerationConfiguration stream che indica a Kinesis Video Streams come creare le immagini e dove inviarle.

  • Aggiungere tag di generazione delle immagini: Kinesis Video Streams genera immagini solo utilizzando frammenti che hanno il tag di generazione delle immagini. Questi tag vengono aggiunti quando si carica un video utilizzando il Kinesis Video Streams Producer SDK insieme al metodo. putKinesisVideoEventMetadata

Le seguenti procedure forniscono le istruzioni per completare ognuno di questi passaggi.

Se utilizzi una chiave gestita dal cliente, assicurati che il ruolo che esegue le PutMedia chiamate (uploader) disponga delle seguenti autorizzazioni necessarie per crittografare e decrittografare i dati e per accedere al bucket Amazon S3.

  • kms:Encrypt

  • kms:GenerateDataKey

  • kms:Decrypt

  • s3:PutObject

Per ulteriori informazioni, consulta Come posso iniziare a usare la crittografia lato server?.

Per configurare la destinazione delle immagini generate
  1. Crea un bucket di destinazione S3 in cui verranno inviate le immagini.

    Segui la Guida per l'utente di Amazon S3 per creare un bucket Amazon S3.

    Annota l'URI del bucket, che ti servirà nella fase successiva dell'aggiornamento della configurazione di generazione delle immagini dello stream.

  2. Verifica di aver AWS CLI installato e configurato. Per ulteriori informazioni, consulta la Guida per AWS Command Line Interface l'utente per la versione 2.

  3. Create un nuovo file chiamato update-image-generation-input.json con il seguente contenuto come input. Aggiorna i valori segnaposto con i valori che desideri utilizzare. Per i valori massimi e minimi supportati, consulta l'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. Aggiorna la configurazione di generazione delle immagini dello stream utilizzando l'UpdateImageGenerationConfigurationAPI e allegando il file JSON come input, come mostrato nel comando seguente. Nota che il percorso del file punta al file nella directory corrente.

    aws kinesisvideo update-image-generation-configuration \ --cli-input-json file://./update-image-generation-input.json
  5. In caso di successo, viene restituita una risposta vuota e non viene stampato nulla nel terminale.

    Nota

    È necessario almeno 1 minuto per avviare il flusso di lavoro di generazione dell'immagine dopo l'aggiornamento della configurazione di generazione dell'immagine. Attendi almeno 1 minuto prima di caricare il video nel tuo stream.

  6. Verifica le impostazioni di configurazione. Usa AWS CLI per chiamare l'DescribeImageGenerationConfigurationAPI per il tuo stream.

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

Kinesis Video Streams genererà e distribuirà immagini solo per i frammenti che hanno il tag di generazione delle immagini. Tutti i metadati aggiuntivi dei frammenti forniti insieme ai tag di generazione delle immagini di Amazon S3 verranno salvati come metadati Amazon S3.

Nota

I tag di generazione di immagini si riferiscono ai tag di metadati dei frammenti e non ai tag a livello di stream.

Importante

I tag di generazione delle immagini vengono conteggiati ai fini del limite dei tag framment-metadati. Per ulteriori informazioni, consulta Quote dei servizi di metadati di streaming.

Di seguito è riportato un esempio di come appare la struttura dei tag di metadati dei frammenti utilizzando l'utilità. mkvinfo Il tag di generazione dell'immagine è un semplice tag MKV con una chiave di AWS_KINESISVIDEO_IMAGE_GENERATION e nessun valore. Per ulteriori informazioni, consulta Esempio di tag video nella documentazione di 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

Aggiungere tag di generazione di immagini ai frammenti

Kinesis Video Streams genera e fornisce immagini solo per i frammenti che hanno il tag di generazione delle immagini. Kinesis Video Streams riconosce questi tag MKV speciali e avvia il flusso di lavoro di generazione delle immagini in base alla configurazione di elaborazione delle immagini dello stream.

Quando si utilizza Kinesis Video Streams Producer SDK per caricare contenuti multimediali, si utilizza il putKinesisVideoEventMetadata metodo per aggiungere il tag di generazione dell'immagine a ciascun frammento a cui si desidera applicare il tag. Un nuovo frammento inizia quando putFrame viene richiamato con un frame contenente il flag. keyframe

Se stai caricando un video preregistrato, potrebbe essere caricato a una velocità diversa da quella con cui è stato registrato, a seconda della velocità della tua rete. Ti consigliamo di utilizzare il timestamp di Producer per configurare la generazione di immagini se desideri generare immagini a intervalli regolari in base ai timestamp originali del video e non utilizzare i timestamp del server generati in base alla frequenza con cui Amazon Kinesis Video Streams ha ricevuto il tuo video.

Per visualizzare un esempio completo di questo codice, consulta l'esempio di codice in. 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);

Gli elementi del codice di esempio per l'impostazione dei frame di esempio sono spiegati come segue:

  1. Ogni frammento deve terminare con la fine di fragment ()eofr. Questa dichiarazione dice che ogni volta che si riceve un nuovo fotogramma chiave, che indica l'inizio del fotogramma successivo, si inserisce un elemento eofr prima di aggiungere il fotogramma successivo allo stream.

  2. Inserisci il frame corrente nello stream.

  3. Aggiungi il tag di generazione dell'immagine. Il putKinesisVideoEventMetadata metodo può essere richiamato in qualsiasi momento dopo la putFrame(keyFrame) chiamata e prima delputFrame(eofr). Deve essere chiamato al massimo una volta per frammento. Poiché ogni frammento avrà un solo fotogramma chiave, in questo momento lo chiamiamo per semplicità. Il valore restituito per putKinesisVideoEventMetadata viene controllato per un codice di successo (0).

  4. Aggiungi altri metadati personalizzati dei frammenti, che Kinesis Video Streams trasformerà in metadati oggetto Amazon S3.

  5. Termina il frammento finale in questa sessione di caricamento.

Utilizzo degli esempi per aggiungere tag di generazione di immagini

È possibile utilizzare l'SDK kvs_gstreamer_audio_video_sample di C++ Producer se si desidera un'opzione della riga di comando per aggiungere tag di generazione di immagini. Attivate questa funzionalità aggiungendo l'-e bothargomento -e image or, come mostrato nell'esempio seguente.

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

Per ulteriori informazioni su questa applicazione di esempio, consulta Amazon Kinesis Video Streams CPP Producer, GStreamer Plugin e JNI README in. GitHub

Percorso dell'oggetto Amazon S3 (immagine)

Il percorso dell'oggetto S3 descrive la posizione nel bucket S3 configurato in cui verrà consegnata l'immagine generata. Utilizza il seguente formato:

ImagePrefix_AccountID_StreamName_ImageTimecode_RandomID.file-extension

Gli elementi del percorso dell'oggetto sono definiti come segue:

  • ImagePrefix- Valore di AWS_KINESISVIDEO_IMAGE_PREFIX se presente.

  • AccountID- L' Account AWS ID con cui viene creato lo stream.

  • StreamName- Nome dello stream da cui viene generata l'immagine.

  • ImageTimecode- Codice temporale dell'epoca (in millisecondi) nel frammento in cui viene generata l'immagine.

  • RandomID- GUID casuale.

  • file-extension- JPG o PNG in base al formato di immagine richiesto.

In questo esempio, il percorso dell'oggetto per le immagini generate sarà il seguente:

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

Recupero dei metadati delle immagini

È possibile utilizzare la console S3 o la CLI per recuperare i metadati per le immagini generate.

Kinesis Video Streams imposta il numero del frammento, il timestamp del produttore e del server e i metadati del tipo di contenuto dell'immagine generata, tutti formattati come metadati degli oggetti Amazon S3. Se sono presenti tag MKV aggiuntivi, tali tag verranno aggiunti anche come metadati degli oggetti Amazon S3. L'esempio seguente mostra come utilizzare il comando API head-object di Amazon S3 per recuperare i metadati dell'oggetto. La risposta include i metadati creati da 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" } }

Per ulteriori informazioni sui metadati degli oggetti S3, vedere. https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html

Raccomandazioni relative agli URI di Amazon S3 per la protezione dalla limitazione

Se scrivi migliaia di immagini su Amazon S3, c'è il rischio di limitazione. Per ulteriori informazioni, consulta S3 Prefix Put Request Limits.

Un prefisso Amazon S3 inizia con un limite PUT di 3.500 richieste PUT al secondo e aumenterà gradualmente nel tempo per ottenere prefissi univoci. Evita di utilizzare date e ore come prefissi di Amazon S3. I dati con codifica temporale influiranno su un prefisso alla volta e cambieranno regolarmente, invalidando le precedenti scalabilità dei prefissi.

Per consentire una scalabilità più rapida e coerente di Amazon S3, consigliamo di aggiungere un prefisso casuale, ad esempio un codice esadecimale o un UUID, all'URI di destinazione di Amazon S3. Ad esempio, i prefissi in codice esadecimale suddivideranno naturalmente le richieste in modo casuale tra 16 prefissi diversi (un prefisso per ogni carattere esadecimale univoco), il che consentirà 56.000 richieste PUT al secondo dopo il ridimensionamento automatico di Amazon S3.